improved notifications timeline

bug fixes
This commit is contained in:
Mariotaku Lee 2015-12-17 22:20:26 +08:00
parent 8bc4953e8f
commit 2b3e62fc65
128 changed files with 3271 additions and 1981 deletions

View File

@ -45,7 +45,7 @@ dependencies {
compile 'org.apache.commons:commons-lang3:3.4'
compile 'com.github.mariotaku.RestFu:library:0.9.8'
compile 'com.hannesdorfmann.parcelableplease:annotation:1.0.1'
compile 'com.github.mariotaku:SQLiteQB:88291f3a28'
compile 'com.github.mariotaku.SQLiteQB:library:0.9.2'
compile 'com.github.mariotaku.ObjectCursor:core:0.9.2'
compile fileTree(dir: 'libs', include: ['*.jar'])
}

View File

@ -27,6 +27,8 @@ import com.fasterxml.jackson.core.JsonToken;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Locale;
/**
* Created by mariotaku on 15/10/21.
@ -34,6 +36,7 @@ import java.text.ParseException;
public class Activity$$JsonObjectMapper extends JsonMapper<Activity> {
public static final Activity$$JsonObjectMapper INSTANCE = new Activity$$JsonObjectMapper();
private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
@SuppressWarnings("TryWithIdenticalCatches")
@Override
@ -67,7 +70,7 @@ public class Activity$$JsonObjectMapper extends JsonMapper<Activity> {
instance.rawAction = rawAction;
} else if ("created_at".equals(fieldName)) {
try {
instance.createdAt = Activity.DATE_FORMAT.parse(jsonParser.getValueAsString());
instance.createdAt = DATE_FORMAT.parse(jsonParser.getValueAsString());
} catch (ParseException e) {
throw new IOException(e);
}

View File

@ -23,7 +23,7 @@ import android.support.annotation.NonNull;
import com.bluelinelabs.logansquare.typeconverters.StringBasedTypeConverter;
import org.mariotaku.twidere.util.AbsLogger;
import org.apache.commons.lang3.StringUtils;
import java.text.SimpleDateFormat;
import java.util.Arrays;
@ -32,24 +32,6 @@ import java.util.Locale;
public class Activity extends TwitterResponseObject implements TwitterResponse, Comparable<Activity> {
public static final int ACTION_UNKNOWN = 0x00;
public static final int ACTION_FAVORITE = 0x01;
public static final int ACTION_FOLLOW = 0x02;
public static final int ACTION_MENTION = 0x03;
public static final int ACTION_REPLY = 0x04;
public static final int ACTION_RETWEET = 0x05;
public static final int ACTION_LIST_MEMBER_ADDED = 0x06;
public static final int ACTION_LIST_CREATED = 0x07;
public static final int ACTION_FAVORITED_RETWEET = 0x08;
public static final int ACTION_RETWEETED_RETWEET = 0x09;
public static final int ACTION_QUOTE = 0x0A;
public static final int ACTION_RETWEETED_MENTION = 0x0B;
public static final int ACTION_FAVORITED_MENTION = 0x0C;
public static final int ACTION_JOINED_TWITTER = 0x0D;
public static final int ACTION_MEDIA_TAGGED = 0x0E;
public static final int ACTION_FAVORITED_MEDIA_TAGGED = 0x0F;
public static final int ACTION_RETWEETED_MEDIA_TAGGED = 0x10;
static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
Action action;
String rawAction;
@ -179,63 +161,55 @@ public class Activity extends TwitterResponseObject implements TwitterResponse,
}
public enum Action {
FAVORITE(ACTION_FAVORITE),
FAVORITE("favorite"),
/**
* Sources: followers to targets (User)
* Targets: following user (User)
*/
FOLLOW(ACTION_FOLLOW),
FOLLOW("follow"),
/**
* Targets: mentioned users (User)
* Target objects: mention status (Status)
*/
MENTION(ACTION_MENTION),
MENTION("mention"),
/**
* Targets: reply status (Status)
* Target objects: in reply to status (Status)
*/
REPLY(ACTION_REPLY),
RETWEET(ACTION_RETWEET), LIST_MEMBER_ADDED(ACTION_LIST_MEMBER_ADDED), LIST_CREATED(ACTION_LIST_CREATED),
FAVORITED_RETWEET(ACTION_FAVORITED_RETWEET), RETWEETED_RETWEET(ACTION_RETWEETED_RETWEET),
REPLY("reply"),
RETWEET("retweet"),
LIST_MEMBER_ADDED("list_member_added"),
LIST_CREATED("list_created"),
FAVORITED_RETWEET("favorited_retweet"),
RETWEETED_RETWEET("retweeted_retweet"),
/**
* Targets: Quote result (Status)
* Target objects: Original status (Status)
*/
QUOTE(ACTION_QUOTE),
RETWEETED_MENTION(ACTION_RETWEETED_MENTION),
FAVORITED_MENTION(ACTION_FAVORITED_MENTION), JOINED_TWITTER(ACTION_JOINED_TWITTER),
MEDIA_TAGGED(ACTION_MEDIA_TAGGED), FAVORITED_MEDIA_TAGGED(ACTION_FAVORITED_MEDIA_TAGGED),
RETWEETED_MEDIA_TAGGED(ACTION_RETWEETED_MEDIA_TAGGED), UNKNOWN(ACTION_UNKNOWN);
QUOTE("quote"),
RETWEETED_MENTION("retweeted_mention"),
FAVORITED_MENTION("favorited_mention"),
JOINED_TWITTER("joined_twitter"),
MEDIA_TAGGED("media_tagged"),
FAVORITED_MEDIA_TAGGED("favorited_media_tagged"),
RETWEETED_MEDIA_TAGGED("retweeted_media_tagged"),
UNKNOWN(null);
private final int actionId;
public final String literal;
Action(final int action) {
actionId = action;
Action(final String literal) {
this.literal = literal;
}
public static Action parse(final String string) {
if ("favorite".equalsIgnoreCase(string)) return FAVORITE;
if ("follow".equalsIgnoreCase(string)) return FOLLOW;
if ("mention".equalsIgnoreCase(string)) return MENTION;
if ("reply".equalsIgnoreCase(string)) return REPLY;
if ("retweet".equalsIgnoreCase(string)) return RETWEET;
if ("list_member_added".equalsIgnoreCase(string)) return LIST_MEMBER_ADDED;
if ("list_created".equalsIgnoreCase(string)) return LIST_CREATED;
if ("favorited_retweet".equalsIgnoreCase(string)) return FAVORITED_RETWEET;
if ("retweeted_retweet".equalsIgnoreCase(string)) return RETWEETED_RETWEET;
if ("quote".equalsIgnoreCase(string)) return QUOTE;
if ("retweeted_mention".equalsIgnoreCase(string)) return RETWEETED_MENTION;
if ("favorited_mention".equalsIgnoreCase(string)) return FAVORITED_MENTION;
if ("joined_twitter".equalsIgnoreCase(string)) return JOINED_TWITTER;
if ("media_tagged".equalsIgnoreCase(string)) return MEDIA_TAGGED;
if ("favorited_media_tagged".equalsIgnoreCase(string)) return FAVORITED_MEDIA_TAGGED;
if ("retweeted_media_tagged".equalsIgnoreCase(string)) return RETWEETED_MEDIA_TAGGED;
AbsLogger.error("Unknown Twitter activity action " + string);
for (Action action : values()) {
if (StringUtils.equalsIgnoreCase(action.literal, string)) return action;
}
return UNKNOWN;
}
public int getActionId() {
return actionId;
public String getLiteral() {
return literal;
}
public static class Converter extends StringBasedTypeConverter<Action> {
@ -247,8 +221,8 @@ public class Activity extends TwitterResponseObject implements TwitterResponse,
@Override
public String convertToString(Action object) {
//TODO use better literal
return object.name().toLowerCase(Locale.US);
if (object == null) return null;
return object.literal;
}
}
}

View File

@ -33,7 +33,6 @@ import java.util.Map;
@JsonObject
public class CardEntity {
@JsonField(name = "name")
String name;
@ -74,6 +73,15 @@ public class CardEntity {
}
}
@Override
public String toString() {
return "CardEntity{" +
"name='" + name + '\'' +
", url='" + url + '\'' +
", bindingValues=" + bindingValues +
'}';
}
public interface BindingValue {
String TYPE_STRING = "STRING";
@ -104,6 +112,14 @@ public class CardEntity {
return url;
}
@Override
public String toString() {
return "ImageValue{" +
"width=" + width +
", height=" + height +
", url='" + url + '\'' +
'}';
}
}
public static class BooleanValue implements BindingValue {
@ -117,6 +133,13 @@ public class CardEntity {
public boolean getValue() {
return value;
}
@Override
public String toString() {
return "BooleanValue{" +
"value=" + value +
'}';
}
}
public static class StringValue implements BindingValue {
@ -129,6 +152,13 @@ public class CardEntity {
public String getValue() {
return value;
}
@Override
public String toString() {
return "StringValue{" +
"value='" + value + '\'' +
'}';
}
}
@JsonObject
@ -140,6 +170,13 @@ public class CardEntity {
public long getUserId() {
return userId;
}
@Override
public String toString() {
return "UserValue{" +
"userId=" + userId +
'}';
}
}
@JsonObject
@ -176,5 +213,15 @@ public class CardEntity {
return null;
}
@Override
public String toString() {
return "RawBindingValue{" +
"type='" + type + '\'' +
", booleanValue=" + booleanValue +
", stringValue='" + stringValue + '\'' +
", imageValue=" + imageValue +
", userValue=" + userValue +
'}';
}
}
}

View File

@ -29,6 +29,7 @@ import com.fasterxml.jackson.core.JsonToken;
import java.io.IOException;
@SuppressWarnings("unused")
public final class ResponseList$$JsonObjectMapper<T> extends JsonMapper<ResponseList<T>> {
private final JsonMapper<T> m84ClassJsonMapper;

View File

@ -25,6 +25,7 @@ import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject;
import com.bluelinelabs.logansquare.annotation.OnJsonParseComplete;
import org.apache.commons.lang3.builder.CompareToBuilder;
import org.mariotaku.twidere.api.twitter.util.TwitterDateConverter;
import java.io.IOException;
@ -113,11 +114,10 @@ public class Status extends TwitterResponseObject implements Comparable<Status>,
@JsonField(name = "possibly_sensitive")
boolean possiblySensitive;
private Status mThat;
public static void setQuotedStatus(Status status, Status quoted) {
if (!(status instanceof Status)) return;
((Status) status).quotedStatus = quoted;
if (status == null) return;
status.quotedStatus = quoted;
}
@ -285,7 +285,6 @@ public class Status extends TwitterResponseObject implements Comparable<Status>,
public int compareTo(@NonNull final Status that) {
mThat = that;
final long delta = id - that.getId();
if (delta < Integer.MIN_VALUE)
return Integer.MIN_VALUE;
@ -407,6 +406,10 @@ public class Status extends TwitterResponseObject implements Comparable<Status>,
if (id <= 0 || text == null) throw new IOException("Malformed Status object");
}
public String getLang() {
return lang;
}
@JsonObject
public static class CurrentUserRetweet {
@JsonField(name = "id")

View File

@ -71,7 +71,7 @@ public class TwitterConverter implements Converter {
try {
final ParameterizedType<T> parameterizedType = ParameterizedTypeTrojan.create(type);
final T parse = LoganSquare.parse(stream, parameterizedType);
if (TwitterException.class.equals(type) && parse == null) {
if (TwitterException.class == type && parse == null) {
throw new TwitterException();
}
return parse;

View File

@ -22,6 +22,7 @@ package org.mariotaku.twidere.model;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject;
@ -32,6 +33,7 @@ import org.mariotaku.library.objectcursor.annotation.CursorField;
import org.mariotaku.library.objectcursor.annotation.CursorObject;
import org.mariotaku.twidere.api.twitter.model.Activity;
import org.mariotaku.twidere.model.util.LoganSquareCursorFieldConverter;
import org.mariotaku.twidere.model.util.LongArrayConverter;
import org.mariotaku.twidere.provider.TwidereDataStore.Activities;
import java.util.Arrays;
@ -60,10 +62,12 @@ public class ParcelableActivity implements Comparable<ParcelableActivity>, Parce
@ParcelableThisPlease
@JsonField(name = "action")
@CursorField(value = Activities.ACTION)
public int action;
@JsonField(name = "raw_action")
@CursorField(value = Activities.RAW_ACTION)
public String raw_action;
public String action;
@ParcelableThisPlease
@JsonField(name = "source_ids")
@CursorField(value = Activities.SOURCE_IDS, converter = LongArrayConverter.class)
public long[] source_ids;
@ParcelableThisPlease
@JsonField(name = "sources")
@ -99,14 +103,17 @@ public class ParcelableActivity implements Comparable<ParcelableActivity>, Parce
@CursorField(value = Activities.IS_GAP)
public boolean is_gap;
public transient long[] filtered_source_ids;
public transient ParcelableUser[] filtered_sources;
public ParcelableActivity() {
}
public ParcelableActivity(final Activity activity, final long accountId, boolean isGap) {
this.account_id = accountId;
timestamp = activity.getCreatedAt().getTime();
action = activity.getAction().getActionId();
raw_action = activity.getRawAction();
action = activity.getRawAction();
max_position = activity.getMaxPosition();
min_position = activity.getMinPosition();
sources = ParcelableUser.fromUsers(activity.getSources(), accountId);
@ -116,9 +123,27 @@ public class ParcelableActivity implements Comparable<ParcelableActivity>, Parce
target_object_statuses = ParcelableStatus.fromStatuses(activity.getTargetObjectStatuses(), accountId);
target_object_user_lists = ParcelableUserList.fromUserLists(activity.getTargetObjectUserLists(), accountId);
target_object_users = ParcelableUser.fromUsers(activity.getTargetObjectUsers(), accountId);
if (sources != null) {
source_ids = new long[sources.length];
for (int i = 0; i < sources.length; i++) {
source_ids[i] = sources[i].id;
}
}
this.is_gap = isGap;
}
@Nullable
public static ParcelableStatus getActivityStatus(ParcelableActivity activity) {
if (Activity.Action.MENTION.literal.equals(activity.action)) {
return activity.target_object_statuses[0];
} else if (Activity.Action.REPLY.literal.equals(activity.action)) {
return activity.target_statuses[0];
} else if (Activity.Action.QUOTE.literal.equals(activity.action)) {
return activity.target_statuses[0];
}
return null;
}
@Override
public String toString() {
return "ParcelableActivity{" +
@ -127,7 +152,6 @@ public class ParcelableActivity implements Comparable<ParcelableActivity>, Parce
", max_position=" + max_position +
", min_position=" + min_position +
", action=" + action +
", raw_action='" + raw_action + '\'' +
", sources=" + Arrays.toString(sources) +
", target_users=" + Arrays.toString(target_users) +
", target_statuses=" + Arrays.toString(target_statuses) +
@ -176,4 +200,20 @@ public class ParcelableActivity implements Comparable<ParcelableActivity>, Parce
return new ParcelableActivity[size];
}
};
public ParcelableUser[] getUnfilteredSources() {
if (filtered_sources != null) return filtered_sources;
if (filtered_source_ids == null || sources.length == filtered_source_ids.length) {
return sources;
}
ParcelableUser[] result = new ParcelableUser[filtered_source_ids.length];
for (int i = 0; i < filtered_source_ids.length; i++) {
for (ParcelableUser user : sources) {
if (user.id == filtered_source_ids[i]) {
result[i] = user;
}
}
}
return filtered_sources = result;
}
}

View File

@ -45,6 +45,8 @@ public class ParcelableMedia implements Parcelable {
public static final int TYPE_ANIMATED_GIF = 3;
@MediaType
public static final int TYPE_CARD_ANIMATED_GIF = 4;
@MediaType
public static final int TYPE_EXTERNAL_PLAYER = 5;
public static final Parcelable.Creator<ParcelableMedia> CREATOR = new Parcelable.Creator<ParcelableMedia>() {
@Override
public ParcelableMedia createFromParcel(final Parcel in) {
@ -77,6 +79,8 @@ public class ParcelableMedia implements Parcelable {
public int height;
@JsonField(name = "video_info")
public VideoInfo video_info;
@JsonField(name = "card")
public ParcelableStatus.ParcelableCardEntity card;
public ParcelableMedia() {
@ -140,22 +144,37 @@ public class ParcelableMedia implements Parcelable {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ParcelableMedia that = (ParcelableMedia) o;
ParcelableMedia media = (ParcelableMedia) o;
if (end != that.end) return false;
if (start != that.start) return false;
if (type != that.type) return false;
if (!media_url.equals(that.media_url)) return false;
if (start != media.start) return false;
if (end != media.end) return false;
if (type != media.type) return false;
if (width != media.width) return false;
if (height != media.height) return false;
if (media_url != null ? !media_url.equals(media.media_url) : media.media_url != null)
return false;
if (page_url != null ? !page_url.equals(media.page_url) : media.page_url != null)
return false;
if (preview_url != null ? !preview_url.equals(media.preview_url) : media.preview_url != null)
return false;
if (video_info != null ? !video_info.equals(media.video_info) : media.video_info != null)
return false;
return !(card != null ? !card.equals(media.card) : media.card != null);
return true;
}
@Override
public int hashCode() {
int result = media_url.hashCode();
int result = media_url != null ? media_url.hashCode() : 0;
result = 31 * result + (page_url != null ? page_url.hashCode() : 0);
result = 31 * result + (preview_url != null ? preview_url.hashCode() : 0);
result = 31 * result + start;
result = 31 * result + end;
result = 31 * result + type;
result = 31 * result + width;
result = 31 * result + height;
result = 31 * result + (video_info != null ? video_info.hashCode() : 0);
result = 31 * result + (card != null ? card.hashCode() : 0);
return result;
}
@ -247,23 +266,55 @@ public class ParcelableMedia implements Parcelable {
if (card == null) return null;
final String name = card.getName();
if ("animated_gif".equals(name) || "player".equals(name)) {
final BindingValue player_stream_url = card.getBindingValue("player_stream_url");
if (!(player_stream_url instanceof StringValue))
final ParcelableMedia media = new ParcelableMedia();
final BindingValue playerStreamUrl = card.getBindingValue("player_stream_url");
media.card = ParcelableStatus.ParcelableCardEntity.fromCardEntity(card, -1);
if ("animated_gif".equals(name)) {
media.type = ParcelableMedia.TYPE_CARD_ANIMATED_GIF;
} else if (playerStreamUrl instanceof StringValue) {
media.media_url = ((StringValue) playerStreamUrl).getValue();
media.type = ParcelableMedia.TYPE_VIDEO;
} else {
media.type = ParcelableMedia.TYPE_EXTERNAL_PLAYER;
}
media.page_url = card.getUrl();
final BindingValue playerImage = card.getBindingValue("player_image");
if (playerImage instanceof ImageValue) {
media.preview_url = ((ImageValue) playerImage).getUrl();
media.width = ((ImageValue) playerImage).getWidth();
media.height = ((ImageValue) playerImage).getHeight();
}
final BindingValue playerWidth = card.getBindingValue("player_width");
final BindingValue playerHeight = card.getBindingValue("player_height");
if (playerWidth instanceof StringValue && playerHeight instanceof StringValue) {
media.width = NumberUtils.toInt(((StringValue) playerWidth).getValue(), -1);
media.height = NumberUtils.toInt(((StringValue) playerHeight).getValue(), -1);
}
if (entities != null) {
for (UrlEntity entity : entities) {
if (entity.getUrl().equals(media.page_url)) {
media.start = entity.getStart();
media.end = entity.getEnd();
break;
}
}
}
return new ParcelableMedia[]{media};
} else if ("summary_large_image".equals(name)) {
final BindingValue photoImageFullSize = card.getBindingValue("photo_image_full_size");
if (!(photoImageFullSize instanceof ImageValue))
return null;
final ParcelableMedia media = new ParcelableMedia();
media.type = ParcelableMedia.TYPE_CARD_ANIMATED_GIF;
media.media_url = ((StringValue) player_stream_url).getValue();
media.card = ParcelableStatus.ParcelableCardEntity.fromCardEntity(card, -1);
media.type = ParcelableMedia.TYPE_IMAGE;
media.media_url = ((ImageValue) photoImageFullSize).getUrl();
media.width = ((ImageValue) photoImageFullSize).getWidth();
media.height = ((ImageValue) photoImageFullSize).getHeight();
media.page_url = card.getUrl();
final BindingValue player_image = card.getBindingValue("player_image");
if (player_image instanceof ImageValue) {
media.preview_url = ((ImageValue) player_image).getUrl();
}
final BindingValue player_width = card.getBindingValue("player_width");
final BindingValue player_height = card.getBindingValue("player_height");
if (player_width instanceof StringValue && player_height instanceof StringValue) {
media.width = NumberUtils.toInt(((StringValue) player_width).getValue(), -1);
media.height = NumberUtils.toInt(((StringValue) player_height).getValue(), -1);
final BindingValue summaryPhotoImage = card.getBindingValue("summary_photo_image");
if (summaryPhotoImage instanceof ImageValue) {
media.preview_url = ((ImageValue) summaryPhotoImage).getUrl();
}
if (entities != null) {
for (UrlEntity entity : entities) {
@ -304,7 +355,8 @@ public class ParcelableMedia implements Parcelable {
return TYPE_UNKNOWN;
}
@IntDef({TYPE_UNKNOWN, TYPE_IMAGE, TYPE_VIDEO, TYPE_ANIMATED_GIF, TYPE_CARD_ANIMATED_GIF})
@IntDef({TYPE_UNKNOWN, TYPE_IMAGE, TYPE_VIDEO, TYPE_ANIMATED_GIF, TYPE_CARD_ANIMATED_GIF,
TYPE_EXTERNAL_PLAYER})
@Retention(RetentionPolicy.SOURCE)
public @interface MediaType {

View File

@ -61,7 +61,7 @@ import java.util.Map.Entry;
@CursorObject(valuesCreator = true)
@JsonObject
@ParcelablePlease
public class ParcelableStatus implements Parcelable, Comparable<ParcelableStatus> {
public class ParcelableStatus implements Parcelable, Comparable<ParcelableStatus>, Cloneable {
public static final Creator<ParcelableStatus> CREATOR = new Creator<ParcelableStatus>() {
public ParcelableStatus createFromParcel(Parcel source) {
ParcelableStatus target = new ParcelableStatus();
@ -254,6 +254,11 @@ public class ParcelableStatus implements Parcelable, Comparable<ParcelableStatus
@CursorField(Statuses.TEXT_PLAIN)
public String text_plain;
@ParcelableThisPlease
@JsonField(name = "lang")
@CursorField(Statuses.LANG)
public String lang;
@ParcelableThisPlease
@JsonField(name = "user_name")
@CursorField(Statuses.USER_NAME)
@ -363,62 +368,6 @@ public class ParcelableStatus implements Parcelable, Comparable<ParcelableStatus
ParcelableStatus() {
}
public ParcelableStatus(final ParcelableStatus orig, final long override_my_retweet_id,
final long override_retweet_count) {
id = orig.id;
account_id = orig.account_id;
timestamp = orig.timestamp;
user_id = orig.user_id;
retweet_id = orig.retweet_id;
retweet_timestamp = orig.retweet_timestamp;
retweeted_by_user_id = orig.retweeted_by_user_id;
retweet_count = override_retweet_count;
favorite_count = orig.favorite_count;
reply_count = orig.reply_count;
in_reply_to_status_id = orig.in_reply_to_status_id;
is_gap = orig.is_gap;
is_retweet = orig.is_retweet;
is_favorite = orig.is_favorite;
user_is_protected = orig.user_is_protected;
user_is_verified = orig.user_is_verified;
retweeted_by_user_name = orig.retweeted_by_user_name;
retweeted_by_user_screen_name = orig.retweeted_by_user_screen_name;
retweeted_by_user_profile_image = orig.retweeted_by_user_profile_image;
text_html = orig.text_html;
text_plain = orig.text_plain;
user_name = orig.user_name;
user_screen_name = orig.user_screen_name;
in_reply_to_screen_name = orig.in_reply_to_screen_name;
source = orig.source;
user_profile_image_url = orig.user_profile_image_url;
media = orig.media;
quoted_media = orig.quoted_media;
location = orig.location;
my_retweet_id = override_my_retweet_id;
is_possibly_sensitive = orig.is_possibly_sensitive;
user_is_following = orig.user_is_following;
text_unescaped = orig.text_unescaped;
in_reply_to_user_id = orig.in_reply_to_user_id;
in_reply_to_name = orig.in_reply_to_name;
mentions = orig.mentions;
card = orig.card;
place_full_name = orig.place_full_name;
is_quote = orig.is_quote;
quoted_id = orig.quoted_id;
quoted_timestamp = orig.quoted_timestamp;
quoted_user_id = orig.quoted_user_id;
quoted_user_name = orig.quoted_user_name;
quoted_user_screen_name = orig.quoted_user_screen_name;
quoted_user_profile_image = orig.quoted_user_profile_image;
quoted_text_html = orig.quoted_text_html;
quoted_text_plain = orig.quoted_text_plain;
quoted_text_unescaped = orig.quoted_text_unescaped;
quoted_source = orig.quoted_source;
quoted_user_is_protected = orig.quoted_user_is_protected;
quoted_user_is_verified = orig.quoted_user_is_verified;
card_name = card != null ? card.name : null;
}
public ParcelableStatus(final Status orig, final long account_id, final boolean is_gap) {
this.is_gap = is_gap;
this.account_id = account_id;
@ -491,6 +440,7 @@ public class ParcelableStatus implements Parcelable, Comparable<ParcelableStatus
card = ParcelableCardEntity.fromCardEntity(status.getCard(), account_id);
place_full_name = getPlaceFullName(status.getPlace());
card_name = card != null ? card.name : null;
lang = status.getLang();
}
@Nullable

View File

@ -55,8 +55,7 @@ public interface TwidereDataStore {
Uri CONTENT_URI_DATABASE_READY = Uri.withAppendedPath(BASE_CONTENT_URI,
CONTENT_PATH_DATABASE_READY);
Uri[] STATUSES_URIS = new Uri[]{Statuses.CONTENT_URI, Mentions.CONTENT_URI,
CachedStatuses.CONTENT_URI};
Uri[] STATUSES_URIS = new Uri[]{Statuses.CONTENT_URI, CachedStatuses.CONTENT_URI};
Uri[] CACHE_URIS = new Uri[]{CachedUsers.CONTENT_URI, CachedStatuses.CONTENT_URI,
CachedHashtags.CONTENT_URI, CachedTrends.Local.CONTENT_URI};
Uri[] DIRECT_MESSAGES_URIS = new Uri[]{DirectMessages.Inbox.CONTENT_URI,
@ -723,6 +722,8 @@ public interface TwidereDataStore {
*/
String TEXT_PLAIN = "text_plain";
String LANG = "lang";
String TEXT_UNESCAPED = "text_unescaped";
/**
@ -865,7 +866,7 @@ public interface TwidereDataStore {
QUOTED_USER_IS_VERIFIED, QUOTED_USER_IS_PROTECTED, MY_RETWEET_ID, IS_RETWEET,
IS_QUOTE, IS_FAVORITE, IS_PROTECTED, IS_VERIFIED, IS_FOLLOWING, IS_GAP,
IS_POSSIBLY_SENSITIVE, MEDIA_JSON, MENTIONS_JSON, QUOTED_MEDIA_JSON, CARD_NAME, CARD,
PLACE_FULL_NAME};
PLACE_FULL_NAME, LANG};
String[] TYPES = {TYPE_PRIMARY_KEY, TYPE_INT, TYPE_INT,
TYPE_INT, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT,
@ -875,7 +876,7 @@ public interface TwidereDataStore {
TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_INT, TYPE_BOOLEAN,
TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN,
TYPE_BOOLEAN, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT,
TYPE_TEXT, TYPE_TEXT};
TYPE_TEXT, TYPE_TEXT, TYPE_TEXT};
}
@ -885,6 +886,7 @@ public interface TwidereDataStore {
String ACTION = "action";
String RAW_ACTION = "raw_action";
String TIMESTAMP = "timestamp";
String STATUS_ID = "status_id";
String STATUS_USER_ID = "status_user_id";
String STATUS_RETWEETED_BY_USER_ID = "status_retweeted_by_user_id";
String STATUS_QUOTED_USER_ID = "status_quoted_user_id";
@ -898,6 +900,7 @@ public interface TwidereDataStore {
String MIN_POSITION = "min_position";
String MAX_POSITION = "max_position";
String SOURCES = "sources";
String SOURCE_IDS = "source_ids";
String TARGET_STATUSES = "target_statuses";
String TARGET_USERS = "target_users";
String TARGET_USER_LISTS = "target_user_lists";
@ -905,14 +908,14 @@ public interface TwidereDataStore {
String TARGET_OBJECT_USER_LISTS = "target_object_user_lists";
String TARGET_OBJECT_USERS = "target_object_users";
String[] COLUMNS = {_ID, ACCOUNT_ID, ACTION, RAW_ACTION, TIMESTAMP, STATUS_USER_ID,
String[] COLUMNS = {_ID, ACCOUNT_ID, ACTION, TIMESTAMP, STATUS_ID, STATUS_USER_ID,
STATUS_RETWEETED_BY_USER_ID, STATUS_QUOTED_USER_ID, STATUS_SOURCE, STATUS_QUOTE_SOURCE,
STATUS_TEXT_PLAIN, STATUS_QUOTE_TEXT_PLAIN, STATUS_TEXT_HTML, STATUS_QUOTE_TEXT_HTML,
IS_GAP, MIN_POSITION, MAX_POSITION, SOURCES, TARGET_STATUSES, TARGET_USERS,
IS_GAP, MIN_POSITION, MAX_POSITION, SOURCES, SOURCE_IDS, TARGET_STATUSES, TARGET_USERS,
TARGET_USER_LISTS, TARGET_OBJECT_STATUSES, TARGET_OBJECT_USER_LISTS, TARGET_OBJECT_USERS};
String[] TYPES = {TYPE_PRIMARY_KEY, TYPE_INT, TYPE_INT, TYPE_TEXT, TYPE_INT, TYPE_INT,
String[] TYPES = {TYPE_PRIMARY_KEY, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT,
TYPE_INT, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT,
TYPE_BOOLEAN, TYPE_INT, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT,
TYPE_BOOLEAN, TYPE_INT, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT,
TYPE_TEXT, TYPE_TEXT, TYPE_TEXT};
String DEFAULT_SORT_ORDER = TIMESTAMP + " DESC";

View File

@ -29,7 +29,6 @@ import org.json.JSONObject;
import org.mariotaku.twidere.TwidereConstants;
import org.mariotaku.twidere.api.twitter.auth.OAuthAuthorization;
import org.mariotaku.twidere.api.twitter.auth.OAuthToken;
import org.mariotaku.twidere.api.twitter.model.Activity;
import org.mariotaku.twidere.api.twitter.model.DirectMessage;
import org.mariotaku.twidere.api.twitter.model.Relationship;
import org.mariotaku.twidere.api.twitter.model.SavedSearch;
@ -279,58 +278,30 @@ public final class ContentValuesCreator implements TwidereConstants {
}
@NonNull
public static ContentValues createActivity(final Activity activity, final long accountId) {
final ContentValues values;
switch (activity.getAction()) {
case REPLY: {
values = createStatusActivity(activity.getTargetStatuses()[0]);
break;
}
case MENTION: {
values = createStatusActivity(activity.getTargetObjectStatuses()[0]);
break;
}
default: {
values = new ContentValues();
break;
}
public static ContentValues createActivity(final ParcelableActivity activity) {
final ContentValues values = new ContentValues();
final ParcelableStatus status = ParcelableActivity.getActivityStatus(activity);
if (status != null) {
createStatusActivity(status, values);
}
ParcelableActivityValuesCreator.writeTo(new ParcelableActivity(activity, accountId, false), values);
ParcelableActivityValuesCreator.writeTo(activity, values);
return values;
}
@NonNull
public static ContentValues createStatusActivity(final Status orig) {
if (orig == null) throw new NullPointerException();
final ContentValues values = new ContentValues();
final Status status;
if (orig.isRetweet()) {
final Status retweetedStatus = orig.getRetweetedStatus();
final User retweetUser = orig.getUser();
final long retweetedById = retweetUser.getId();
values.put(Activities.STATUS_RETWEETED_BY_USER_ID, retweetedById);
status = retweetedStatus;
} else if (orig.isQuote()) {
final Status quotedStatus = orig.getQuotedStatus();
final User quoteUser = orig.getUser();
final long quotedById = quoteUser.getId();
final String textHtml = TwitterContentUtils.formatStatusText(orig);
values.put(Activities.STATUS_QUOTE_TEXT_HTML, textHtml);
values.put(Activities.STATUS_QUOTE_TEXT_PLAIN, TwitterContentUtils.unescapeTwitterStatusText(orig.getText()));
values.put(Activities.STATUS_QUOTE_SOURCE, orig.getSource());
values.put(Activities.STATUS_QUOTED_USER_ID, quotedById);
status = quotedStatus;
} else {
status = orig;
public static void createStatusActivity(@NonNull final ParcelableStatus status,
@NonNull final ContentValues values) {
if (status.is_retweet) {
values.put(Activities.STATUS_RETWEETED_BY_USER_ID, status.retweeted_by_user_id);
} else if (status.is_quote) {
values.put(Activities.STATUS_QUOTE_TEXT_HTML, status.quoted_text_html);
values.put(Activities.STATUS_QUOTE_TEXT_PLAIN, status.quoted_text_plain);
values.put(Activities.STATUS_QUOTE_SOURCE, status.quoted_source);
values.put(Activities.STATUS_QUOTED_USER_ID, status.quoted_user_id);
}
final User user = status.getUser();
final long userId = user.getId();
values.put(Activities.STATUS_USER_ID, userId);
final String textHtml = TwitterContentUtils.formatStatusText(status);
values.put(Activities.STATUS_TEXT_HTML, textHtml);
values.put(Activities.STATUS_TEXT_PLAIN, TwitterContentUtils.unescapeTwitterStatusText(status.getText()));
values.put(Activities.STATUS_SOURCE, status.getSource());
return values;
values.put(Activities.STATUS_USER_ID, status.user_id);
values.put(Activities.STATUS_TEXT_HTML, status.text_html);
values.put(Activities.STATUS_TEXT_PLAIN, status.text_plain);
values.put(Activities.STATUS_SOURCE, status.source);
}

View File

@ -105,6 +105,7 @@ dependencies {
fdroidCompile 'org.osmdroid:osmdroid-android:5.0.1'
debugCompile 'com.facebook.stetho:stetho:1.2.0'
debugCompile 'com.facebook.stetho:stetho-okhttp:1.2.0'
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'
compile project(':twidere.component.common')
compile project(':twidere.component.nyan')
compile 'com.github.mariotaku.ObjectCursor:core:0.9.2'

View File

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?><!--
~ Twidere - Twitter client for Android
~
~ Copyright (C) 2012-2015 Mariotaku Lee <mariotaku.lee@gmail.com>
~
~ This program is free software: you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by
~ the Free Software Foundation, either version 3 of the License, or
~ (at your option) any later version.
~
~ This program is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
~ GNU General Public License for more details.
~
~ You should have received a copy of the GNU General Public License
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application>
<activity
android:name="com.squareup.leakcanary.internal.DisplayLeakActivity"
android:enabled="false"
android:icon="@drawable/__leak_canary_icon"
android:label="@string/__leak_canary_display_activity_label"
android:taskAffinity="com.squareup.leakcanary"
android:theme="@style/__LeakCanary.Base">
<intent-filter>
<action
android:name="android.intent.action.MAIN"
tools:node="remove"/>
<category
android:name="android.intent.category.LAUNCHER"
tools:node="remove"/>
</intent-filter>
</activity>
</application>
</manifest>

View File

@ -20,9 +20,12 @@
package org.mariotaku.twidere.util;
import android.app.Application;
import android.os.Build;
import com.facebook.stetho.Stetho;
import com.facebook.stetho.okhttp.StethoInterceptor;
import com.squareup.leakcanary.LeakCanary;
import com.squareup.leakcanary.RefWatcher;
import com.squareup.okhttp.Interceptor;
import com.squareup.okhttp.OkHttpClient;
@ -33,6 +36,8 @@ import java.util.List;
*/
public class DebugModeUtils {
private static RefWatcher sRefWatcher;
public static void initForHttpClient(final OkHttpClient client) {
final List<Interceptor> interceptors = client.networkInterceptors();
interceptors.add(new StethoInterceptor());
@ -43,5 +48,14 @@ public class DebugModeUtils {
.enableDumpapp(Stetho.defaultDumperPluginsProvider(application))
.enableWebKitInspector(Stetho.defaultInspectorModulesProvider(application))
.build());
// LeakCanary not working on Android Marshmallow, see https://github.com/square/leakcanary/issues/267
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
sRefWatcher = LeakCanary.install(application);
}
}
public static void watchReferenceLeak(final Object object) {
if (sRefWatcher == null) return;
sRefWatcher.watch(object);
}
}

View File

@ -1,64 +1,65 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
<manifest
package="org.mariotaku.twidere"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:installLocation="auto">
<uses-sdk />
<uses-sdk/>
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
android:required="false"/>
<uses-feature
android:name="android.hardware.location"
android:required="false" />
android:required="false"/>
<uses-feature
android:name="android.hardware.location.gps"
android:required="false" />
android:required="false"/>
<uses-feature
android:name="android.hardware.location.network"
android:required="false" />
android:required="false"/>
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false" />
android:required="false"/>
<uses-feature
android:name="android.hardware.nfc"
android:required="false" />
android:required="false"/>
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
android:required="true"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="org.mariotaku.twidere.permission.SHORTEN_STATUS" />
<uses-permission android:name="org.mariotaku.twidere.permission.UPLOAD_MEDIA" />
<uses-permission android:name="org.mariotaku.twidere.permission.SYNC_TIMELINE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.NFC"/>
<uses-permission android:name="org.mariotaku.twidere.permission.SHORTEN_STATUS"/>
<uses-permission android:name="org.mariotaku.twidere.permission.UPLOAD_MEDIA"/>
<uses-permission android:name="org.mariotaku.twidere.permission.SYNC_TIMELINE"/>
<permission-group
android:name="org.mariotaku.twidere.permission.PERMISSION_GROUP"
android:label="@string/app_name" />
android:label="@string/app_name"/>
<permission
android:name="org.mariotaku.twidere.permission.SHORTEN_STATUS"
android:description="@string/permission_description_shorten_status"
android:label="@string/permission_label_shorten_status"
android:permissionGroup="org.mariotaku.twidere.permission.PERMISSION_GROUP" />
android:permissionGroup="org.mariotaku.twidere.permission.PERMISSION_GROUP"/>
<permission
android:name="org.mariotaku.twidere.permission.UPLOAD_MEDIA"
android:description="@string/permission_description_upload_media"
android:label="@string/permission_label_upload_media"
android:permissionGroup="org.mariotaku.twidere.permission.PERMISSION_GROUP" />
android:permissionGroup="org.mariotaku.twidere.permission.PERMISSION_GROUP"/>
<permission
android:name="org.mariotaku.twidere.permission.SYNC_TIMELINE"
android:description="@string/permission_description_sync_timeline"
android:label="@string/permission_label_sync_timeline"
android:permissionGroup="org.mariotaku.twidere.permission.PERMISSION_GROUP" />
android:permissionGroup="org.mariotaku.twidere.permission.PERMISSION_GROUP"/>
<application
android:name=".app.TwidereApplication"
@ -74,29 +75,29 @@
tools:ignore="UnusedAttribute">
<uses-library
android:name="com.sec.android.app.multiwindow"
android:required="false" />
android:required="false"/>
<meta-data
android:name="com.google.android.backup.api_key"
android:value="AEdPqrEAAAAIKbKATV1AGbLB4kem3w8QaPVJSPVVumbMHxkfwA" />
android:value="AEdPqrEAAAAIKbKATV1AGbLB4kem3w8QaPVJSPVVumbMHxkfwA"/>
<meta-data
android:name="com.sec.android.support.multiwindow"
android:value="true" />
android:value="true"/>
<meta-data
android:name="com.sec.android.multiwindow.DEFAULT_SIZE_W"
android:value="480dp" />
android:value="480dp"/>
<meta-data
android:name="com.sec.android.multiwindow.DEFAULT_SIZE_H"
android:value="640dp" />
android:value="640dp"/>
<meta-data
android:name="com.sec.android.multiwindow.MINIMUM_SIZE_W"
android:value="240dp" />
android:value="240dp"/>
<meta-data
android:name="com.sec.android.multiwindow.MINIMUM_SIZE_H"
android:value="320dp" />
android:value="320dp"/>
<meta-data
android:name="override_tinted_status_bar_defaults"
android:value="true" />
android:value="true"/>
<activity
android:name=".activity.MainActivity"
@ -106,11 +107,11 @@
android:theme="@style/Theme.Launcher"
android:windowSoftInputMode="adjustNothing">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER"/>
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<activity
@ -122,11 +123,11 @@
android:theme="@style/Theme.Launcher"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER"/>
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<activity
@ -136,22 +137,22 @@
android:theme="@style/Theme.Twidere.Dark.NoActionBar"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="org.mariotaku.twidere.HOME" />
<action android:name="org.mariotaku.twidere.HOME"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
<action android:name="android.intent.action.SEARCH"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
android:resource="@xml/searchable"/>
<meta-data
android:name="android.app.default_searchable"
android:value=".activity.support.HomeActivity" />
android:value=".activity.support.HomeActivity"/>
</activity>
<activity
android:name=".activity.support.ComposeActivity"
@ -162,29 +163,29 @@
android:theme="@style/Theme.Twidere.Dark.Dialog"
android:windowSoftInputMode="adjustResize">
<intent-filter android:label="@string/compose">
<action android:name="android.intent.action.MAIN" />
<action android:name="org.mariotaku.twidere.COMPOSE" />
<action android:name="org.mariotaku.twidere.REPLY" />
<action android:name="org.mariotaku.twidere.QUOTE" />
<action android:name="org.mariotaku.twidere.EDIT_DRAFT" />
<action android:name="org.mariotaku.twidere.MENTION" />
<action android:name="org.mariotaku.twidere.REPLY_MULTIPLE" />
<action android:name="android.intent.action.MAIN"/>
<action android:name="org.mariotaku.twidere.COMPOSE"/>
<action android:name="org.mariotaku.twidere.REPLY"/>
<action android:name="org.mariotaku.twidere.QUOTE"/>
<action android:name="org.mariotaku.twidere.EDIT_DRAFT"/>
<action android:name="org.mariotaku.twidere.MENTION"/>
<action android:name="org.mariotaku.twidere.REPLY_MULTIPLE"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<intent-filter android:label="@string/app_name">
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.SEND_MULTIPLE" />
<action android:name="android.intent.action.SEND"/>
<action android:name="android.intent.action.SEND_MULTIPLE"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="image/*" />
<data android:mimeType="text/plain" />
<data android:mimeType="image/*"/>
<data android:mimeType="text/plain"/>
</intent-filter>
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.support.HomeActivity" />
android:value=".activity.support.HomeActivity"/>
</activity>
<activity
android:name=".activity.support.QuickSearchBarActivity"
@ -193,9 +194,9 @@
android:theme="@style/Theme.Twidere.Dark.Dialog"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="org.mariotaku.twidere.GLOBAL_SEARCH" />
<action android:name="org.mariotaku.twidere.GLOBAL_SEARCH"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<activity
@ -204,9 +205,9 @@
android:theme="@style/Theme.Twidere.Dark.DialogWhenLarge.NoActionBar"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="org.mariotaku.twidere.TWITTER_LOGIN" />
<action android:name="org.mariotaku.twidere.TWITTER_LOGIN"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<activity
@ -215,9 +216,9 @@
android:theme="@style/Theme.Twidere.Dark.Dialog"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="org.mariotaku.twidere.TWITTER_BROWSER_LOGIN" />
<action android:name="org.mariotaku.twidere.TWITTER_BROWSER_LOGIN"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<activity
@ -227,35 +228,35 @@
android:theme="@style/Theme.Twidere.Dark"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MANAGE_NETWORK_USAGE" />
<action android:name="org.mariotaku.twidere.SETTINGS" />
<action android:name="android.intent.action.MANAGE_NETWORK_USAGE"/>
<action android:name="org.mariotaku.twidere.SETTINGS"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.support.HomeActivity" />
android:value=".activity.support.HomeActivity"/>
</activity>
<activity
android:name=".activity.support.APIEditorActivity"
android:label="@string/edit_api"
android:theme="@style/Theme.Twidere.Dark.Dialog"
android:windowSoftInputMode="adjustResize" />
android:windowSoftInputMode="adjustResize"/>
<activity
android:name=".activity.support.AccountSelectorActivity"
android:label="@string/select_account"
android:theme="@style/Theme.Twidere.Dark.Dialog">
<intent-filter>
<action android:name="org.mariotaku.twidere.SELECT_ACCOUNT" />
<action android:name="org.mariotaku.twidere.SELECT_ACCOUNT"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<activity
android:name=".activity.support.ColorPickerDialogActivity"
android:label="@string/set_color"
android:theme="@style/Theme.Twidere.Dark.NoDisplay" />
android:theme="@style/Theme.Twidere.Dark.NoDisplay"/>
<activity
android:name=".activity.support.LinkHandlerActivity"
android:parentActivityName=".activity.support.HomeActivity"
@ -263,15 +264,15 @@
android:windowSoftInputMode="adjustResize">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.support.HomeActivity" />
android:value=".activity.support.HomeActivity"/>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="twidere" />
<data android:scheme="twidere"/>
</intent-filter>
</activity>
<activity
@ -282,14 +283,14 @@
android:launchMode="singleTop"
android:theme="@style/Theme.Twidere.Viewer">
<intent-filter>
<action android:name="org.mariotaku.twidere.VIEW_MEDIA" />
<action android:name="org.mariotaku.twidere.VIEW_MEDIA"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="http" />
<data android:scheme="https" />
<data android:scheme="file" />
<data android:scheme="http"/>
<data android:scheme="https"/>
<data android:scheme="file"/>
</intent-filter>
</activity>
<activity
@ -299,10 +300,10 @@
android:theme="@style/Theme.Twidere.Dark.NoDisplay"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="org.mariotaku.twidere.PICK_FILE" />
<action android:name="org.mariotaku.twidere.PICK_DIRECTORY" />
<action android:name="org.mariotaku.twidere.PICK_FILE"/>
<action android:name="org.mariotaku.twidere.PICK_DIRECTORY"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<activity
@ -311,11 +312,11 @@
android:theme="@style/Theme.Twidere.Dark.NoDisplay"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="org.mariotaku.twidere.PICK_IMAGE" />
<action android:name="org.mariotaku.twidere.TAKE_PHOTO" />
<action android:name="android.intent.action.MAIN"/>
<action android:name="org.mariotaku.twidere.PICK_IMAGE"/>
<action android:name="org.mariotaku.twidere.TAKE_PHOTO"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<activity
@ -325,10 +326,10 @@
android:theme="@style/Theme.Twidere.Dark.Dialog"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="org.mariotaku.twidere.ADD_TAB" />
<action android:name="org.mariotaku.twidere.EDIT_TAB" />
<action android:name="org.mariotaku.twidere.ADD_TAB"/>
<action android:name="org.mariotaku.twidere.EDIT_TAB"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<activity
@ -336,23 +337,23 @@
android:label="@string/compose"
android:theme="@style/Theme.Twidere.Dark.NoDisplay">
<intent-filter>
<action android:name="android.intent.action.CREATE_SHORTCUT" />
<action android:name="android.intent.action.CREATE_SHORTCUT"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<activity
android:name=".activity.CopyLinkActivity"
android:label="@string/copy_link"
android:theme="@style/Theme.Twidere.Dark.NoDisplay" />
android:theme="@style/Theme.Twidere.Dark.NoDisplay"/>
<activity
android:name=".activity.support.RequestPermissionsActivity"
android:label="@string/permissions_request"
android:theme="@style/Theme.Twidere.Dark.Dialog">
<intent-filter>
<action android:name="org.mariotaku.twidere.REQUEST_PERMISSIONS" />
<action android:name="org.mariotaku.twidere.REQUEST_PERMISSIONS"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<activity
@ -360,31 +361,31 @@
android:label="@string/select_user_list"
android:theme="@style/Theme.Twidere.Dark.Dialog">
<intent-filter>
<action android:name="org.mariotaku.twidere.SELECT_USER" />
<action android:name="org.mariotaku.twidere.SELECT_USER_LIST" />
<action android:name="org.mariotaku.twidere.SELECT_USER"/>
<action android:name="org.mariotaku.twidere.SELECT_USER_LIST"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<activity
android:name=".activity.SettingsWizardActivity"
android:label="@string/settings_wizard"
android:theme="@style/Theme.Twidere.Wizard" />
android:theme="@style/Theme.Twidere.Wizard"/>
<activity
android:name=".activity.support.DataExportActivity"
android:label="@string/export_settings"
android:theme="@style/Theme.Twidere.Dark.NoDisplay" />
android:theme="@style/Theme.Twidere.Dark.NoDisplay"/>
<activity
android:name=".activity.support.DataImportActivity"
android:label="@string/import_settings"
android:theme="@style/Theme.Twidere.Dark.NoDisplay" />
android:theme="@style/Theme.Twidere.Dark.NoDisplay"/>
<activity
android:name=".activity.support.ActivityPickerActivity"
android:theme="@style/Theme.Twidere.Dark.Dialog">
<intent-filter>
<action android:name="org.mariotaku.twidere.PICK_ACTIVITY" />
<action android:name="org.mariotaku.twidere.PICK_ACTIVITY"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<activity
@ -396,33 +397,33 @@
<data
android:host="twitter.com"
android:pathPrefix="/"
android:scheme="http" />
android:scheme="http"/>
<data
android:host="twitter.com"
android:pathPrefix="/"
android:scheme="https" />
android:scheme="https"/>
<data
android:host="www.twitter.com"
android:pathPrefix="/"
android:scheme="http" />
android:scheme="http"/>
<data
android:host="www.twitter.com"
android:pathPrefix="/"
android:scheme="https" />
android:scheme="https"/>
<data
android:host="mobile.twitter.com"
android:pathPrefix="/"
android:scheme="http" />
android:scheme="http"/>
<data
android:host="mobile.twitter.com"
android:pathPrefix="/"
android:scheme="https" />
android:scheme="https"/>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<action android:name="android.intent.action.VIEW"/>
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
</activity>
<activity
@ -432,18 +433,18 @@
android:taskAffinity=":twidere_assist_launcher"
android:theme="@style/Theme.Launcher">
<intent-filter>
<action android:name="android.intent.action.ASSIST" />
<action android:name="android.intent.action.ASSIST"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<meta-data
android:name="com.android.systemui.action_assist_icon"
android:resource="@drawable/ic_assist_twidere" />
android:resource="@drawable/ic_assist_twidere"/>
</activity>
<activity
android:name=".activity.KeyboardShortcutPreferenceCompatActivity"
android:theme="@style/Theme.Twidere.Dark.Dialog" />
android:theme="@style/Theme.Twidere.Dark.Dialog"/>
<activity
android:name=".activity.TestActivity"
android:enabled="false"
@ -451,35 +452,35 @@
android:launchMode="singleTop"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name=".activity.NyanActivity"
android:launchMode="singleTop"
android:theme="@style/Theme.Nyan"
android:windowSoftInputMode="stateAlwaysHidden" />
android:windowSoftInputMode="stateAlwaysHidden"/>
<activity
android:name=".activity.UsageStatisticsActivity"
android:label="@string/usage_statistics"
android:theme="@style/Theme.Twidere.Dark.NoDisplay" />
android:theme="@style/Theme.Twidere.Dark.NoDisplay"/>
<activity
android:name=".activity.ImageCropperActivity"
android:label="@string/crop_image"
android:theme="@style/Theme.Twidere.Dark.NoActionBar"
android:windowSoftInputMode="adjustResize" />
android:windowSoftInputMode="adjustResize"/>
<service
android:name=".service.RefreshService"
android:label="@string/label_refresh_service" />
android:label="@string/label_refresh_service"/>
<service
android:name=".service.StreamingService"
android:label="@string/label_streaming_service" />
android:label="@string/label_streaming_service"/>
<service
android:name=".service.BackgroundOperationService"
android:label="@string/label_background_operation_service" />
android:label="@string/label_background_operation_service"/>
<service
android:name=".nyan.NyanWallpaperService"
android:enabled="false"
@ -489,12 +490,12 @@
android:permission="android.permission.BIND_WALLPAPER"
android:process=":wallpaper">
<intent-filter android:priority="1">
<action android:name="android.service.wallpaper.WallpaperService" />
<action android:name="android.service.wallpaper.WallpaperService"/>
</intent-filter>
<meta-data
android:name="android.service.wallpaper"
android:resource="@xml/nyan_wallpaper" />
android:resource="@xml/nyan_wallpaper"/>
</service>
<service
android:name=".nyan.NyanDaydreamService"
@ -505,7 +506,7 @@
android:process=":daydream"
tools:ignore="ExportedService">
<intent-filter android:priority="1">
<action android:name="android.service.dreams.DreamService" />
<action android:name="android.service.dreams.DreamService"/>
</intent-filter>
</service>
@ -515,46 +516,46 @@
android:exported="true"
android:grantUriPermissions="true"
android:label="@string/label_data_provider"
tools:ignore="ExportedContentProvider" />
tools:ignore="ExportedContentProvider"/>
<provider
android:name=".provider.TwidereCommandProvider"
android:authorities="twidere.command"
android:exported="true"
tools:ignore="ExportedContentProvider" />
tools:ignore="ExportedContentProvider"/>
<provider
android:name=".provider.RecentSearchProvider"
android:authorities="org.mariotaku.twidere.provider.SearchRecentSuggestions"
tools:ignore="ExportedContentProvider" />
tools:ignore="ExportedContentProvider"/>
<receiver android:name=".receiver.ConnectivityStateReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
<receiver
android:name=".receiver.NotificationReceiver"
android:exported="false">
<intent-filter>
<action android:name="org.mariotaku.twidere.NOTIFICATION_DELETED" />
<action android:name="org.mariotaku.twidere.NOTIFICATION_DELETED"/>
</intent-filter>
</receiver>
<receiver
android:name=".receiver.SecretCodeBroadcastReceiver"
android:label="@string/twidere_test">
<intent-filter>
<action android:name="android.provider.Telephony.SECRET_CODE" />
<action android:name="android.provider.Telephony.SECRET_CODE"/>
<data
android:host="8943373"
android:scheme="android_secret_code" />
android:scheme="android_secret_code"/>
</intent-filter>
</receiver>
<receiver android:name=".receiver.PowerStateReceiver">
<intent-filter>
<action android:name="android.intent.action.BATTERY_LOW" />
<action android:name="android.intent.action.BATTERY_OKAY" />
<action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
<action android:name="android.intent.action.BATTERY_LOW"/>
<action android:name="android.intent.action.BATTERY_OKAY"/>
<action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
</intent-filter>
</receiver>

View File

@ -24,6 +24,8 @@ import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.View;
import java.lang.ref.WeakReference;
/**
* Created by mariotaku on 15/6/26.
*/
@ -51,13 +53,7 @@ public class LayeredCanvasView extends View {
}
notifySizeChanged();
final long delay = 1000 / fps;
post(mAnimateCallback = new Runnable() {
@Override
public void run() {
invalidate();
postDelayed(this, delay);
}
});
post(mAnimateCallback = new InvalidateRunnable(this, delay));
}
public Layer[] getLayers() {
@ -85,4 +81,25 @@ public class LayeredCanvasView extends View {
layer.onSizeChanged(width, height);
}
}
/**
* Created by mariotaku on 15/12/14.
*/
static class InvalidateRunnable implements Runnable {
private WeakReference<View> viewRef;
private final long delay;
public InvalidateRunnable(View view, long delay) {
viewRef = new WeakReference<>(view);
this.delay = delay;
}
@Override
public void run() {
final View view = viewRef.get();
if (view == null) return;
view.invalidate();
view.postDelayed(this, delay);
}
}
}

View File

@ -33,7 +33,7 @@ import static org.mariotaku.twidere.annotation.Preference.Type.STRING;
public interface Constants extends TwidereConstants {
String DATABASES_NAME = "twidere.sqlite";
int DATABASES_VERSION = 111;
int DATABASES_VERSION = 114;
int MENU_GROUP_STATUS_EXTENSION = 10;
int MENU_GROUP_COMPOSE_EXTENSION = 11;

View File

@ -117,6 +117,7 @@ import org.mariotaku.twidere.provider.TwidereDataStore.Drafts;
import org.mariotaku.twidere.text.MarkForDeleteSpan;
import org.mariotaku.twidere.util.AsyncTaskUtils;
import org.mariotaku.twidere.util.ContentValuesCreator;
import org.mariotaku.twidere.util.DataStoreUtils;
import org.mariotaku.twidere.util.EditTextEnterHandler;
import org.mariotaku.twidere.util.EditTextEnterHandler.EnterListener;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler;
@ -141,6 +142,7 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@ -148,8 +150,8 @@ import java.util.Collections;
import java.util.List;
import java.util.TreeSet;
public class ComposeActivity extends ThemedFragmentActivity implements LocationListener,
OnMenuItemClickListener, OnClickListener, OnLongClickListener, Callback {
public class ComposeActivity extends ThemedFragmentActivity implements OnMenuItemClickListener,
OnClickListener, OnLongClickListener, Callback {
// Constants
private static final String FAKE_IMAGE_LINK = "https://www.example.com/fake_image.jpg";
@ -166,6 +168,7 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL
private ContentResolver mResolver;
private AsyncTask<Object, Object, ?> mTask;
private SupportMenuInflater mMenuInflater;
private ItemTouchHelper mItemTouchHelper;
// Views
private RecyclerView mAttachedMediaPreview;
@ -200,7 +203,9 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL
private SetProgressVisibleRunnable mSetProgressVisibleRunnable;
private boolean mFragmentResumed;
private int mKeyMetaState;
private ItemTouchHelper mItemTouchHelper;
// Listeners
private LocationListener mLocationListener;
@Override
public int getThemeColor() {
@ -302,7 +307,7 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL
protected void onStop() {
saveAccountSelection();
try {
mLocationManager.removeUpdates(this);
mLocationManager.removeUpdates(mLocationListener);
} catch (SecurityException ignore) {
}
super.onStop();
@ -381,22 +386,34 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL
contentView.getPaddingRight(), contentView.getPaddingBottom());
}
@Override
public void onLocationChanged(final Location location) {
setRecentLocation(ParcelableLocation.fromLocation(location));
}
static class ComposeLocationListener implements LocationListener {
@Override
public void onStatusChanged(final String provider, final int status, final Bundle extras) {
private final WeakReference<ComposeActivity> mActivityRef;
}
ComposeLocationListener(ComposeActivity activity) {
mActivityRef = new WeakReference<>(activity);
}
@Override
public void onProviderEnabled(final String provider) {
}
@Override
public void onLocationChanged(final Location location) {
final ComposeActivity activity = mActivityRef.get();
if (activity == null) return;
activity.setRecentLocation(ParcelableLocation.fromLocation(location));
}
@Override
public void onStatusChanged(final String provider, final int status, final Bundle extras) {
}
@Override
public void onProviderEnabled(final String provider) {
}
@Override
public void onProviderDisabled(final String provider) {
}
@Override
public void onProviderDisabled(final String provider) {
}
@Override
@ -469,7 +486,7 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL
if (accountIds.length > 0) {
final long account_id = accountIds[0];
intent.putExtra(EXTRA_NAME, Utils.getAccountName(this, account_id));
intent.putExtra(EXTRA_SCREEN_NAME, Utils.getAccountScreenName(this, account_id));
intent.putExtra(EXTRA_SCREEN_NAME, DataStoreUtils.getAccountScreenName(this, account_id));
}
if (mInReplyToStatusId > 0) {
intent.putExtra(EXTRA_IN_REPLY_TO_ID, mInReplyToStatusId);
@ -594,6 +611,7 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
mLocationListener = new ComposeLocationListener(this);
mResolver = getContentResolver();
mValidator = new TwidereValidator(this);
setContentView(R.layout.activity_compose);
@ -948,7 +966,7 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL
private boolean handleMentionIntent(final ParcelableUser user) {
if (user == null || user.id <= 0) return false;
final String my_screen_name = Utils.getAccountScreenName(this, user.account_id);
final String my_screen_name = DataStoreUtils.getAccountScreenName(this, user.account_id);
if (TextUtils.isEmpty(my_screen_name)) return false;
mEditText.setText(String.format("@%s ", user.screen_name));
final int selection_end = mEditText.length();
@ -967,7 +985,7 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL
private boolean handleReplyIntent(final ParcelableStatus status) {
if (status == null || status.id <= 0) return false;
final String myScreenName = Utils.getAccountScreenName(this, status.account_id);
final String myScreenName = DataStoreUtils.getAccountScreenName(this, status.account_id);
if (TextUtils.isEmpty(myScreenName)) return false;
int selectionStart = 0;
mEditText.append("@" + status.user_screen_name + " ");
@ -978,8 +996,13 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL
if (status.is_retweet) {
mEditText.append("@" + status.retweeted_by_user_screen_name + " ");
}
if (status.is_quote) {
mEditText.append("@" + status.quoted_user_screen_name + " ");
}
final Collection<String> mentions = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
mentions.addAll(mExtractor.extractMentionedScreennames(status.text_plain));
mentions.addAll(mExtractor.extractMentionedScreennames(status.quoted_text_plain));
for (final String mention : mentions) {
if (mention.equalsIgnoreCase(status.user_screen_name) || mention.equalsIgnoreCase(myScreenName)
|| mention.equalsIgnoreCase(status.retweeted_by_user_screen_name)) {
@ -996,7 +1019,7 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL
private boolean handleReplyMultipleIntent(final String[] screenNames, final long accountId,
final long inReplyToStatusId) {
if (screenNames == null || screenNames.length == 0 || accountId <= 0) return false;
final String myScreenName = Utils.getAccountScreenName(this, accountId);
final String myScreenName = DataStoreUtils.getAccountScreenName(this, accountId);
if (TextUtils.isEmpty(myScreenName)) return false;
for (final String screenName : screenNames) {
if (screenName.equalsIgnoreCase(myScreenName)) {
@ -1175,7 +1198,7 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL
private boolean startLocationUpdateIfEnabled() {
final LocationManager lm = mLocationManager;
try {
lm.removeUpdates(this);
lm.removeUpdates(mLocationListener);
} catch (SecurityException ignore) {
}
final boolean attachLocation = mPreferences.getBoolean(KEY_ATTACH_LOCATION);
@ -1188,10 +1211,10 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL
if (provider != null) {
try {
mLocationText.setText(R.string.getting_location);
lm.requestLocationUpdates(provider, 0, 0, this);
lm.requestLocationUpdates(provider, 0, 0, mLocationListener);
final Location location = Utils.getCachedLocation(this);
if (location != null) {
onLocationChanged(location);
mLocationListener.onLocationChanged(location);
}
} catch (SecurityException e) {
return false;

View File

@ -81,11 +81,12 @@ import org.mariotaku.twidere.graphic.EmptyDrawable;
import org.mariotaku.twidere.model.ParcelableAccount;
import org.mariotaku.twidere.model.SupportTabSpec;
import org.mariotaku.twidere.provider.TwidereDataStore.Accounts;
import org.mariotaku.twidere.provider.TwidereDataStore.Mentions;
import org.mariotaku.twidere.provider.TwidereDataStore.Activities;
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses;
import org.mariotaku.twidere.service.StreamingService;
import org.mariotaku.twidere.util.AsyncTaskUtils;
import org.mariotaku.twidere.util.CustomTabUtils;
import org.mariotaku.twidere.util.DataStoreUtils;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback;
import org.mariotaku.twidere.util.MathUtils;
@ -164,7 +165,7 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
if (fragment instanceof AccountsDashboardFragment) {
return ((AccountsDashboardFragment) fragment).getActivatedAccountIds();
}
return Utils.getActivatedAccountIds(this);
return DataStoreUtils.getActivatedAccountIds(this);
}
@Override
@ -941,14 +942,14 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
final long[] accountIds = Utils.getAccountIds(spec.args);
final String tagWithAccounts = Utils.getReadPositionTagWithAccounts(mContext, true, spec.tag, accountIds);
final long position = mReadStateManager.getPosition(tagWithAccounts);
result.put(spec, Utils.getStatusesCount(mContext, Statuses.CONTENT_URI, position, accountIds));
result.put(spec, DataStoreUtils.getStatusesCount(mContext, Statuses.CONTENT_URI, position, accountIds));
break;
}
case TAB_TYPE_NOTIFICATIONS_TIMELINE: {
final long[] accountIds = Utils.getAccountIds(spec.args);
final String tagWithAccounts = Utils.getReadPositionTagWithAccounts(mContext, true, spec.tag, accountIds);
final long position = mReadStateManager.getPosition(tagWithAccounts);
result.put(spec, Utils.getStatusesCount(mContext, Mentions.CONTENT_URI, position, accountIds));
result.put(spec, DataStoreUtils.getActivitiesCount(mContext, Activities.AboutMe.CONTENT_URI, position, accountIds));
break;
}
case TAB_TYPE_DIRECT_MESSAGES: {

View File

@ -103,7 +103,7 @@ import org.mariotaku.twidere.view.iface.TintedStatusLayout;
import static android.text.TextUtils.isEmpty;
import static org.mariotaku.twidere.util.ContentValuesCreator.createAccount;
import static org.mariotaku.twidere.util.Utils.getActivatedAccountIds;
import static org.mariotaku.twidere.util.DataStoreUtils.getActivatedAccountIds;
import static org.mariotaku.twidere.util.Utils.getNonEmptyString;
import static org.mariotaku.twidere.util.Utils.isUserLoggedIn;
import static org.mariotaku.twidere.util.Utils.showErrorMessage;

View File

@ -59,7 +59,7 @@ import java.util.ArrayList;
import java.util.List;
import static android.text.TextUtils.isEmpty;
import static org.mariotaku.twidere.util.Utils.getAccountScreenName;
import static org.mariotaku.twidere.util.DataStoreUtils.getAccountScreenName;
public class UserListSelectorActivity extends BaseSupportDialogActivity implements OnClickListener, OnItemClickListener {

View File

@ -23,6 +23,7 @@ import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.util.Pair;
import android.support.v4.widget.Space;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.view.LayoutInflater;
@ -30,11 +31,13 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import org.apache.commons.collections.primitives.ArrayLongList;
import org.apache.commons.lang3.ArrayUtils;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.adapter.iface.IActivitiesAdapter;
import org.mariotaku.twidere.api.twitter.model.Activity;
import org.mariotaku.twidere.fragment.support.CursorActivitiesFragment;
import org.mariotaku.twidere.fragment.support.UserFragment;
import org.mariotaku.twidere.model.ParcelableActivity;
import org.mariotaku.twidere.model.ParcelableMedia;
@ -63,6 +66,7 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
public static final int ITEM_VIEW_TYPE_LOAD_INDICATOR = 2;
public static final int ITEM_VIEW_TYPE_TITLE_SUMMARY = 3;
public static final int ITEM_VIEW_TYPE_STATUS = 4;
public static final int ITEM_VIEW_TYPE_EMPTY = 5;
private final LayoutInflater mInflater;
private final MediaLoadingHandler mLoadingHandler;
@ -72,6 +76,8 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
private final DummyStatusHolderAdapter mStatusAdapterDelegate;
private ActivityAdapterListener mActivityAdapterListener;
private long[] mFilteredUserIds;
protected AbsActivitiesAdapter(final Context context, boolean compact) {
super(context);
mStatusAdapterDelegate = new DummyStatusHolderAdapter(context);
@ -94,7 +100,14 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
public abstract Data getData();
@Override
public abstract void setData(Data data);
public final void setData(Data data) {
if (data instanceof CursorActivitiesFragment.CursorActivitiesLoader.ActivityCursor) {
mFilteredUserIds = ((CursorActivitiesFragment.CursorActivitiesLoader.ActivityCursor) data).getFilteredUserIds();
}
onSetData(data);
}
protected abstract void onSetData(Data data);
@Override
public MediaLoadingHandler getMediaLoadingHandler() {
@ -156,12 +169,8 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
public void onUserProfileClick(IStatusViewHolder holder, int position) {
final Context context = getContext();
final ParcelableActivity activity = getActivity(position);
final ParcelableStatus status;
if (activity.action == Activity.ACTION_MENTION) {
status = activity.target_object_statuses[0];
} else {
status = activity.target_statuses[0];
}
final ParcelableStatus status = ParcelableActivity.getActivityStatus(activity);
assert status != null;
final View profileImageView = holder.getProfileImageView();
final View profileTypeView = holder.getProfileTypeView();
if (context instanceof FragmentActivity) {
@ -215,11 +224,17 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
final View view = mInflater.inflate(R.layout.card_item_load_indicator, parent, false);
return new LoadIndicatorViewHolder(view);
}
default: {
case ITEM_VIEW_TYPE_STUB: {
final View view = mInflater.inflate(R.layout.list_item_two_line, parent, false);
return new StubViewHolder(view);
}
case ITEM_VIEW_TYPE_EMPTY: {
final View view = new Space(getContext());
return new ViewHolder(view) {
};
}
}
throw new UnsupportedOperationException("Unsupported viewType " + viewType);
}
@Override
@ -227,18 +242,10 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
switch (getItemViewType(position)) {
case ITEM_VIEW_TYPE_STATUS: {
final ParcelableActivity activity = getActivity(position);
final ParcelableStatus status;
if (activity.action == Activity.ACTION_MENTION) {
status = activity.target_object_statuses[0];
} else if (activity.action == Activity.ACTION_REPLY) {
status = activity.target_statuses[0];
} else if (activity.action == Activity.ACTION_QUOTE) {
status = activity.target_statuses[0];
} else {
throw new UnsupportedOperationException();
}
final IStatusViewHolder IStatusViewHolder = (IStatusViewHolder) holder;
IStatusViewHolder.displayStatus(status, null, true, true);
final ParcelableStatus status = ParcelableActivity.getActivityStatus(activity);
assert status != null;
final IStatusViewHolder statusViewHolder = (IStatusViewHolder) holder;
statusViewHolder.displayStatus(status, true, true);
break;
}
case ITEM_VIEW_TYPE_TITLE_SUMMARY: {
@ -265,36 +272,44 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
} else if (isGapItem(position)) {
return ITEM_VIEW_TYPE_GAP;
}
switch (getActivityAction(position)) {
case Activity.ACTION_MENTION: {
if (ArrayUtils.isEmpty(activity.target_object_statuses)) {
return ITEM_VIEW_TYPE_STUB;
final String action = getActivityAction(position);
if (Activity.Action.MENTION.literal.equals(action)) {
if (ArrayUtils.isEmpty(activity.target_object_statuses)) {
return ITEM_VIEW_TYPE_STUB;
}
return ITEM_VIEW_TYPE_STATUS;
} else if (Activity.Action.REPLY.literal.equals(action)) {
if (ArrayUtils.isEmpty(activity.target_statuses)) {
return ITEM_VIEW_TYPE_STUB;
}
return ITEM_VIEW_TYPE_STATUS;
} else if (Activity.Action.QUOTE.literal.equals(action)) {
if (ArrayUtils.isEmpty(activity.target_statuses)) {
return ITEM_VIEW_TYPE_STUB;
}
return ITEM_VIEW_TYPE_STATUS;
} else if (Activity.Action.FOLLOW.literal.equals(action) || Activity.Action.FAVORITE.literal.equals(action)
|| Activity.Action.RETWEET.literal.equals(action) || Activity.Action.FAVORITED_RETWEET.literal.equals(action)
|| Activity.Action.RETWEETED_RETWEET.literal.equals(action) || Activity.Action.RETWEETED_MENTION.literal.equals(action)
|| Activity.Action.FAVORITED_MENTION.literal.equals(action) || Activity.Action.LIST_CREATED.literal.equals(action)
|| Activity.Action.LIST_MEMBER_ADDED.literal.equals(action)) {
if (activity.filtered_source_ids == null) {
if (!ArrayUtils.isEmpty(mFilteredUserIds)) {
ArrayLongList list = new ArrayLongList();
for (long id : ArrayUtils.nullToEmpty(activity.source_ids)) {
if (!ArrayUtils.contains(mFilteredUserIds, id)) {
list.add(id);
}
}
activity.filtered_source_ids = list.toArray();
} else {
activity.filtered_source_ids = activity.source_ids;
}
return ITEM_VIEW_TYPE_STATUS;
}
case Activity.ACTION_REPLY: {
if (ArrayUtils.isEmpty(activity.target_statuses)) {
return ITEM_VIEW_TYPE_STUB;
}
return ITEM_VIEW_TYPE_STATUS;
}
case Activity.ACTION_QUOTE: {
if (ArrayUtils.isEmpty(activity.target_statuses)) {
return ITEM_VIEW_TYPE_STUB;
}
return ITEM_VIEW_TYPE_STATUS;
}
case Activity.ACTION_FOLLOW:
case Activity.ACTION_FAVORITE:
case Activity.ACTION_RETWEET:
case Activity.ACTION_FAVORITED_RETWEET:
case Activity.ACTION_RETWEETED_RETWEET:
case Activity.ACTION_RETWEETED_MENTION:
case Activity.ACTION_FAVORITED_MENTION:
case Activity.ACTION_LIST_CREATED:
case Activity.ACTION_LIST_MEMBER_ADDED: {
return ITEM_VIEW_TYPE_TITLE_SUMMARY;
if (ArrayUtils.isEmpty(activity.filtered_source_ids)) {
return ITEM_VIEW_TYPE_EMPTY;
}
return ITEM_VIEW_TYPE_TITLE_SUMMARY;
}
return ITEM_VIEW_TYPE_STUB;
}
@ -331,7 +346,7 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
protected abstract void bindTitleSummaryViewHolder(ActivityTitleSummaryViewHolder holder, int position);
protected abstract int getActivityAction(int position);
protected abstract String getActivityAction(int position);
@Override
public boolean isMediaPreviewEnabled() {
@ -344,6 +359,18 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
mActivityAdapterListener.onActivityClick(holder, position);
}
@Override
public boolean shouldShowAccountsColor() {
return mStatusAdapterDelegate.shouldShowAccountsColor();
}
public void setShowAccountsColor(boolean showAccountsColor) {
mStatusAdapterDelegate.setShouldShowAccountsColor(showAccountsColor);
notifyDataSetChanged();
}
public interface ActivityAdapterListener {
void onGapClick(GapViewHolder holder, int position);
@ -371,7 +398,7 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
public void displayActivity(ParcelableActivity activity) {
text1.setText(text1.getResources().getString(R.string.unsupported_activity_action_title,
activity.raw_action));
activity.action));
text2.setText(R.string.unsupported_activity_action_summary);
}
}

View File

@ -46,7 +46,7 @@ public class ParcelableActivitiesAdapter extends AbsActivitiesAdapter<List<Parce
@Override
protected int getActivityAction(int position) {
protected String getActivityAction(int position) {
return mData.get(position).action;
}
@ -63,7 +63,7 @@ public class ParcelableActivitiesAdapter extends AbsActivitiesAdapter<List<Parce
}
@Override
public void setData(List<ParcelableActivity> data) {
protected void onSetData(List<ParcelableActivity> data) {
mData = data;
notifyDataSetChanged();
}

View File

@ -32,7 +32,6 @@ import com.commonsware.cwac.layouts.AspectLockedFrameLayout;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.adapter.iface.IStatusesAdapter;
import org.mariotaku.twidere.api.twitter.model.TranslationResult;
import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.util.MediaLoaderWrapper;
@ -96,14 +95,15 @@ public class StaggeredGridParcelableStatusesAdapter extends AbsParcelableStatuse
mediaTextView.setText(status.text_unescaped);
}
aspectRatioSource.setSize(firstMedia.width, firstMedia.height);
mediaImageContainer.setTag(firstMedia);
mediaImageContainer.requestLayout();
loader.displayProfileImage(mediaProfileImageView, status.user_profile_image_url);
loader.displayPreviewImageWithCredentials(mediaImageView, firstMedia.media_url,
loader.displayPreviewImageWithCredentials(mediaImageView, firstMedia.preview_url,
status.account_id, adapter.getMediaLoadingHandler());
}
@Override
public void displayStatus(@NonNull ParcelableStatus status, @Nullable TranslationResult translation, boolean displayInReplyTo, boolean shouldDisplayExtraType) {
public void displayStatus(@NonNull ParcelableStatus status, boolean displayInReplyTo, boolean shouldDisplayExtraType) {
displayStatus(status, displayInReplyTo);
}

View File

@ -42,4 +42,6 @@ public interface IActivitiesAdapter<Data> extends IContentCardAdapter, IGapSuppo
MediaLoadingHandler getMediaLoadingHandler();
boolean isMediaPreviewEnabled();
boolean shouldShowAccountsColor();
}

View File

@ -28,6 +28,7 @@ import android.content.SharedPreferences;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.app.TwidereApplication;
import org.mariotaku.twidere.util.DebugModeUtils;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler;
import org.mariotaku.twidere.util.dagger.ApplicationModule;
import org.mariotaku.twidere.util.dagger.DaggerGeneralComponent;
@ -85,4 +86,10 @@ public class BaseDialogFragment extends DialogFragment implements Constants {
if (activity == null) return;
activity.unregisterReceiver(receiver);
}
@Override
public void onDestroy() {
super.onDestroy();
DebugModeUtils.watchReferenceLeak(this);
}
}

View File

@ -29,6 +29,7 @@ import android.content.SharedPreferences;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.app.TwidereApplication;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.DebugModeUtils;
import org.mariotaku.twidere.util.SharedPreferencesWrapper;
import org.mariotaku.twidere.util.dagger.ApplicationModule;
import org.mariotaku.twidere.util.dagger.DaggerGeneralComponent;
@ -85,4 +86,10 @@ public class BaseFragment extends Fragment implements Constants {
if (activity == null) return;
activity.unregisterReceiver(receiver);
}
@Override
public void onDestroy() {
super.onDestroy();
DebugModeUtils.watchReferenceLeak(this);
}
}

View File

@ -157,7 +157,7 @@ public abstract class AbsActivitiesFragment<Data> extends AbsContentListRecycler
openActivity(activity);
return true;
}
final ParcelableStatus status = getActivityStatus(activity);
final ParcelableStatus status = ParcelableActivity.getActivityStatus(activity);
if (status == null) return false;
if (action == null) {
action = handler.getKeyAction(CONTEXT_TAG_STATUS, keyCode, event, metaState);
@ -189,7 +189,7 @@ public abstract class AbsActivitiesFragment<Data> extends AbsContentListRecycler
}
private void openActivity(ParcelableActivity activity) {
final ParcelableStatus status = getActivityStatus(activity);
final ParcelableStatus status = ParcelableActivity.getActivityStatus(activity);
if (status != null) {
Utils.openStatus(getContext(), status, null);
} else {
@ -312,7 +312,7 @@ public abstract class AbsActivitiesFragment<Data> extends AbsContentListRecycler
@Override
public void onMediaClick(IStatusViewHolder holder, View view, ParcelableMedia media, int position) {
final AbsActivitiesAdapter<Data> adapter = getAdapter();
final ParcelableStatus status = getActivityStatus(adapter.getActivity(position));
final ParcelableStatus status = ParcelableActivity.getActivityStatus(adapter.getActivity(position));
if (status == null) return;
final Bundle options = Utils.createMediaViewerActivityOption(view);
Utils.openMedia(getActivity(), status, media, options);
@ -360,21 +360,7 @@ public abstract class AbsActivitiesFragment<Data> extends AbsContentListRecycler
public void onActivityClick(ActivityTitleSummaryViewHolder holder, int position) {
final ParcelableActivity activity = getAdapter().getActivity(position);
if (activity == null) return;
switch (activity.action) {
case Activity.ACTION_FAVORITE:
case Activity.ACTION_FAVORITED_MEDIA_TAGGED:
case Activity.ACTION_FAVORITED_MENTION:
case Activity.ACTION_FAVORITED_RETWEET:
case Activity.ACTION_RETWEET:
case Activity.ACTION_RETWEETED_MEDIA_TAGGED:
case Activity.ACTION_RETWEETED_MENTION:
case Activity.ACTION_RETWEETED_RETWEET:
case Activity.ACTION_FOLLOW:
case Activity.ACTION_JOINED_TWITTER: {
Utils.openUsers(getActivity(), Arrays.asList(activity.sources));
break;
}
}
Utils.openUsers(getActivity(), Arrays.asList(activity.sources));
}
@Override
@ -391,23 +377,10 @@ public abstract class AbsActivitiesFragment<Data> extends AbsContentListRecycler
@Nullable
private ParcelableStatus getActivityStatus(int position) {
final AbsActivitiesAdapter<Data> adapter = getAdapter();
return getActivityStatus(adapter.getActivity(position));
return ParcelableActivity.getActivityStatus(adapter.getActivity(position));
}
@Nullable
private ParcelableStatus getActivityStatus(ParcelableActivity activity) {
switch (activity.action) {
case Activity.ACTION_MENTION:
return activity.target_object_statuses[0];
case Activity.ACTION_REPLY:
return activity.target_statuses[0];
case Activity.ACTION_QUOTE:
return activity.target_statuses[0];
}
return null;
}
// @Override
// @Override
// public boolean onStatusLongClick(IStatusViewHolder holder, int position) {
// //TODO handle long click event
// return true;
@ -550,10 +523,10 @@ public abstract class AbsActivitiesFragment<Data> extends AbsContentListRecycler
if (readPositionTag == null) return;
if (position == RecyclerView.NO_POSITION) return;
final AbsActivitiesAdapter<Data> adapter = getAdapter();
final ParcelableActivity status = adapter.getActivity(position);
if (status == null) return;
// mReadStateManager.setPosition(readPositionTag, status.id);
// mReadStateManager.setPosition(getCurrentReadPositionTag(), status.id, true);
final ParcelableActivity activity = adapter.getActivity(position);
if (activity == null) return;
mReadStateManager.setPosition(readPositionTag, activity.timestamp);
mReadStateManager.setPosition(getCurrentReadPositionTag(), activity.timestamp, true);
}
@NonNull
@ -578,13 +551,18 @@ public abstract class AbsActivitiesFragment<Data> extends AbsContentListRecycler
if (childPos == RecyclerView.NO_POSITION || childPos == adapter.getItemCount() - 1) {
return false;
}
if (adapter.getItemViewType(childPos) != AbsActivitiesAdapter.ITEM_VIEW_TYPE_STATUS) {
if (adapter.getItemViewType(childPos + 1) != AbsActivitiesAdapter.ITEM_VIEW_TYPE_STATUS) {
if (shouldUseDividerFor(adapter.getItemViewType(childPos))) {
if (shouldUseDividerFor(adapter.getItemViewType(childPos + 1))) {
return true;
}
}
return false;
}
private boolean shouldUseDividerFor(int itemViewType) {
return itemViewType != AbsActivitiesAdapter.ITEM_VIEW_TYPE_STATUS
&& itemViewType != AbsActivitiesAdapter.ITEM_VIEW_TYPE_EMPTY;
}
});
}

View File

@ -132,7 +132,17 @@ public abstract class AbsContentRecyclerViewFragment<A extends LoadMoreSupportAd
public void setControlVisible(boolean visible) {
final FragmentActivity activity = getActivity();
if (activity instanceof IControlBarActivity) {
((IControlBarActivity) activity).setControlBarVisibleAnimate(visible, this);
//TODO hide only if top > actionBar.height
final L manager = getLayoutManager();
if (manager.getChildCount() == 0) return;
final View firstView = manager.getChildAt(0);
final IControlBarActivity controlBarActivity = (IControlBarActivity) activity;
if (manager.getPosition(firstView) != 0) {
controlBarActivity.setControlBarVisibleAnimate(visible, this);
return;
}
final int top = firstView.getTop();
controlBarActivity.setControlBarVisibleAnimate(visible || top > 0, this);
}
}

View File

@ -91,6 +91,7 @@ import org.mariotaku.twidere.menu.support.AccountToggleProvider;
import org.mariotaku.twidere.model.ParcelableAccount;
import org.mariotaku.twidere.provider.TwidereDataStore.Accounts;
import org.mariotaku.twidere.util.CompareUtils;
import org.mariotaku.twidere.util.DataStoreUtils;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback;
import org.mariotaku.twidere.util.ListViewUtils;
@ -156,7 +157,7 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo
if (mAccountActionProvider != null) {
return mAccountActionProvider.getActivatedAccountIds();
}
return Utils.getActivatedAccountIds(getActivity());
return DataStoreUtils.getActivatedAccountIds(getActivity());
}
@Override

View File

@ -60,6 +60,11 @@ public class ActivitiesAboutMeFragment extends CursorActivitiesFragment {
setRefreshing(mTwitterWrapper.isMentionsTimelineRefreshing());
}
@Override
protected String getReadPositionTag() {
return "activities_about_me";
}
@Override
public boolean isRefreshing() {
return mTwitterWrapper.isMentionsTimelineRefreshing();

View File

@ -30,6 +30,7 @@ import android.support.v4.app.DialogFragment;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.app.TwidereApplication;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.DebugModeUtils;
import org.mariotaku.twidere.util.SharedPreferencesWrapper;
import org.mariotaku.twidere.util.UserColorNameManager;
import org.mariotaku.twidere.util.dagger.ApplicationModule;
@ -76,6 +77,12 @@ public class BaseSupportDialogFragment extends DialogFragment implements Constan
DaggerGeneralComponent.builder().applicationModule(ApplicationModule.get(context)).build().inject(this);
}
@Override
public void onDestroy() {
super.onDestroy();
DebugModeUtils.watchReferenceLeak(this);
}
public void registerReceiver(final BroadcastReceiver receiver, final IntentFilter filter) {
final Activity activity = getActivity();
if (activity == null) return;

View File

@ -45,6 +45,7 @@ import org.mariotaku.twidere.app.TwidereApplication;
import org.mariotaku.twidere.fragment.iface.IBaseFragment;
import org.mariotaku.twidere.util.AsyncTaskManager;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.DebugModeUtils;
import org.mariotaku.twidere.util.MediaLoaderWrapper;
import org.mariotaku.twidere.util.MultiSelectManager;
import org.mariotaku.twidere.util.NotificationManagerWrapper;
@ -197,6 +198,12 @@ public class BaseSupportFragment extends Fragment implements IBaseFragment, Cons
return inflater;
}
@Override
public void onDestroy() {
super.onDestroy();
DebugModeUtils.watchReferenceLeak(this);
}
public Context getThemedContext() {
return getActivity();
}

View File

@ -22,6 +22,7 @@ package org.mariotaku.twidere.fragment.support;
import android.content.ContentResolver;
import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
@ -33,6 +34,7 @@ import com.desmond.asyncmanager.AsyncManager;
import com.desmond.asyncmanager.TaskRunnable;
import com.squareup.otto.Subscribe;
import org.mariotaku.library.objectcursor.ObjectCursor;
import org.mariotaku.sqliteqb.library.Columns.Column;
import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.sqliteqb.library.RawItemArray;
@ -40,14 +42,13 @@ import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.HomeActivity;
import org.mariotaku.twidere.adapter.AbsActivitiesAdapter;
import org.mariotaku.twidere.adapter.ParcelableActivitiesAdapter;
import org.mariotaku.twidere.loader.ObjectCursorLoader;
import org.mariotaku.twidere.loader.support.ExtendedObjectCursorLoader;
import org.mariotaku.twidere.model.ParcelableActivity;
import org.mariotaku.twidere.model.ParcelableActivityCursorIndices;
import org.mariotaku.twidere.provider.TwidereDataStore.Accounts;
import org.mariotaku.twidere.provider.TwidereDataStore.Activities;
import org.mariotaku.twidere.provider.TwidereDataStore.Filters;
import org.mariotaku.twidere.util.DataStoreUtils;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.message.AccountChangedEvent;
import org.mariotaku.twidere.util.message.FavoriteCreatedEvent;
import org.mariotaku.twidere.util.message.FavoriteDestroyedEvent;
@ -58,7 +59,7 @@ import org.mariotaku.twidere.util.message.StatusRetweetedEvent;
import java.util.List;
import static org.mariotaku.twidere.util.Utils.getTableNameByUri;
import static org.mariotaku.twidere.util.DataStoreUtils.getTableNameByUri;
/**
* Created by mariotaku on 14/12/3.
@ -100,10 +101,10 @@ public abstract class CursorActivitiesFragment extends AbsActivitiesFragment<Lis
}
final String selection = processWhere(where).getSQL();
final AbsActivitiesAdapter<List<ParcelableActivity>> adapter = getAdapter();
// adapter.setShowAccountsColor(accountIds.length > 1);
adapter.setShowAccountsColor(accountIds.length > 1);
final String[] projection = Activities.COLUMNS;
return new ObjectCursorLoader<>(context, ParcelableActivityCursorIndices.class, uri, projection,
selection, null, sortOrder);
return new CursorActivitiesLoader(context, uri, projection, selection, null, sortOrder,
fromUser);
}
@Override
@ -121,7 +122,7 @@ public abstract class CursorActivitiesFragment extends AbsActivitiesFragment<Lis
if (activity instanceof HomeActivity) {
return ((HomeActivity) activity).getActivatedAccountIds();
}
return Utils.getActivatedAccountIds(getActivity());
return DataStoreUtils.getActivatedAccountIds(getActivity());
}
@Override
@ -215,7 +216,7 @@ public abstract class CursorActivitiesFragment extends AbsActivitiesFragment<Lis
protected Expression getFiltersWhere(String table) {
if (!isFilterEnabled()) return null;
return Utils.buildActivityFilterWhereClause(table, null);
return DataStoreUtils.buildActivityFilterWhereClause(table, null);
}
protected long[] getNewestActivityIds(long[] accountIds) {
@ -291,4 +292,30 @@ public abstract class CursorActivitiesFragment extends AbsActivitiesFragment<Lis
}
public static class CursorActivitiesLoader extends ExtendedObjectCursorLoader<ParcelableActivity> {
public CursorActivitiesLoader(Context context, Uri uri, String[] projection,
String selection, String[] selectionArgs, String sortOrder,
boolean fromUser) {
super(context, ParcelableActivityCursorIndices.class, uri, projection, selection, selectionArgs, sortOrder, fromUser);
}
@Override
protected ObjectCursor<ParcelableActivity> createObjectCursor(Cursor cursor, ObjectCursor.CursorIndices<ParcelableActivity> indices) {
return new ActivityCursor(cursor, indices, DataStoreUtils.getFilteredUserIds(getContext()));
}
public static class ActivityCursor extends ObjectCursor<ParcelableActivity> {
private final long[] filteredUserIds;
public ActivityCursor(Cursor cursor, CursorIndices<ParcelableActivity> indies, long[] filteredUserIds) {
super(cursor, indies);
this.filteredUserIds = filteredUserIds;
}
public long[] getFilteredUserIds() {
return filteredUserIds;
}
}
}
}

View File

@ -40,14 +40,13 @@ import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.HomeActivity;
import org.mariotaku.twidere.adapter.AbsStatusesAdapter;
import org.mariotaku.twidere.adapter.ListParcelableStatusesAdapter;
import org.mariotaku.twidere.loader.ObjectCursorLoader;
import org.mariotaku.twidere.loader.support.ExtendedObjectCursorLoader;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.ParcelableStatusCursorIndices;
import org.mariotaku.twidere.provider.TwidereDataStore.Accounts;
import org.mariotaku.twidere.provider.TwidereDataStore.Filters;
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses;
import org.mariotaku.twidere.util.DataStoreUtils;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.message.AccountChangedEvent;
import org.mariotaku.twidere.util.message.FavoriteCreatedEvent;
import org.mariotaku.twidere.util.message.FavoriteDestroyedEvent;
@ -58,10 +57,8 @@ import org.mariotaku.twidere.util.message.StatusRetweetedEvent;
import java.util.List;
import static org.mariotaku.twidere.util.Utils.buildStatusFilterWhereClause;
import static org.mariotaku.twidere.util.DataStoreUtils.getNewestStatusIdsFromDatabase;
import static org.mariotaku.twidere.util.DataStoreUtils.getOldestStatusIdsFromDatabase;
import static org.mariotaku.twidere.util.Utils.getTableNameByUri;
import static org.mariotaku.twidere.util.DataStoreUtils.buildStatusFilterWhereClause;
import static org.mariotaku.twidere.util.DataStoreUtils.getTableNameByUri;
/**
* Created by mariotaku on 14/12/3.
@ -105,8 +102,8 @@ public abstract class CursorStatusesFragment extends AbsStatusesFragment<List<Pa
final AbsStatusesAdapter<List<ParcelableStatus>> adapter = getAdapter();
adapter.setShowAccountsColor(accountIds.length > 1);
final String[] projection = Statuses.COLUMNS;
return new ObjectCursorLoader<>(context, ParcelableStatusCursorIndices.class, uri, projection,
selection, null, sortOrder);
return new ExtendedObjectCursorLoader<>(context, ParcelableStatusCursorIndices.class, uri,
projection, selection, null, sortOrder, fromUser);
}
@Override
@ -165,7 +162,7 @@ public abstract class CursorStatusesFragment extends AbsStatusesFragment<List<Pa
if (activity instanceof HomeActivity) {
return ((HomeActivity) activity).getActivatedAccountIds();
}
return Utils.getActivatedAccountIds(getActivity());
return DataStoreUtils.getActivatedAccountIds(getActivity());
}
@Override

View File

@ -220,7 +220,7 @@ public class DirectMessagesFragment extends AbsContentListRecyclerViewFragment<M
@Override
protected long[][] doInBackground(final Object... params) {
final long[][] result = new long[2][];
result[0] = Utils.getActivatedAccountIds(getActivity());
result[0] = DataStoreUtils.getActivatedAccountIds(getActivity());
result[1] = DataStoreUtils.getNewestMessageIdsFromDatabase(getActivity(), DirectMessages.Inbox.CONTENT_URI);
return result;
}
@ -320,7 +320,7 @@ public class DirectMessagesFragment extends AbsContentListRecyclerViewFragment<M
if (activity instanceof HomeActivity) {
return ((HomeActivity) activity).getActivatedAccountIds();
}
return Utils.getActivatedAccountIds(getActivity());
return DataStoreUtils.getActivatedAccountIds(getActivity());
}
protected void updateRefreshState() {
@ -354,7 +354,7 @@ public class DirectMessagesFragment extends AbsContentListRecyclerViewFragment<M
@Override
protected long[][] doInBackground(final Object... params) {
final long[][] result = new long[3][];
result[0] = Utils.getActivatedAccountIds(getActivity());
result[0] = DataStoreUtils.getActivatedAccountIds(getActivity());
result[1] = DataStoreUtils.getOldestMessageIdsFromDatabase(getActivity(), DirectMessages.Inbox.CONTENT_URI);
result[2] = DataStoreUtils.getOldestMessageIdsFromDatabase(getActivity(), DirectMessages.Outbox.CONTENT_URI);
return result;

View File

@ -55,7 +55,8 @@ public abstract class ParcelableStatusesFragment extends AbsStatusesFragment<Lis
if (status.id == statusId || status.retweet_id > 0 && status.retweet_id == statusId) {
dataToRemove.add(status);
} else if (status.my_retweet_id == statusId) {
list.set(i, new ParcelableStatus(status, -1, status.retweet_count - 1));
status.my_retweet_id = -1;
status.retweet_count = status.retweet_count - 1;
}
}
list.removeAll(dataToRemove);
@ -184,7 +185,8 @@ public abstract class ParcelableStatusesFragment extends AbsStatusesFragment<Lis
for (int i = 0, j = data.size(); i < j; i++) {
final ParcelableStatus orig = data.get(i);
if (orig.account_id == status.account_id && orig.id == status.retweet_id) {
data.set(i, new ParcelableStatus(orig, status.my_retweet_id, status.retweet_count));
orig.my_retweet_id = status.my_retweet_id;
orig.retweet_count = status.retweet_count;
}
}
setAdapterData(data);

View File

@ -115,7 +115,7 @@ public class RetweetQuoteDialogFragment extends BaseSupportDialogFragment implem
builder.setNeutralButton(R.string.quote, this);
builder.setNegativeButton(android.R.string.cancel, null);
holder.displayStatus(status, null, false, true);
holder.displayStatus(status, false, true);
view.findViewById(R.id.item_menu).setVisibility(View.GONE);
view.findViewById(R.id.action_buttons).setVisibility(View.GONE);

View File

@ -25,6 +25,7 @@ import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.Point;
@ -84,6 +85,7 @@ import org.mariotaku.twidere.adapter.iface.IStatusesAdapter;
import org.mariotaku.twidere.api.twitter.Twitter;
import org.mariotaku.twidere.api.twitter.TwitterException;
import org.mariotaku.twidere.api.twitter.model.Paging;
import org.mariotaku.twidere.api.twitter.model.TranslationResult;
import org.mariotaku.twidere.constant.IntentConstants;
import org.mariotaku.twidere.loader.support.ParcelableStatusLoader;
import org.mariotaku.twidere.loader.support.StatusRepliesLoader;
@ -165,6 +167,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
private LinearLayoutManager mLayoutManager;
private LoadConversationTask mLoadConversationTask;
private LoadTranslationTask mLoadTranslationTask;
private RecyclerViewNavigationHelper mNavigationHelper;
// Data fields
@ -603,19 +606,24 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
mRepliesLoaderInitialized = true;
}
private void restoreReadPosition(@Nullable Pair<Long, Integer> position) {
if (position == null) return;
// FIXME We don't know why we need to -1 here, but only -1 works.
final int adapterPosition = mStatusAdapter.findPositionById(position.first) - 1;
if (adapterPosition < 0) return;
//TODO maintain read position
mLayoutManager.scrollToPositionWithOffset(adapterPosition, position.second);
private void loadTranslation(@Nullable ParcelableStatus status) {
if (status == null) return;
if (AsyncTaskUtils.isTaskRunning(mLoadTranslationTask)) {
mLoadTranslationTask.cancel(true);
}
mLoadTranslationTask = new LoadTranslationTask(this);
AsyncTaskUtils.executeTask(mLoadTranslationTask, status);
}
private void displayTranslation(TranslationResult translation) {
mStatusAdapter.setTranslationResult(translation);
}
@Nullable
private Pair<Long, Integer> saveReadPosition() {
final int position = mLayoutManager.findFirstVisibleItemPosition();
if (position < 0) return null;
if (position == RecyclerView.NO_POSITION) return null;
final int itemType = mStatusAdapter.getItemType(position);
long itemId = mStatusAdapter.getItemId(position);
final View positionView;
@ -627,7 +635,15 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
} else {
positionView = mLayoutManager.findViewByPosition(position);
}
return new Pair<>(itemId, positionView != null ? positionView.getTop() : -1);
return new Pair<>(itemId, positionView != null ? positionView.getTop() : 0);
}
private void restoreReadPosition(@Nullable Pair<Long, Integer> position) {
if (position == null) return;
final int adapterPosition = mStatusAdapter.findPositionById(position.first);
if (adapterPosition < 0) return;
//TODO maintain read position
mLayoutManager.scrollToPositionWithOffset(adapterPosition, position.second);
}
private void setReplies(List<ParcelableStatus> data) {
@ -714,6 +730,54 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
}
}
static class LoadTranslationTask extends AsyncTask<ParcelableStatus, Object,
SingleResponse<TranslationResult>> {
final Context context;
final StatusFragment fragment;
LoadTranslationTask(final StatusFragment fragment) {
context = fragment.getActivity();
this.fragment = fragment;
}
@Override
protected SingleResponse<TranslationResult> doInBackground(ParcelableStatus... params) {
final ParcelableStatus status = params[0];
final Twitter twitter = TwitterAPIFactory.getTwitterInstance(context, status.account_id,
true);
final SharedPreferences prefs = context.getSharedPreferences(SHARED_PREFERENCES_NAME,
Context.MODE_PRIVATE);
if (twitter == null) return SingleResponse.getInstance();
try {
final String prefDest = prefs.getString(KEY_TRANSLATION_DESTINATION, null);
final String dest;
if (TextUtils.isEmpty(prefDest)) {
dest = twitter.getAccountSettings().getLanguage();
final SharedPreferences.Editor editor = prefs.edit();
editor.putString(KEY_TRANSLATION_DESTINATION, dest);
editor.apply();
} else {
dest = prefDest;
}
final long statusId = status.is_retweet ? status.retweet_id : status.id;
return SingleResponse.getInstance(twitter.showTranslation(statusId, dest));
} catch (final TwitterException e) {
return SingleResponse.getInstance(e);
}
}
@Override
protected void onPostExecute(SingleResponse<TranslationResult> result) {
if (result.hasData()) {
fragment.displayTranslation(result.getData());
} else if (result.hasException()) {
//TODO show translation error
Utils.showErrorMessage(context, R.string.translate, result.getException(), false);
}
}
}
static class LoadConversationTask extends AsyncTask<ParcelableStatus, ParcelableStatus,
ListResponse<ParcelableStatus>> {
@ -820,6 +884,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
private final CardMediaContainer mediaPreview;
private final View quotedNameContainer;
private final TextView translateLabelView;
private final ForegroundColorView quoteIndicator;
private final TextView locationView;
@ -827,6 +892,8 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
private final StatusLinkClickHandler linkClickHandler;
private final TwidereLinkify linkify;
private final TextView favoritesLabel;
private final View translateContainer;
private final TextView translateResultView;
public DetailStatusViewHolder(StatusAdapter adapter, View itemView) {
super(itemView);
@ -861,17 +928,23 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
quotedScreenNameView = (TextView) itemView.findViewById(R.id.quoted_screen_name);
quotedNameContainer = itemView.findViewById(R.id.quoted_name_container);
quoteIndicator = (ForegroundColorView) itemView.findViewById(R.id.quote_indicator);
translateLabelView = (TextView) itemView.findViewById(R.id.translate_label);
translateContainer = itemView.findViewById(R.id.translate_container);
translateResultView = (TextView) itemView.findViewById(R.id.translate_result);
setIsRecyclable(false);
initViews();
}
public void displayStatus(ParcelableStatus status, AsyncTwitterWrapper twitter) {
if (status == null) return;
public void displayStatus(@Nullable final ParcelableCredentials account,
@Nullable final ParcelableStatus status,
@Nullable final TranslationResult translation) {
if (account == null || status == null) return;
final StatusFragment fragment = adapter.getFragment();
final Context context = adapter.getContext();
final MediaLoaderWrapper loader = adapter.getMediaLoader();
final UserColorNameManager manager = adapter.getUserColorNameManager();
AsyncTwitterWrapper twitter = adapter.getTwitterWrapper();
final boolean nameFirst = adapter.isNameFirst();
linkClickHandler.setStatus(status);
@ -897,7 +970,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
quoteIndicator.setVisibility(View.VISIBLE);
quotedNameView.setText(manager.getUserNickname(status.quoted_user_id, status.quoted_user_name, false));
quotedScreenNameView.setText("@" + status.quoted_user_screen_name);
quotedScreenNameView.setText(String.format("@%s", status.quoted_user_screen_name));
final Spanned quotedText = HtmlSpanBuilder.fromHtml(status.quoted_text_html);
quotedTextView.setText(linkify.applyAllLinks(quotedText, status.account_id,
@ -923,7 +996,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
}
nameView.setText(manager.getUserNickname(status.user_id, status.user_name, false));
screenNameView.setText("@" + status.user_screen_name);
screenNameView.setText(String.format("@%s", status.user_screen_name));
loader.displayProfileImage(profileImageView, status.user_profile_image_url);
@ -1020,6 +1093,22 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
Utils.setMenuForStatus(context, fragment.mPreferences, menuBar.getMenu(), status,
adapter.getStatusAccount(), twitter);
final String lang = status.lang;
if (!Utils.isOfficialCredentials(context, account) || TextUtils.isEmpty(lang)) {
translateLabelView.setText(R.string.unknown_language);
translateContainer.setVisibility(View.GONE);
} else {
translateLabelView.setText(new Locale(lang).getDisplayLanguage());
translateContainer.setVisibility(View.VISIBLE);
if (translation != null) {
translateResultView.setVisibility(View.VISIBLE);
translateResultView.setText(translation.getText());
} else {
translateResultView.setVisibility(View.GONE);
}
}
textView.setTextIsSelectable(true);
quotedTextView.setTextIsSelectable(true);
@ -1087,6 +1176,10 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
case R.id.quote_original_link: {
Utils.openStatus(adapter.getContext(), status.account_id, status.quoted_id);
}
case R.id.translate_label: {
fragment.loadTranslation(adapter.getStatus());
break;
}
}
}
@ -1123,6 +1216,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
retweetedByView.setOnClickListener(this);
locationView.setOnClickListener(this);
quoteOriginalLink.setOnClickListener(this);
translateLabelView.setOnClickListener(this);
final float defaultTextSize = adapter.getTextSize();
nameView.setTextSize(defaultTextSize * 1.25f);
@ -1131,8 +1225,11 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
quotedTextView.setTextSize(defaultTextSize * 1.25f);
screenNameView.setTextSize(defaultTextSize * 0.85f);
quotedScreenNameView.setTextSize(defaultTextSize * 0.85f);
quoteOriginalLink.setTextSize(defaultTextSize * 0.85f);
locationView.setTextSize(defaultTextSize * 0.85f);
timeSourceView.setTextSize(defaultTextSize * 0.85f);
translateLabelView.setTextSize(defaultTextSize * 0.85f);
translateResultView.setTextSize(defaultTextSize * 1.05f);
mediaPreview.setStyle(adapter.getMediaPreviewStyle());
@ -1199,6 +1296,8 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
private StatusAdapterListener mStatusAdapterListener;
private RecyclerView mRecyclerView;
private CharSequence mReplyError;
private boolean mRepliesLoading, mConversationsLoading;
private TranslationResult mTranslationResult;
public StatusAdapter(StatusFragment fragment, boolean compact) {
super(fragment.getContext());
@ -1208,6 +1307,9 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
mItemCounts = new int[ITEM_TYPES_SUM];
// There's always a space at the end of the list
mItemCounts[ITEM_IDX_SPACE] = 1;
mItemCounts[ITEM_IDX_STATUS] = 1;
mItemCounts[ITEM_IDX_CONVERSATION_LOAD_MORE] = 1;
mItemCounts[ITEM_IDX_REPLY_LOAD_MORE] = 1;
mFragment = fragment;
mInflater = LayoutInflater.from(context);
mMediaLoadingHandler = new MediaLoadingHandler(R.id.media_preview_progress);
@ -1490,7 +1592,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
case VIEW_TYPE_DETAIL_STATUS: {
final ParcelableStatus status = getStatus(position);
final DetailStatusViewHolder detailHolder = (DetailStatusViewHolder) holder;
detailHolder.displayStatus(status, mTwitterWrapper);
detailHolder.displayStatus(getStatusAccount(), status, getTranslationResult());
break;
}
case VIEW_TYPE_LIST_STATUS: {
@ -1508,9 +1610,31 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
errorHolder.showError(mReplyError);
break;
}
case VIEW_TYPE_CONVERSATION_LOAD_INDICATOR: {
LoadIndicatorViewHolder indicatorHolder = ((LoadIndicatorViewHolder) holder);
indicatorHolder.setLoadProgressVisible(mConversationsLoading);
break;
}
case VIEW_TYPE_REPLIES_LOAD_INDICATOR: {
LoadIndicatorViewHolder indicatorHolder = ((LoadIndicatorViewHolder) holder);
indicatorHolder.setLoadProgressVisible(mRepliesLoading);
break;
}
}
}
private TranslationResult getTranslationResult() {
return mTranslationResult;
}
public void setTranslationResult(TranslationResult translation) {
if (mStatus == null || (translation != null && mStatus.id != translation.getId())) {
return;
}
mTranslationResult = translation;
notifyDataSetChanged();
}
@Override
public int getItemViewType(int position) {
return getItemViewTypeByItemType(getItemType(position));
@ -1566,6 +1690,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
@Override
public int getItemCount() {
if (mStatus == null) return 0;
return MathUtils.sum(mItemCounts);
}
@ -1661,7 +1786,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
final ParcelableStatus old = mStatus;
mStatus = status;
mStatusAccount = credentials;
setCount(ITEM_IDX_STATUS, status != null ? 1 : 0);
notifyDataSetChanged();
updateItemDecoration();
return !CompareUtils.objectEquals(old, status);
}
@ -1679,12 +1804,14 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
}
public void setRepliesLoading(boolean loading) {
setCount(ITEM_IDX_REPLY_LOAD_MORE, loading ? 1 : 0);
mRepliesLoading = loading;
notifyItemChanged(getFirstPositionOfItem(ITEM_IDX_REPLY_LOAD_MORE));
updateItemDecoration();
}
public void setConversationsLoading(boolean loading) {
setCount(ITEM_IDX_CONVERSATION_LOAD_MORE, loading ? 1 : 0);
mConversationsLoading = loading;
notifyItemChanged(getFirstPositionOfItem(ITEM_IDX_CONVERSATION_LOAD_MORE));
updateItemDecoration();
}

View File

@ -1,188 +0,0 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.fragment.support;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.AsyncTaskLoader;
import android.support.v4.content.Loader;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.api.twitter.Twitter;
import org.mariotaku.twidere.api.twitter.TwitterException;
import org.mariotaku.twidere.api.twitter.model.TranslationResult;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.SingleResponse;
import org.mariotaku.twidere.util.TwitterAPIFactory;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.view.holder.StatusViewHolder;
import org.mariotaku.twidere.view.holder.StatusViewHolder.DummyStatusHolderAdapter;
import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder;
public class StatusTranslateDialogFragment extends BaseSupportDialogFragment implements
LoaderCallbacks<SingleResponse<TranslationResult>> {
private IStatusViewHolder mHolder;
private View mProgress;
private TextView mMessageView;
private View mProgressContainer;
private View mStatusContainer;
public StatusTranslateDialogFragment() {
setStyle(STYLE_NO_TITLE, 0);
}
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
final Bundle args = getArguments();
if (args == null || args.getParcelable(EXTRA_STATUS) == null) {
dismiss();
return;
}
DummyStatusHolderAdapter adapter = new DummyStatusHolderAdapter(getActivity());
mHolder = new StatusViewHolder(adapter, mStatusContainer);
getLoaderManager().initLoader(0, args, this);
}
@Override
public Loader<SingleResponse<TranslationResult>> onCreateLoader(final int id, final Bundle args) {
final ParcelableStatus status = args.getParcelable(EXTRA_STATUS);
mStatusContainer.setVisibility(View.GONE);
mProgressContainer.setVisibility(View.VISIBLE);
mProgress.setVisibility(View.VISIBLE);
mMessageView.setVisibility(View.VISIBLE);
mMessageView.setText(R.string.please_wait);
final long statusId;
if (status.is_retweet) {
statusId = status.retweet_id;
} else {
statusId = status.id;
}
return new TranslationResultLoader(getActivity(), status.account_id, statusId);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mProgressContainer = view.findViewById(R.id.progress_container);
mProgress = mProgressContainer.findViewById(R.id.load_progress);
mMessageView = (TextView) mProgressContainer.findViewById(android.R.id.message);
mStatusContainer = view.findViewById(R.id.status_container);
}
@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup parent, final Bundle savedInstanceState) {
return inflater.inflate(R.layout.dialog_translate_status, parent, false);
}
@Override
public void onLoaderReset(final Loader<SingleResponse<TranslationResult>> loader) {
}
@Override
public void onLoadFinished(final Loader<SingleResponse<TranslationResult>> loader,
final SingleResponse<TranslationResult> data) {
final Bundle args = getArguments();
final ParcelableStatus status = args.getParcelable(EXTRA_STATUS);
if (status != null && data.getData() != null) {
displayTranslatedStatus(status, data.getData());
mStatusContainer.setVisibility(View.VISIBLE);
mProgressContainer.setVisibility(View.GONE);
} else {
mStatusContainer.setVisibility(View.GONE);
mProgressContainer.setVisibility(View.VISIBLE);
mProgress.setVisibility(View.GONE);
mMessageView.setVisibility(View.VISIBLE);
mMessageView.setText(Utils.getErrorMessage(getActivity(), data.getException()));
}
}
private void displayTranslatedStatus(final ParcelableStatus status, final TranslationResult translated) {
if (status == null || translated == null) return;
mHolder.displayStatus(status, translated, false, true);
mStatusContainer.findViewById(R.id.item_menu).setVisibility(View.GONE);
mStatusContainer.findViewById(R.id.action_buttons).setVisibility(View.GONE);
mStatusContainer.findViewById(R.id.reply_retweet_status).setVisibility(View.GONE);
}
public static void show(final FragmentManager fm, final ParcelableStatus status) {
final StatusTranslateDialogFragment df = new StatusTranslateDialogFragment();
final Bundle args = new Bundle();
args.putParcelable(EXTRA_STATUS, status);
df.setArguments(args);
df.show(fm, "translate_status");
}
public static final class TranslationResultLoader extends AsyncTaskLoader<SingleResponse<TranslationResult>> {
private final long mAccountId;
private final long mStatusId;
public TranslationResultLoader(final Context context, final long accountId, final long statusId) {
super(context);
mAccountId = accountId;
mStatusId = statusId;
}
@Override
public SingleResponse<TranslationResult> loadInBackground() {
final Context context = getContext();
final Twitter twitter = TwitterAPIFactory.getTwitterInstance(context, mAccountId, false);
final SharedPreferences prefs = context.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
if (twitter == null) return SingleResponse.getInstance();
try {
final String prefDest = prefs.getString(KEY_TRANSLATION_DESTINATION, null);
final String dest;
if (TextUtils.isEmpty(prefDest)) {
dest = twitter.getAccountSettings().getLanguage();
final Editor editor = prefs.edit();
editor.putString(KEY_TRANSLATION_DESTINATION, dest);
editor.apply();
} else {
dest = prefDest;
}
return SingleResponse.getInstance(twitter.showTranslation(mStatusId, dest));
} catch (final TwitterException e) {
return SingleResponse.getInstance(e);
}
}
@Override
protected void onStartLoading() {
forceLoad();
}
}
}

View File

@ -29,7 +29,7 @@ import android.support.v4.app.FragmentActivity;
/**
* Created by mariotaku on 14-6-24.
*/
public class SupportMessageDialogFragment extends DialogFragment {
public class SupportMessageDialogFragment extends BaseSupportDialogFragment {
private static final String EXTRA_MESSAGE = "message";
public static SupportMessageDialogFragment show(FragmentActivity activity, String message, String tag) {

View File

@ -40,7 +40,7 @@ import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.message.TaskStateChangedEvent;
import static org.mariotaku.twidere.util.Utils.getDefaultAccountId;
import static org.mariotaku.twidere.util.Utils.getTableNameByUri;
import static org.mariotaku.twidere.util.DataStoreUtils.getTableNameByUri;
import static org.mariotaku.twidere.util.Utils.openTweetSearch;
public class TrendsSuggestionsFragment extends AbsContentListViewFragment<TrendsAdapter>

View File

@ -28,7 +28,7 @@ import android.os.Bundle;
import org.mariotaku.twidere.loader.support.CursorSupportUsersLoader;
import org.mariotaku.twidere.loader.support.UserFollowersLoader;
import static org.mariotaku.twidere.util.Utils.getAccountScreenName;
import static org.mariotaku.twidere.util.DataStoreUtils.getAccountScreenName;
public class UserFollowersFragment extends CursorSupportUsersListFragment {

View File

@ -116,6 +116,7 @@ import org.mariotaku.twidere.provider.TwidereDataStore.CachedUsers;
import org.mariotaku.twidere.provider.TwidereDataStore.Filters;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.ContentValuesCreator;
import org.mariotaku.twidere.util.DataStoreUtils;
import org.mariotaku.twidere.util.HtmlSpanBuilder;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback;
@ -257,11 +258,9 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
} else if (relationship != null) {
mFollowButton.setEnabled(!relationship.isSourceBlockedByTarget());
if (relationship.isSourceBlockedByTarget()) {
mPagesErrorContainer.setVisibility(View.VISIBLE);
final String displayName = mUserColorNameManager.getDisplayName(user, mNameFirst, true);
mPagesErrorText.setText(getString(R.string.blocked_by_user_summary, displayName));
mPagesErrorIcon.setImageResource(R.drawable.ic_info_error_generic);
mPagesContent.setVisibility(View.GONE);
mPagesErrorContainer.setVisibility(View.GONE);
mPagesErrorText.setText(null);
mPagesContent.setVisibility(View.VISIBLE);
} else if (!relationship.isSourceFollowingTarget() && user.is_protected) {
mPagesErrorContainer.setVisibility(View.VISIBLE);
final String displayName = mUserColorNameManager.getDisplayName(user, mNameFirst, true);
@ -988,7 +987,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
final Intent intent = new Intent(INTENT_ACTION_SELECT_USER_LIST);
intent.setClass(getActivity(), UserListSelectorActivity.class);
intent.putExtra(EXTRA_ACCOUNT_ID, user.account_id);
intent.putExtra(EXTRA_SCREEN_NAME, Utils.getAccountScreenName(getActivity(), user.account_id));
intent.putExtra(EXTRA_SCREEN_NAME, DataStoreUtils.getAccountScreenName(getActivity(), user.account_id));
startActivityForResult(intent, REQUEST_ADD_TO_LIST);
break;
}

View File

@ -73,10 +73,11 @@ public class ViewStatusDialogFragment extends BaseSupportDialogFragment {
mAdapter = new DummyStatusHolderAdapter(activity);
mHolder = new StatusViewHolder(mAdapter, getView());
final ParcelableStatus status = args.getParcelable(EXTRA_STATUS);
assert status != null;
if (args.containsKey(EXTRA_SHOW_MEDIA_PREVIEW)) {
mAdapter.setMediaPreviewEnabled(args.getBoolean(EXTRA_SHOW_MEDIA_PREVIEW));
}
mHolder.displayStatus(status, null, false, true);
mHolder.displayStatus(status, false, true);
mStatusContainer.findViewById(R.id.item_menu).setVisibility(View.GONE);
mStatusContainer.findViewById(R.id.action_buttons).setVisibility(View.GONE);
}

View File

@ -22,7 +22,6 @@ package org.mariotaku.twidere.loader.support;
import android.content.Context;
import android.net.Uri;
import org.mariotaku.twidere.loader.ObjectCursorLoader;
import org.mariotaku.twidere.loader.iface.IExtendedLoader;
import org.mariotaku.library.objectcursor.ObjectCursor;
@ -31,10 +30,6 @@ import org.mariotaku.library.objectcursor.ObjectCursor;
*/
public class ExtendedObjectCursorLoader<E> extends ObjectCursorLoader<E> implements IExtendedLoader {
public ExtendedObjectCursorLoader(Context context, Class<? extends ObjectCursor.CursorIndices<E>> indicesClass) {
super(context, indicesClass);
}
public ExtendedObjectCursorLoader(Context context, Class<? extends ObjectCursor.CursorIndices<E>> indicesClass,
Uri uri, String[] projection, String selection, String[] selectionArgs,
String sortOrder, boolean fromUser) {

View File

@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.loader;
package org.mariotaku.twidere.loader.support;
import android.content.Context;
import android.database.Cursor;
@ -61,7 +61,11 @@ public class ObjectCursorLoader<T> extends AsyncTaskLoader<List<T>> {
cursor.registerContentObserver(mObserver);
}
if (cursor == null) throw new NullPointerException("Cursor is null");
return new ObjectCursor<>(cursor, createIndices(cursor));
return createObjectCursor(cursor, createIndices(cursor));
}
protected ObjectCursor<T> createObjectCursor(Cursor cursor, ObjectCursor.CursorIndices<T> indices) {
return new ObjectCursor<>(cursor, indices);
}
@SuppressWarnings("TryWithIdenticalCatches")

View File

@ -107,6 +107,7 @@ import org.mariotaku.twidere.provider.TwidereDataStore.UnreadCounts;
import org.mariotaku.twidere.receiver.NotificationReceiver;
import org.mariotaku.twidere.service.BackgroundOperationService;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.DataStoreUtils;
import org.mariotaku.twidere.util.DatabaseQueryUtils;
import org.mariotaku.twidere.util.ImagePreloader;
import org.mariotaku.twidere.util.MediaPreviewUtils;
@ -147,8 +148,8 @@ import static org.mariotaku.twidere.util.Utils.clearAccountColor;
import static org.mariotaku.twidere.util.Utils.clearAccountName;
import static org.mariotaku.twidere.util.Utils.getAccountIds;
import static org.mariotaku.twidere.util.Utils.getNotificationUri;
import static org.mariotaku.twidere.util.Utils.getTableId;
import static org.mariotaku.twidere.util.Utils.getTableNameById;
import static org.mariotaku.twidere.util.DataStoreUtils.getTableId;
import static org.mariotaku.twidere.util.DataStoreUtils.getTableNameById;
import static org.mariotaku.twidere.util.Utils.isNotificationsSilent;
public final class TwidereDataProvider extends ContentProvider implements Constants, OnSharedPreferenceChangeListener,
@ -1268,7 +1269,7 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
final NotificationManagerWrapper nm = mNotificationManager;
final Expression selection = Expression.and(Expression.equals(Statuses.ACCOUNT_ID, accountId),
Expression.greaterThan(Statuses.STATUS_ID, position));
final String filteredSelection = Utils.buildStatusFilterWhereClause(Statuses.TABLE_NAME,
final String filteredSelection = DataStoreUtils.buildStatusFilterWhereClause(Statuses.TABLE_NAME,
selection).getSQL();
final String[] userProjection = {Statuses.USER_ID, Statuses.USER_NAME, Statuses.USER_SCREEN_NAME};
final String[] statusProjection = {Statuses.STATUS_ID};
@ -1350,7 +1351,7 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
final int itemsLimit = 5;
final String filteredSelection = Utils.buildStatusFilterWhereClause(Mentions.TABLE_NAME,
final String filteredSelection = DataStoreUtils.buildStatusFilterWhereClause(Mentions.TABLE_NAME,
selection).getSQL();
final String[] statusProjection = {Statuses.STATUS_ID, Statuses.USER_ID, Statuses.USER_NAME, Statuses.USER_SCREEN_NAME,
Statuses.TEXT_UNESCAPED, Statuses.STATUS_TIMESTAMP};
@ -1381,7 +1382,7 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
//noinspection TryFinallyCanBeTryWithResources
if (statusCursor.getCount() == 0 || statusesCount == 0) return;
final String accountName = Utils.getAccountName(context, accountId);
final String accountScreenName = Utils.getAccountScreenName(context, accountId);
final String accountScreenName = DataStoreUtils.getAccountScreenName(context, accountId);
final ParcelableStatusCursorIndices indices = new ParcelableStatusCursorIndices(statusCursor);
final UserColorNameManager manager = mUserColorNameManager;
@ -1444,7 +1445,7 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
Mentions.TABLE_NAME, filteredSelection, null, Statuses.USER_ID, null, null);
if (statusesCount == 0 || usersCount == 0) return;
final String accountName = Utils.getAccountName(context, accountId);
final String accountScreenName = Utils.getAccountScreenName(context, accountId);
final String accountScreenName = DataStoreUtils.getAccountScreenName(context, accountId);
final int idxStatusText = statusCursor.getColumnIndex(Statuses.TEXT_UNESCAPED),
idxStatusId = statusCursor.getColumnIndex(Statuses.STATUS_ID),
idxStatusTimestamp = statusCursor.getColumnIndex(Statuses.STATUS_TIMESTAMP),
@ -1630,7 +1631,7 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
final int messagesCount = messageCursor.getCount();
if (messagesCount == 0 || usersCount == 0) return;
final String accountName = Utils.getAccountName(context, accountId);
final String accountScreenName = Utils.getAccountScreenName(context, accountId);
final String accountScreenName = DataStoreUtils.getAccountScreenName(context, accountId);
final int idxMessageText = messageCursor.getColumnIndex(DirectMessages.TEXT_UNESCAPED),
idxMessageTimestamp = messageCursor.getColumnIndex(DirectMessages.MESSAGE_TIMESTAMP),
idxMessageId = messageCursor.getColumnIndex(DirectMessages.MESSAGE_ID),

View File

@ -29,7 +29,7 @@ import android.util.Log;
import org.mariotaku.twidere.BuildConfig;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.ConnectivityUtils;
import org.mariotaku.twidere.util.dagger.ApplicationModule;
import org.mariotaku.twidere.util.net.NetworkUsageUtils;
@ -60,7 +60,7 @@ public class ConnectivityStateReceiver extends BroadcastReceiver implements Cons
HotMobiLogger.getInstance(context).log(event);
// END HotMobi
}
final int networkType = Utils.getActiveNetworkType(context.getApplicationContext());
final int networkType = ConnectivityUtils.getActiveNetworkType(context.getApplicationContext());
NetworkUsageUtils.setNetworkType(networkType);
final boolean isWifi = networkType == ConnectivityManager.TYPE_WIFI;
final boolean isCharging = SpiceProfilingUtil.isCharging(context.getApplicationContext());

View File

@ -78,7 +78,7 @@ import org.mariotaku.twidere.provider.TwidereDataStore.Drafts;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.BitmapUtils;
import org.mariotaku.twidere.util.ContentValuesCreator;
import org.mariotaku.twidere.util.ListUtils;
import org.mariotaku.twidere.util.TwidereListUtils;
import org.mariotaku.twidere.util.MediaUploaderInterface;
import org.mariotaku.twidere.util.NotificationManagerWrapper;
import org.mariotaku.twidere.util.StatusCodeMessageUtils;
@ -335,7 +335,7 @@ public class BackgroundOperationService extends IntentService implements Constan
boolean failed = false;
Exception exception = null;
final Expression where = Expression.equals(Drafts._ID, draftId);
final List<Long> failedAccountIds = ListUtils.fromArray(ParcelableAccount.getAccountIds(item.accounts));
final List<Long> failedAccountIds = TwidereListUtils.fromArray(ParcelableAccount.getAccountIds(item.accounts));
for (final SingleResponse<ParcelableStatus> response : result) {
final ParcelableStatus data = response.getData();
@ -364,7 +364,7 @@ public class BackgroundOperationService extends IntentService implements Constan
showErrorMessage(getString(R.string.status_is_duplicate), false);
} else {
final ContentValues accountIdsValues = new ContentValues();
accountIdsValues.put(Drafts.ACCOUNT_IDS, ListUtils.toString(failedAccountIds, ',', false));
accountIdsValues.put(Drafts.ACCOUNT_IDS, TwidereListUtils.toString(failedAccountIds, ',', false));
mResolver.update(Drafts.CONTENT_URI, accountIdsValues, where.getSQL(), null);
showErrorMessage(R.string.action_updating_status, exception, true);
final ContentValues notifValues = new ContentValues();

View File

@ -20,6 +20,7 @@ import org.mariotaku.restfu.http.ContentType;
import org.mariotaku.restfu.http.Endpoint;
import org.mariotaku.restfu.http.RestHttpResponse;
import org.mariotaku.restfu.http.mime.TypedData;
import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.twidere.BuildConfig;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
@ -37,13 +38,14 @@ import org.mariotaku.twidere.model.AccountPreferences;
import org.mariotaku.twidere.model.ParcelableAccount;
import org.mariotaku.twidere.model.ParcelableCredentials;
import org.mariotaku.twidere.provider.TwidereDataStore.Accounts;
import org.mariotaku.twidere.provider.TwidereDataStore.Activities;
import org.mariotaku.twidere.provider.TwidereDataStore.DirectMessages;
import org.mariotaku.twidere.provider.TwidereDataStore.Mentions;
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses;
import org.mariotaku.twidere.util.ContentValuesCreator;
import org.mariotaku.twidere.util.DataStoreUtils;
import org.mariotaku.twidere.util.TwidereArrayUtils;
import org.mariotaku.twidere.util.TwitterAPIFactory;
import org.mariotaku.twidere.util.Utils;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@ -61,7 +63,6 @@ public class StreamingService extends Service implements Constants {
private long[] mAccountIds;
private static final Uri[] STATUSES_URIS = new Uri[]{Statuses.CONTENT_URI, Mentions.CONTENT_URI};
private static final Uri[] MESSAGES_URIS = new Uri[]{DirectMessages.Inbox.CONTENT_URI,
DirectMessages.Outbox.CONTENT_URI};
@ -74,7 +75,7 @@ public class StreamingService extends Service implements Constants {
@Override
public void onChange(final boolean selfChange, final Uri uri) {
if (!TwidereArrayUtils.contentMatch(mAccountIds, Utils.getActivatedAccountIds(StreamingService.this))) {
if (!TwidereArrayUtils.contentMatch(mAccountIds, DataStoreUtils.getActivatedAccountIds(StreamingService.this))) {
initStreaming();
}
}
@ -229,11 +230,9 @@ public class StreamingService extends Service implements Constants {
@Override
public void onDeletionNotice(final StatusDeletionNotice statusDeletionNotice) {
final long status_id = statusDeletionNotice.getStatusId();
final String where = Statuses.STATUS_ID + " = " + status_id;
for (final Uri uri : STATUSES_URIS) {
resolver.delete(uri, where, null);
}
final long statusId = statusDeletionNotice.getStatusId();
resolver.delete(Statuses.CONTENT_URI, Expression.equals(Statuses.STATUS_ID, statusId).getSQL(), null);
resolver.delete(Activities.AboutMe.CONTENT_URI, Expression.equals(Activities.AboutMe.STATUS_ID, statusId).getSQL(), null);
}
@Override
@ -323,9 +322,7 @@ public class StreamingService extends Service implements Constants {
+ upToStatusId;
final ContentValues values = new ContentValues();
values.putNull(Statuses.LOCATION);
for (final Uri uri : STATUSES_URIS) {
resolver.update(uri, values, where, null);
}
resolver.update(Statuses.CONTENT_URI, values, where, null);
}
@Override

View File

@ -62,7 +62,6 @@ import org.mariotaku.twidere.api.twitter.model.UserListUpdate;
import org.mariotaku.twidere.model.ListResponse;
import org.mariotaku.twidere.model.ParcelableAccount;
import org.mariotaku.twidere.model.ParcelableActivity;
import org.mariotaku.twidere.model.ParcelableActivityValuesCreator;
import org.mariotaku.twidere.model.ParcelableLocation;
import org.mariotaku.twidere.model.ParcelableMediaUpdate;
import org.mariotaku.twidere.model.ParcelableStatus;
@ -394,7 +393,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
@Deprecated
public void refreshAll() {
refreshAll(Utils.getActivatedAccountIds(mContext));
refreshAll(DataStoreUtils.getActivatedAccountIds(mContext));
}
public boolean refreshAll(final long[] accountIds) {
@ -609,22 +608,22 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
for (Activity activity : getActivities(accountId, twitter, paging)) {
final ParcelableActivity parcelableActivity = new ParcelableActivity(activity, accountId, false);
if (deleteBound[0] < 0) {
deleteBound[0] = parcelableActivity.min_position;
deleteBound[0] = parcelableActivity.timestamp;
} else {
deleteBound[0] = Math.min(deleteBound[0], parcelableActivity.min_position);
deleteBound[0] = Math.min(deleteBound[0], parcelableActivity.timestamp);
}
if (deleteBound[1] < 0) {
deleteBound[1] = parcelableActivity.max_position;
deleteBound[1] = parcelableActivity.timestamp;
} else {
deleteBound[1] = Math.max(deleteBound[1], parcelableActivity.max_position);
deleteBound[1] = Math.max(deleteBound[1], parcelableActivity.timestamp);
}
valuesList.add(ParcelableActivityValuesCreator.create(parcelableActivity));
valuesList.add(ContentValuesCreator.createActivity(parcelableActivity));
}
if (deleteBound[0] > 0 && deleteBound[1] > 0) {
Expression where = Expression.and(
Expression.equals(Activities.ACCOUNT_ID, accountId),
Expression.greaterEquals(Activities.MIN_POSITION, deleteBound[0]),
Expression.lesserEquals(Activities.MAX_POSITION, deleteBound[1])
Expression.greaterEquals(Activities.TIMESTAMP, deleteBound[0]),
Expression.lesserEquals(Activities.TIMESTAMP, deleteBound[1])
);
int rowsDeleted = cr.delete(getContentUri(), where.getSQL(), null);
boolean insertGap = !noItemsBefore && rowsDeleted <= 0;
@ -2434,7 +2433,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
@Override
protected void onPostExecute(final ListResponse<Long> result) {
if (result != null) {
final String user_id_where = ListUtils.toString(result.getData(), ',', false);
final String user_id_where = TwidereListUtils.toString(result.getData(), ',', false);
for (final Uri uri : TwidereDataStore.STATUSES_URIS) {
final Expression where = Expression.and(Expression.equals(Statuses.ACCOUNT_ID, account_id),
new Expression(String.format(Locale.ROOT, "%s IN (%s)", Statuses.USER_ID, user_id_where)));

View File

@ -0,0 +1,44 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2015 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.util;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
/**
* Created by mariotaku on 15/12/15.
*/
public class ConnectivityUtils {
public static boolean isOnWifi(final Context context) {
if (context == null) return false;
final ConnectivityManager conn = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
final NetworkInfo networkInfo = conn.getActiveNetworkInfo();
return networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI
&& networkInfo.isConnected();
}
public static int getActiveNetworkType(final Context context) {
if (context == null) return -1;
final ConnectivityManager conn = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
final NetworkInfo networkInfo = conn.getActiveNetworkInfo();
return networkInfo != null && networkInfo.isConnected() ? networkInfo.getType() : -1;
}
}

View File

@ -179,7 +179,9 @@ public class CustomTabUtils implements Constants {
case TAB_TYPE_HOME_TIMELINE: {
return TAB_TYPE_HOME_TIMELINE;
}
case "mentions_timeline":
case "mentions_timeline": {
return "mentions_timeline";
}
case TAB_TYPE_NOTIFICATIONS_TIMELINE: {
return TAB_TYPE_NOTIFICATIONS_TIMELINE;
}

View File

@ -21,20 +21,157 @@ package org.mariotaku.twidere.util;
import android.content.ContentResolver;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.v4.util.LongSparseArray;
import org.mariotaku.sqliteqb.library.Columns;
import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.sqliteqb.library.RawItemArray;
import org.mariotaku.sqliteqb.library.SQLFunctions;
import org.mariotaku.twidere.provider.TwidereDataStore.*;
import org.mariotaku.sqliteqb.library.SQLQueryBuilder;
import org.mariotaku.sqliteqb.library.Table;
import org.mariotaku.sqliteqb.library.Tables;
import org.mariotaku.sqliteqb.library.query.SQLSelectQuery;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.TwidereConstants;
import org.mariotaku.twidere.provider.TwidereDataStore;
import org.mariotaku.twidere.provider.TwidereDataStore.Accounts;
import org.mariotaku.twidere.provider.TwidereDataStore.Activities;
import org.mariotaku.twidere.provider.TwidereDataStore.CacheFiles;
import org.mariotaku.twidere.provider.TwidereDataStore.CachedHashtags;
import org.mariotaku.twidere.provider.TwidereDataStore.CachedImages;
import org.mariotaku.twidere.provider.TwidereDataStore.CachedRelationships;
import org.mariotaku.twidere.provider.TwidereDataStore.CachedStatuses;
import org.mariotaku.twidere.provider.TwidereDataStore.CachedTrends;
import org.mariotaku.twidere.provider.TwidereDataStore.CachedUsers;
import org.mariotaku.twidere.provider.TwidereDataStore.DNS;
import org.mariotaku.twidere.provider.TwidereDataStore.DirectMessages;
import org.mariotaku.twidere.provider.TwidereDataStore.Drafts;
import org.mariotaku.twidere.provider.TwidereDataStore.Filters;
import org.mariotaku.twidere.provider.TwidereDataStore.NetworkUsages;
import org.mariotaku.twidere.provider.TwidereDataStore.Notifications;
import org.mariotaku.twidere.provider.TwidereDataStore.Permissions;
import org.mariotaku.twidere.provider.TwidereDataStore.Preferences;
import org.mariotaku.twidere.provider.TwidereDataStore.SavedSearches;
import org.mariotaku.twidere.provider.TwidereDataStore.SearchHistory;
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses;
import org.mariotaku.twidere.provider.TwidereDataStore.Suggestions;
import org.mariotaku.twidere.provider.TwidereDataStore.Tabs;
import org.mariotaku.twidere.provider.TwidereDataStore.UnreadCounts;
import org.mariotaku.twidere.util.content.ContentResolverUtils;
import static android.text.TextUtils.isEmpty;
/**
* Created by mariotaku on 15/11/28.
*/
public class DataStoreUtils {
public class DataStoreUtils implements Constants {
static final UriMatcher CONTENT_PROVIDER_URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
static {
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Accounts.CONTENT_PATH,
TABLE_ID_ACCOUNTS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Statuses.CONTENT_PATH,
TABLE_ID_STATUSES);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Activities.AboutMe.CONTENT_PATH,
TABLE_ID_ACTIVITIES_ABOUT_ME);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Activities.ByFriends.CONTENT_PATH,
TABLE_ID_ACTIVITIES_BY_FRIENDS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Drafts.CONTENT_PATH,
TABLE_ID_DRAFTS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, CachedUsers.CONTENT_PATH,
TABLE_ID_CACHED_USERS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Filters.Users.CONTENT_PATH,
TABLE_ID_FILTERED_USERS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Filters.Keywords.CONTENT_PATH,
TABLE_ID_FILTERED_KEYWORDS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Filters.Sources.CONTENT_PATH,
TABLE_ID_FILTERED_SOURCES);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Filters.Links.CONTENT_PATH,
TABLE_ID_FILTERED_LINKS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, DirectMessages.CONTENT_PATH,
TABLE_ID_DIRECT_MESSAGES);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, DirectMessages.Inbox.CONTENT_PATH,
TABLE_ID_DIRECT_MESSAGES_INBOX);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, DirectMessages.Outbox.CONTENT_PATH,
TABLE_ID_DIRECT_MESSAGES_OUTBOX);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, DirectMessages.Conversation.CONTENT_PATH + "/#/#",
TABLE_ID_DIRECT_MESSAGES_CONVERSATION);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, DirectMessages.Conversation.CONTENT_PATH_SCREEN_NAME + "/#/*",
TABLE_ID_DIRECT_MESSAGES_CONVERSATION_SCREEN_NAME);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, DirectMessages.ConversationEntries.CONTENT_PATH,
TABLE_ID_DIRECT_MESSAGES_CONVERSATIONS_ENTRIES);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, CachedTrends.Local.CONTENT_PATH,
TABLE_ID_TRENDS_LOCAL);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Tabs.CONTENT_PATH,
TABLE_ID_TABS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, CachedStatuses.CONTENT_PATH,
TABLE_ID_CACHED_STATUSES);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, CachedHashtags.CONTENT_PATH,
TABLE_ID_CACHED_HASHTAGS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, CachedRelationships.CONTENT_PATH,
TABLE_ID_CACHED_RELATIONSHIPS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, SavedSearches.CONTENT_PATH,
TABLE_ID_SAVED_SEARCHES);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, SearchHistory.CONTENT_PATH,
TABLE_ID_SEARCH_HISTORY);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, NetworkUsages.CONTENT_PATH,
TABLE_ID_NETWORK_USAGES);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Notifications.CONTENT_PATH,
VIRTUAL_TABLE_ID_NOTIFICATIONS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Notifications.CONTENT_PATH + "/#",
VIRTUAL_TABLE_ID_NOTIFICATIONS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Notifications.CONTENT_PATH + "/#/#",
VIRTUAL_TABLE_ID_NOTIFICATIONS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Permissions.CONTENT_PATH,
VIRTUAL_TABLE_ID_PERMISSIONS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, DNS.CONTENT_PATH + "/*",
VIRTUAL_TABLE_ID_DNS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, CachedImages.CONTENT_PATH,
VIRTUAL_TABLE_ID_CACHED_IMAGES);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, CacheFiles.CONTENT_PATH + "/*",
VIRTUAL_TABLE_ID_CACHE_FILES);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Preferences.CONTENT_PATH,
VIRTUAL_TABLE_ID_ALL_PREFERENCES);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Preferences.CONTENT_PATH + "/*",
VIRTUAL_TABLE_ID_PREFERENCES);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, UnreadCounts.CONTENT_PATH,
VIRTUAL_TABLE_ID_UNREAD_COUNTS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, UnreadCounts.CONTENT_PATH + "/#",
VIRTUAL_TABLE_ID_UNREAD_COUNTS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, UnreadCounts.CONTENT_PATH + "/#/#/*",
VIRTUAL_TABLE_ID_UNREAD_COUNTS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, UnreadCounts.ByType.CONTENT_PATH + "/*",
VIRTUAL_TABLE_ID_UNREAD_COUNTS_BY_TYPE);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, TwidereDataStore.CONTENT_PATH_DATABASE_READY,
VIRTUAL_TABLE_ID_DATABASE_READY);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, CachedUsers.CONTENT_PATH_WITH_RELATIONSHIP + "/#",
VIRTUAL_TABLE_ID_CACHED_USERS_WITH_RELATIONSHIP);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, CachedUsers.CONTENT_PATH_WITH_SCORE + "/#",
VIRTUAL_TABLE_ID_CACHED_USERS_WITH_SCORE);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Drafts.CONTENT_PATH_UNSENT,
VIRTUAL_TABLE_ID_DRAFTS_UNSENT);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Drafts.CONTENT_PATH_NOTIFICATIONS,
VIRTUAL_TABLE_ID_DRAFTS_NOTIFICATIONS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Drafts.CONTENT_PATH_NOTIFICATIONS,
VIRTUAL_TABLE_ID_DRAFTS_NOTIFICATIONS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Suggestions.AutoComplete.CONTENT_PATH,
VIRTUAL_TABLE_ID_SUGGESTIONS_AUTO_COMPLETE);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Suggestions.Search.CONTENT_PATH,
VIRTUAL_TABLE_ID_SUGGESTIONS_SEARCH);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, TwidereDataStore.CONTENT_PATH_EMPTY,
VIRTUAL_TABLE_ID_EMPTY);
}
static LongSparseArray<String> sAccountScreenNames = new LongSparseArray<>();
static LongSparseArray<String> sAccountNames = new LongSparseArray<>();
public static long[] getNewestMessageIdsFromDatabase(final Context context, final Uri uri) {
final long[] accountIds = Utils.getActivatedAccountIds(context);
final long[] accountIds = getActivatedAccountIds(context);
return getNewestMessageIdsFromDatabase(context, uri, accountIds);
}
@ -63,7 +200,7 @@ public class DataStoreUtils {
}
public static long[] getNewestStatusIdsFromDatabase(final Context context, final Uri uri) {
final long[] account_ids = Utils.getActivatedAccountIds(context);
final long[] account_ids = getActivatedAccountIds(context);
return getNewestStatusIdsFromDatabase(context, uri, account_ids);
}
@ -116,7 +253,7 @@ public class DataStoreUtils {
}
public static long[] getOldestMessageIdsFromDatabase(final Context context, final Uri uri) {
final long[] account_ids = Utils.getActivatedAccountIds(context);
final long[] account_ids = getActivatedAccountIds(context);
return getOldestMessageIdsFromDatabase(context, uri, account_ids);
}
@ -144,7 +281,7 @@ public class DataStoreUtils {
}
public static long[] getOldestStatusIdsFromDatabase(final Context context, final Uri uri) {
final long[] account_ids = Utils.getActivatedAccountIds(context);
final long[] account_ids = getActivatedAccountIds(context);
return getOldestStatusIdsFromDatabase(context, uri, account_ids);
}
@ -220,4 +357,365 @@ public class DataStoreUtils {
cur.close();
}
}
@NonNull
public static long[] getFilteredUserIds(Context context) {
if (context == null) return new long[0];
final ContentResolver resolver = context.getContentResolver();
final Cursor cur = ContentResolverUtils.query(resolver, Filters.Users.CONTENT_URI,
new String[]{Filters.Users.USER_ID}, null, null, null);
if (cur == null) return new long[0];
try {
final long[] ids = new long[cur.getCount()];
cur.moveToFirst();
int i = 0;
while (!cur.isAfterLast()) {
ids[i] = cur.getLong(0);
cur.moveToNext();
i++;
}
cur.close();
return ids;
} finally {
cur.close();
}
}
@NonNull
public static Expression buildStatusFilterWhereClause(@NonNull final String table, final Expression extraSelection) {
final SQLSelectQuery filteredUsersQuery = SQLQueryBuilder
.select(new Columns.Column(new Table(Filters.Users.TABLE_NAME), Filters.Users.USER_ID))
.from(new Tables(Filters.Users.TABLE_NAME))
.build();
final SQLSelectQuery selectCTEIds = SQLQueryBuilder.select(new Columns.Column(Filters.Users.USER_ID))
.from(new Table("cte_filtered_user_ids")).build();
final Expression filteredUsersWhere = Expression.or(
Expression.in(new Columns.Column(new Table(table), Statuses.USER_ID), selectCTEIds),
Expression.in(new Columns.Column(new Table(table), Statuses.RETWEETED_BY_USER_ID), selectCTEIds),
Expression.in(new Columns.Column(new Table(table), Statuses.QUOTED_USER_ID), selectCTEIds)
);
final SQLSelectQuery.Builder filteredIdsQueryBuilder = SQLQueryBuilder
.with("cte_filtered_user_ids", filteredUsersQuery)
.select(new Columns.Column(new Table(table), Statuses._ID))
.from(new Tables(table))
.where(filteredUsersWhere)
.union()
.select(new Columns(new Columns.Column(new Table(table), Statuses._ID)))
.from(new Tables(table, Filters.Sources.TABLE_NAME))
.where(Expression.or(
Expression.likeRaw(new Columns.Column(new Table(table), Statuses.SOURCE),
"'%>'||" + Filters.Sources.TABLE_NAME + "." + Filters.Sources.VALUE + "||'</a>%'"),
Expression.likeRaw(new Columns.Column(new Table(table), Statuses.QUOTED_SOURCE),
"'%>'||" + Filters.Sources.TABLE_NAME + "." + Filters.Sources.VALUE + "||'</a>%'")
))
.union()
.select(new Columns(new Columns.Column(new Table(table), Statuses._ID)))
.from(new Tables(table, Filters.Keywords.TABLE_NAME))
.where(Expression.or(
Expression.likeRaw(new Columns.Column(new Table(table), Statuses.TEXT_PLAIN),
"'%'||" + Filters.Keywords.TABLE_NAME + "." + Filters.Keywords.VALUE + "||'%'"),
Expression.likeRaw(new Columns.Column(new Table(table), Statuses.QUOTED_TEXT_PLAIN),
"'%'||" + Filters.Keywords.TABLE_NAME + "." + Filters.Keywords.VALUE + "||'%'")
))
.union()
.select(new Columns(new Columns.Column(new Table(table), Statuses._ID)))
.from(new Tables(table, Filters.Links.TABLE_NAME))
.where(Expression.or(
Expression.likeRaw(new Columns.Column(new Table(table), Statuses.TEXT_HTML),
"'%>%'||" + Filters.Links.TABLE_NAME + "." + Filters.Links.VALUE + "||'%</a>%'"),
Expression.likeRaw(new Columns.Column(new Table(table), Statuses.QUOTED_TEXT_HTML),
"'%>%'||" + Filters.Links.TABLE_NAME + "." + Filters.Links.VALUE + "||'%</a>%'")
));
final Expression filterExpression = Expression.or(
Expression.notIn(new Columns.Column(new Table(table), Statuses._ID), filteredIdsQueryBuilder.build()),
Expression.equals(new Columns.Column(new Table(table), Statuses.IS_GAP), 1)
);
if (extraSelection != null) {
return Expression.and(filterExpression, extraSelection);
}
return filterExpression;
}
public static String[] getAccountNames(final Context context, final long[] accountIds) {
if (context == null) return new String[0];
final String[] cols = new String[]{Accounts.NAME};
final String where = accountIds != null ? Expression.in(new Columns.Column(Accounts.ACCOUNT_ID),
new RawItemArray(accountIds)).getSQL() : null;
final Cursor cur = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI, cols, where,
null, null);
if (cur == null) return new String[0];
try {
cur.moveToFirst();
final String[] names = new String[cur.getCount()];
int i = 0;
while (!cur.isAfterLast()) {
names[i++] = cur.getString(0);
cur.moveToNext();
}
return names;
} finally {
cur.close();
}
}
public static String getAccountScreenName(final Context context, final long accountId) {
if (context == null) return null;
final String cached = sAccountScreenNames.get(accountId);
if (!isEmpty(cached)) return cached;
final Cursor cur = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI,
new String[]{Accounts.SCREEN_NAME}, Accounts.ACCOUNT_ID + " = " + accountId, null, null);
if (cur == null) return null;
try {
if (cur.getCount() > 0 && cur.moveToFirst()) {
final String name = cur.getString(0);
sAccountScreenNames.put(accountId, name);
return name;
}
return null;
} finally {
cur.close();
}
}
public static String[] getAccountScreenNames(final Context context) {
return getAccountScreenNames(context, false);
}
public static String[] getAccountScreenNames(final Context context, final boolean includeAtChar) {
return getAccountScreenNames(context, null, includeAtChar);
}
public static String[] getAccountScreenNames(final Context context, final long[] accountIds) {
return getAccountScreenNames(context, accountIds, false);
}
public static String[] getAccountScreenNames(final Context context, final long[] accountIds,
final boolean includeAtChar) {
if (context == null) return new String[0];
final String[] cols = new String[]{Accounts.SCREEN_NAME};
final String where = accountIds != null ? Expression.in(new Columns.Column(Accounts.ACCOUNT_ID),
new RawItemArray(accountIds)).getSQL() : null;
final Cursor cur = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI, cols, where,
null, null);
if (cur == null) return new String[0];
try {
cur.moveToFirst();
final String[] screen_names = new String[cur.getCount()];
int i = 0;
while (!cur.isAfterLast()) {
screen_names[i++] = cur.getString(0);
cur.moveToNext();
}
return screen_names;
} finally {
cur.close();
}
}
public static long[] getActivatedAccountIds(final Context context) {
if (context == null) return new long[0];
final Cursor cur = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI,
new String[]{Accounts.ACCOUNT_ID}, Accounts.IS_ACTIVATED + " = 1", null, null);
if (cur == null) return new long[0];
try {
cur.moveToFirst();
final long[] ids = new long[cur.getCount()];
int i = 0;
while (!cur.isAfterLast()) {
ids[i++] = cur.getLong(0);
cur.moveToNext();
}
return ids;
} finally {
cur.close();
}
}
public static int getAllStatusesCount(final Context context, @NonNull final Uri uri) {
if (context == null) return 0;
final ContentResolver resolver = context.getContentResolver();
final String table = getTableNameByUri(uri);
if (table == null) return 0;
final Cursor cur = ContentResolverUtils.query(resolver, uri, new String[]{Statuses.STATUS_ID},
buildStatusFilterWhereClause(table, null).getSQL(),
null, null);
if (cur == null) return 0;
try {
return cur.getCount();
} finally {
cur.close();
}
}
public static int getStatusesCount(final Context context, final Uri uri, final long sinceId, final long... accountIds) {
if (context == null) return 0;
final ContentResolver resolver = context.getContentResolver();
final RawItemArray idsIn;
if (accountIds == null || accountIds.length == 0 || (accountIds.length == 1 && accountIds[0] < 0)) {
idsIn = new RawItemArray(getActivatedAccountIds(context));
} else {
idsIn = new RawItemArray(accountIds);
}
final Expression selection = Expression.and(
Expression.in(new Columns.Column(Statuses.ACCOUNT_ID), idsIn),
Expression.greaterThan(Statuses.STATUS_ID, sinceId),
buildStatusFilterWhereClause(getTableNameByUri(uri), null)
);
return queryCount(context, uri, selection.getSQL(), null);
}
public static int getActivitiesCount(final Context context, final Uri uri, final long sinceTimestamp,
final long... accountIds) {
if (context == null) return 0;
final RawItemArray idsIn;
if (accountIds == null || accountIds.length == 0 || (accountIds.length == 1 && accountIds[0] < 0)) {
idsIn = new RawItemArray(getActivatedAccountIds(context));
} else {
idsIn = new RawItemArray(accountIds);
}
final Expression selection = Expression.and(
Expression.in(new Columns.Column(Activities.ACCOUNT_ID), idsIn),
Expression.greaterThan(Activities.TIMESTAMP, sinceTimestamp),
buildActivityFilterWhereClause(getTableNameByUri(uri), null)
);
return queryCount(context, uri, selection.getSQL(), null);
}
@NonNull
public static long[] getAllStatusesIds(final Context context, final Uri uri) {
if (context == null) return new long[0];
final ContentResolver resolver = context.getContentResolver();
final String table = getTableNameByUri(uri);
if (table == null) return new long[0];
final Cursor cur = ContentResolverUtils.query(resolver, uri, new String[]{Statuses.STATUS_ID},
buildStatusFilterWhereClause(table, null).getSQL(),
null, null);
if (cur == null) return new long[0];
final long[] ids = new long[cur.getCount()];
cur.moveToFirst();
int i = 0;
while (!cur.isAfterLast()) {
ids[i] = cur.getLong(0);
cur.moveToNext();
i++;
}
cur.close();
return ids;
}
public static int getTableId(final Uri uri) {
if (uri == null) return -1;
return CONTENT_PROVIDER_URI_MATCHER.match(uri);
}
public static String getTableNameById(final int id) {
switch (id) {
case TwidereConstants.TABLE_ID_ACCOUNTS:
return Accounts.TABLE_NAME;
case TwidereConstants.TABLE_ID_STATUSES:
return Statuses.TABLE_NAME;
case TwidereConstants.TABLE_ID_ACTIVITIES_ABOUT_ME:
return Activities.AboutMe.TABLE_NAME;
case TwidereConstants.TABLE_ID_ACTIVITIES_BY_FRIENDS:
return Activities.ByFriends.TABLE_NAME;
case TwidereConstants.TABLE_ID_DRAFTS:
return Drafts.TABLE_NAME;
case TwidereConstants.TABLE_ID_FILTERED_USERS:
return Filters.Users.TABLE_NAME;
case TwidereConstants.TABLE_ID_FILTERED_KEYWORDS:
return Filters.Keywords.TABLE_NAME;
case TwidereConstants.TABLE_ID_FILTERED_SOURCES:
return Filters.Sources.TABLE_NAME;
case TwidereConstants.TABLE_ID_FILTERED_LINKS:
return Filters.Links.TABLE_NAME;
case TwidereConstants.TABLE_ID_DIRECT_MESSAGES_INBOX:
return DirectMessages.Inbox.TABLE_NAME;
case TwidereConstants.TABLE_ID_DIRECT_MESSAGES_OUTBOX:
return DirectMessages.Outbox.TABLE_NAME;
case TwidereConstants.TABLE_ID_DIRECT_MESSAGES:
return DirectMessages.TABLE_NAME;
case TwidereConstants.TABLE_ID_DIRECT_MESSAGES_CONVERSATIONS_ENTRIES:
return DirectMessages.ConversationEntries.TABLE_NAME;
case TwidereConstants.TABLE_ID_TRENDS_LOCAL:
return CachedTrends.Local.TABLE_NAME;
case TwidereConstants.TABLE_ID_TABS:
return Tabs.TABLE_NAME;
case TwidereConstants.TABLE_ID_CACHED_STATUSES:
return CachedStatuses.TABLE_NAME;
case TwidereConstants.TABLE_ID_CACHED_USERS:
return CachedUsers.TABLE_NAME;
case TwidereConstants.TABLE_ID_CACHED_HASHTAGS:
return CachedHashtags.TABLE_NAME;
case TwidereConstants.TABLE_ID_CACHED_RELATIONSHIPS:
return CachedRelationships.TABLE_NAME;
case TwidereConstants.TABLE_ID_SAVED_SEARCHES:
return SavedSearches.TABLE_NAME;
case TwidereConstants.TABLE_ID_SEARCH_HISTORY:
return SearchHistory.TABLE_NAME;
case TwidereConstants.TABLE_ID_NETWORK_USAGES:
return NetworkUsages.TABLE_NAME;
default:
return null;
}
}
public static String getTableNameByUri(final Uri uri) {
if (uri == null) return null;
return getTableNameById(getTableId(uri));
}
@NonNull
public static Expression buildActivityFilterWhereClause(@NonNull final String table, final Expression extraSelection) {
final SQLSelectQuery filteredUsersQuery = SQLQueryBuilder
.select(new Columns.Column(new Table(Filters.Users.TABLE_NAME), Filters.Users.USER_ID))
.from(new Tables(Filters.Users.TABLE_NAME))
.build();
final SQLSelectQuery selectCTEIds = SQLQueryBuilder.select(new Columns.Column(Filters.Users.USER_ID))
.from(new Table("cte_filtered_user_ids")).build();
final Expression filteredUsersWhere = Expression.or(
Expression.in(new Columns.Column(new Table(table), Activities.STATUS_USER_ID), selectCTEIds),
Expression.in(new Columns.Column(new Table(table), Activities.STATUS_RETWEETED_BY_USER_ID), selectCTEIds),
Expression.in(new Columns.Column(new Table(table), Activities.STATUS_QUOTED_USER_ID), selectCTEIds)
);
final SQLSelectQuery.Builder filteredIdsQueryBuilder = SQLQueryBuilder
.with("cte_filtered_user_ids", filteredUsersQuery)
.select(new Columns.Column(new Table(table), Activities._ID))
.from(new Tables(table))
.where(filteredUsersWhere)
.union()
.select(new Columns(new Columns.Column(new Table(table), Activities._ID)))
.from(new Tables(table, Filters.Sources.TABLE_NAME))
.where(Expression.or(
Expression.likeRaw(new Columns.Column(new Table(table), Activities.STATUS_SOURCE),
"'%>'||" + Filters.Sources.TABLE_NAME + "." + Filters.Sources.VALUE + "||'</a>%'"),
Expression.likeRaw(new Columns.Column(new Table(table), Activities.STATUS_QUOTE_SOURCE),
"'%>'||" + Filters.Sources.TABLE_NAME + "." + Filters.Sources.VALUE + "||'</a>%'")
))
.union()
.select(new Columns(new Columns.Column(new Table(table), Activities._ID)))
.from(new Tables(table, Filters.Keywords.TABLE_NAME))
.where(Expression.or(
Expression.likeRaw(new Columns.Column(new Table(table), Activities.STATUS_TEXT_PLAIN),
"'%'||" + Filters.Keywords.TABLE_NAME + "." + Filters.Keywords.VALUE + "||'%'"),
Expression.likeRaw(new Columns.Column(new Table(table), Activities.STATUS_QUOTE_TEXT_PLAIN),
"'%'||" + Filters.Keywords.TABLE_NAME + "." + Filters.Keywords.VALUE + "||'%'")
))
.union()
.select(new Columns(new Columns.Column(new Table(table), Activities._ID)))
.from(new Tables(table, Filters.Links.TABLE_NAME))
.where(Expression.or(
Expression.likeRaw(new Columns.Column(new Table(table), Activities.STATUS_TEXT_HTML),
"'%>%'||" + Filters.Links.TABLE_NAME + "." + Filters.Links.VALUE + "||'%</a>%'"),
Expression.likeRaw(new Columns.Column(new Table(table), Activities.STATUS_QUOTE_TEXT_HTML),
"'%>%'||" + Filters.Links.TABLE_NAME + "." + Filters.Links.VALUE + "||'%</a>%'")
));
final Expression filterExpression = Expression.or(
Expression.notIn(new Columns.Column(new Table(table), Activities._ID), filteredIdsQueryBuilder.build()),
Expression.equals(new Columns.Column(new Table(table), Activities.IS_GAP), 1)
);
if (extraSelection != null) {
return Expression.and(filterExpression, extraSelection);
}
return filterExpression;
}
}

View File

@ -30,7 +30,7 @@ import org.mariotaku.twidere.Constants;
import java.io.File;
import static org.mariotaku.twidere.util.Utils.isOnWifi;
import static org.mariotaku.twidere.util.ConnectivityUtils.isOnWifi;
/**
* @author mariotaku

View File

@ -1,62 +0,0 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.util;
import java.util.ArrayList;
import java.util.List;
public class ListUtils {
public static List<Long> fromArray(final long[] array) {
if (array == null) return null;
final List<Long> list = new ArrayList<>();
for (final long item : array) {
list.add(item);
}
return list;
}
public static <T> String toString(final List<T> list, final char token, final boolean include_space) {
final StringBuilder builder = new StringBuilder();
final int size = list.size();
for (int i = 0; i < size; i++) {
final String item_string = String.valueOf(list.get(i));
if (item_string != null) {
if (i > 0) {
builder.append(include_space ? token + " " : token);
}
builder.append(item_string);
}
}
return builder.toString();
}
public static String toStringForSQL(final List<String> list) {
final int size = list != null ? list.size() : 0;
final StringBuilder builder = new StringBuilder();
for (int i = 0; i < size; i++) {
if (i > 0) {
builder.append(',');
}
builder.append('?');
}
return builder.toString();
}
}

View File

@ -34,6 +34,7 @@ import com.nostra13.universalimageloader.core.listener.ImageLoadingProgressListe
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.util.support.ViewSupport;
import org.mariotaku.twidere.view.ForegroundImageView;
import java.util.HashMap;
@ -61,7 +62,7 @@ public class MediaLoadingHandler implements ImageLoadingListener, ImageLoadingPr
if (view == null || imageUri == null || imageUri.equals(mLoadingUris.get(view))) return;
ViewGroup parent = (ViewGroup) view.getParent();
if (view instanceof ForegroundImageView) {
((ForegroundImageView) view).setForeground(null);
ViewSupport.setForeground(view, null);
}
mLoadingUris.put(view, imageUri);
final ProgressBar progress = findProgressBar(parent);
@ -79,7 +80,7 @@ public class MediaLoadingHandler implements ImageLoadingListener, ImageLoadingPr
((ImageView) view).setImageDrawable(null);
final Drawable foreground = ResourcesCompat.getDrawable(view.getResources(),
R.drawable.image_preview_refresh, null);
((ForegroundImageView) view).setForeground(foreground);
ViewSupport.setForeground(view, foreground);
}
mLoadingUris.remove(view);
final ProgressBar progress = findProgressBar(view.getParent());
@ -109,7 +110,7 @@ public class MediaLoadingHandler implements ImageLoadingListener, ImageLoadingPr
} else {
foreground = null;
}
((ForegroundImageView) view).setForeground(foreground);
ViewSupport.setForeground(view, foreground);
}
}
@ -118,7 +119,7 @@ public class MediaLoadingHandler implements ImageLoadingListener, ImageLoadingPr
if (view == null || imageUri == null || imageUri.equals(mLoadingUris.get(view))) return;
mLoadingUris.remove(view);
if (view instanceof ForegroundImageView) {
((ForegroundImageView) view).setForeground(null);
ViewSupport.setForeground(view, null);
}
final ProgressBar progress = findProgressBar(view.getParent());
if (progress != null) {
@ -151,7 +152,8 @@ public class MediaLoadingHandler implements ImageLoadingListener, ImageLoadingPr
if (tag instanceof ParcelableMedia) {
final int type = ((ParcelableMedia) tag).type;
return type == ParcelableMedia.TYPE_VIDEO || type == ParcelableMedia.TYPE_ANIMATED_GIF
|| type == ParcelableMedia.TYPE_CARD_ANIMATED_GIF;
|| type == ParcelableMedia.TYPE_CARD_ANIMATED_GIF
|| type == ParcelableMedia.TYPE_EXTERNAL_PLAYER;
}
return false;
}

View File

@ -52,7 +52,7 @@ import java.util.TreeSet;
import javax.inject.Inject;
import static org.mariotaku.twidere.util.Utils.getAccountScreenNames;
import static org.mariotaku.twidere.util.DataStoreUtils.getAccountScreenNames;
import static org.mariotaku.twidere.util.content.ContentResolverUtils.bulkDelete;
import static org.mariotaku.twidere.util.content.ContentResolverUtils.bulkInsert;
@ -108,7 +108,7 @@ public class MultiSelectEventHandler implements Constants, ActionMode.Callback,
final Extractor extractor = new Extractor();
final Intent intent = new Intent(INTENT_ACTION_REPLY_MULTIPLE);
final Bundle bundle = new Bundle();
final String[] accountScreenNames = getAccountScreenNames(mActivity);
final String[] accountScreenNames = DataStoreUtils.getAccountScreenNames(mActivity);
final Collection<String> allMentions = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
for (final Object object : selectedItems) {
if (object instanceof ParcelableStatus) {

View File

@ -0,0 +1,62 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.util;
import java.util.ArrayList;
import java.util.List;
public class TwidereListUtils {
public static List<Long> fromArray(final long[] array) {
if (array == null) return null;
final List<Long> list = new ArrayList<>();
for (final long item : array) {
list.add(item);
}
return list;
}
public static <T> String toString(final List<T> list, final char delimiter, final boolean includeSpace) {
final StringBuilder builder = new StringBuilder();
final int size = list.size();
for (int i = 0; i < size; i++) {
if (i > 0) {
builder.append(delimiter);
if (includeSpace) {
builder.append(" ");
}
}
builder.append(list.get(i));
}
return builder.toString();
}
public static String toStringForSQL(final List<String> list) {
final int size = list != null ? list.size() : 0;
final StringBuilder builder = new StringBuilder();
for (int i = 0; i < size; i++) {
if (i > 0) {
builder.append(',');
}
builder.append('?');
}
return builder.toString();
}
}

View File

@ -126,9 +126,7 @@ import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.sqliteqb.library.OrderBy;
import org.mariotaku.sqliteqb.library.RawItemArray;
import org.mariotaku.sqliteqb.library.SQLFunctions;
import org.mariotaku.sqliteqb.library.SQLQueryBuilder;
import org.mariotaku.sqliteqb.library.Selectable;
import org.mariotaku.sqliteqb.library.Table;
import org.mariotaku.sqliteqb.library.Tables;
import org.mariotaku.sqliteqb.library.query.SQLSelectQuery;
import org.mariotaku.twidere.BuildConfig;
@ -168,7 +166,6 @@ import org.mariotaku.twidere.fragment.support.StatusFavoritersListFragment;
import org.mariotaku.twidere.fragment.support.StatusFragment;
import org.mariotaku.twidere.fragment.support.StatusRepliesListFragment;
import org.mariotaku.twidere.fragment.support.StatusRetweetersListFragment;
import org.mariotaku.twidere.fragment.support.StatusTranslateDialogFragment;
import org.mariotaku.twidere.fragment.support.StatusesListFragment;
import org.mariotaku.twidere.fragment.support.UserBlocksListFragment;
import org.mariotaku.twidere.fragment.support.UserFavoritesFragment;
@ -205,31 +202,14 @@ import org.mariotaku.twidere.model.ParcelableUserMention;
import org.mariotaku.twidere.model.PebbleMessage;
import org.mariotaku.twidere.provider.TwidereDataStore;
import org.mariotaku.twidere.provider.TwidereDataStore.Accounts;
import org.mariotaku.twidere.provider.TwidereDataStore.Activities;
import org.mariotaku.twidere.provider.TwidereDataStore.CacheFiles;
import org.mariotaku.twidere.provider.TwidereDataStore.CachedHashtags;
import org.mariotaku.twidere.provider.TwidereDataStore.CachedImages;
import org.mariotaku.twidere.provider.TwidereDataStore.CachedRelationships;
import org.mariotaku.twidere.provider.TwidereDataStore.CachedStatuses;
import org.mariotaku.twidere.provider.TwidereDataStore.CachedTrends;
import org.mariotaku.twidere.provider.TwidereDataStore.CachedUsers;
import org.mariotaku.twidere.provider.TwidereDataStore.DNS;
import org.mariotaku.twidere.provider.TwidereDataStore.DirectMessages;
import org.mariotaku.twidere.provider.TwidereDataStore.DirectMessages.ConversationEntries;
import org.mariotaku.twidere.provider.TwidereDataStore.Drafts;
import org.mariotaku.twidere.provider.TwidereDataStore.Filters;
import org.mariotaku.twidere.provider.TwidereDataStore.Filters.Users;
import org.mariotaku.twidere.provider.TwidereDataStore.Mentions;
import org.mariotaku.twidere.provider.TwidereDataStore.NetworkUsages;
import org.mariotaku.twidere.provider.TwidereDataStore.Notifications;
import org.mariotaku.twidere.provider.TwidereDataStore.Permissions;
import org.mariotaku.twidere.provider.TwidereDataStore.Preferences;
import org.mariotaku.twidere.provider.TwidereDataStore.SavedSearches;
import org.mariotaku.twidere.provider.TwidereDataStore.SearchHistory;
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses;
import org.mariotaku.twidere.provider.TwidereDataStore.Suggestions;
import org.mariotaku.twidere.provider.TwidereDataStore.Tabs;
import org.mariotaku.twidere.provider.TwidereDataStore.UnreadCounts;
import org.mariotaku.twidere.service.RefreshService;
import org.mariotaku.twidere.util.TwidereLinkify.HighlightStyle;
import org.mariotaku.twidere.util.content.ContentResolverUtils;
@ -245,7 +225,6 @@ import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.net.URLEncoder;
import java.nio.charset.Charset;
@ -280,106 +259,10 @@ public final class Utils implements Constants {
public static final Pattern PATTERN_XML_RESOURCE_IDENTIFIER = Pattern.compile("res/xml/([\\w_]+)\\.xml");
public static final Pattern PATTERN_RESOURCE_IDENTIFIER = Pattern.compile("@([\\w_]+)/([\\w_]+)");
private static final UriMatcher CONTENT_PROVIDER_URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
private static final UriMatcher LINK_HANDLER_URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
private static final UriMatcher HOME_TABS_URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
static {
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Accounts.CONTENT_PATH,
TABLE_ID_ACCOUNTS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Statuses.CONTENT_PATH,
TABLE_ID_STATUSES);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Mentions.CONTENT_PATH,
TABLE_ID_MENTIONS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Activities.AboutMe.CONTENT_PATH,
TABLE_ID_ACTIVITIES_ABOUT_ME);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Activities.ByFriends.CONTENT_PATH,
TABLE_ID_ACTIVITIES_BY_FRIENDS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Drafts.CONTENT_PATH,
TABLE_ID_DRAFTS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, CachedUsers.CONTENT_PATH,
TABLE_ID_CACHED_USERS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Filters.Users.CONTENT_PATH,
TABLE_ID_FILTERED_USERS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Filters.Keywords.CONTENT_PATH,
TABLE_ID_FILTERED_KEYWORDS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Filters.Sources.CONTENT_PATH,
TABLE_ID_FILTERED_SOURCES);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Filters.Links.CONTENT_PATH,
TABLE_ID_FILTERED_LINKS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, DirectMessages.CONTENT_PATH,
TABLE_ID_DIRECT_MESSAGES);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, DirectMessages.Inbox.CONTENT_PATH,
TABLE_ID_DIRECT_MESSAGES_INBOX);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, DirectMessages.Outbox.CONTENT_PATH,
TABLE_ID_DIRECT_MESSAGES_OUTBOX);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, DirectMessages.Conversation.CONTENT_PATH + "/#/#",
TABLE_ID_DIRECT_MESSAGES_CONVERSATION);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, DirectMessages.Conversation.CONTENT_PATH_SCREEN_NAME + "/#/*",
TABLE_ID_DIRECT_MESSAGES_CONVERSATION_SCREEN_NAME);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, DirectMessages.ConversationEntries.CONTENT_PATH,
TABLE_ID_DIRECT_MESSAGES_CONVERSATIONS_ENTRIES);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, CachedTrends.Local.CONTENT_PATH,
TABLE_ID_TRENDS_LOCAL);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Tabs.CONTENT_PATH,
TABLE_ID_TABS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, CachedStatuses.CONTENT_PATH,
TABLE_ID_CACHED_STATUSES);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, CachedHashtags.CONTENT_PATH,
TABLE_ID_CACHED_HASHTAGS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, CachedRelationships.CONTENT_PATH,
TABLE_ID_CACHED_RELATIONSHIPS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, SavedSearches.CONTENT_PATH,
TABLE_ID_SAVED_SEARCHES);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, SearchHistory.CONTENT_PATH,
TABLE_ID_SEARCH_HISTORY);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, NetworkUsages.CONTENT_PATH,
TABLE_ID_NETWORK_USAGES);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Notifications.CONTENT_PATH,
VIRTUAL_TABLE_ID_NOTIFICATIONS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Notifications.CONTENT_PATH + "/#",
VIRTUAL_TABLE_ID_NOTIFICATIONS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Notifications.CONTENT_PATH + "/#/#",
VIRTUAL_TABLE_ID_NOTIFICATIONS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Permissions.CONTENT_PATH,
VIRTUAL_TABLE_ID_PERMISSIONS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, DNS.CONTENT_PATH + "/*",
VIRTUAL_TABLE_ID_DNS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, CachedImages.CONTENT_PATH,
VIRTUAL_TABLE_ID_CACHED_IMAGES);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, CacheFiles.CONTENT_PATH + "/*",
VIRTUAL_TABLE_ID_CACHE_FILES);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Preferences.CONTENT_PATH,
VIRTUAL_TABLE_ID_ALL_PREFERENCES);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Preferences.CONTENT_PATH + "/*",
VIRTUAL_TABLE_ID_PREFERENCES);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, UnreadCounts.CONTENT_PATH,
VIRTUAL_TABLE_ID_UNREAD_COUNTS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, UnreadCounts.CONTENT_PATH + "/#",
VIRTUAL_TABLE_ID_UNREAD_COUNTS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, UnreadCounts.CONTENT_PATH + "/#/#/*",
VIRTUAL_TABLE_ID_UNREAD_COUNTS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, UnreadCounts.ByType.CONTENT_PATH + "/*",
VIRTUAL_TABLE_ID_UNREAD_COUNTS_BY_TYPE);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, TwidereDataStore.CONTENT_PATH_DATABASE_READY,
VIRTUAL_TABLE_ID_DATABASE_READY);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, CachedUsers.CONTENT_PATH_WITH_RELATIONSHIP + "/#",
VIRTUAL_TABLE_ID_CACHED_USERS_WITH_RELATIONSHIP);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, CachedUsers.CONTENT_PATH_WITH_SCORE + "/#",
VIRTUAL_TABLE_ID_CACHED_USERS_WITH_SCORE);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Drafts.CONTENT_PATH_UNSENT,
VIRTUAL_TABLE_ID_DRAFTS_UNSENT);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Drafts.CONTENT_PATH_NOTIFICATIONS,
VIRTUAL_TABLE_ID_DRAFTS_NOTIFICATIONS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Drafts.CONTENT_PATH_NOTIFICATIONS,
VIRTUAL_TABLE_ID_DRAFTS_NOTIFICATIONS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Suggestions.AutoComplete.CONTENT_PATH,
VIRTUAL_TABLE_ID_SUGGESTIONS_AUTO_COMPLETE);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Suggestions.Search.CONTENT_PATH,
VIRTUAL_TABLE_ID_SUGGESTIONS_SEARCH);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, TwidereDataStore.CONTENT_PATH_EMPTY,
VIRTUAL_TABLE_ID_EMPTY);
LINK_HANDLER_URI_MATCHER.addURI(AUTHORITY_STATUS, null, LINK_ID_STATUS);
LINK_HANDLER_URI_MATCHER.addURI(AUTHORITY_USER, null, LINK_ID_USER);
@ -422,8 +305,6 @@ public final class Utils implements Constants {
private static LongSparseArray<Integer> sAccountColors = new LongSparseArray<>();
private static LongSparseArray<String> sAccountScreenNames = new LongSparseArray<>();
private static LongSparseArray<String> sAccountNames = new LongSparseArray<>();
private Utils() {
throw new AssertionError("You are trying to create an instance for this utility class!");
@ -538,7 +419,7 @@ public final class Utils implements Constants {
public static String buildActivatedStatsWhereClause(final Context context, final String selection) {
if (context == null) return null;
final long[] account_ids = getActivatedAccountIds(context);
final long[] account_ids = DataStoreUtils.getActivatedAccountIds(context);
final Expression accountWhere = Expression.in(new Column(Statuses.ACCOUNT_ID), new RawItemArray(account_ids));
final Expression where;
if (selection != null) {
@ -559,110 +440,6 @@ public final class Utils implements Constants {
return builder.build();
}
@NonNull
public static Expression buildStatusFilterWhereClause(@NonNull final String table, final Expression extraSelection) {
final SQLSelectQuery filteredUsersQuery = SQLQueryBuilder
.select(new Column(new Table(Filters.Users.TABLE_NAME), Filters.Users.USER_ID))
.from(new Tables(Filters.Users.TABLE_NAME))
.build();
final Expression filteredUsersWhere = Expression.or(
Expression.in(new Column(new Table(table), Statuses.USER_ID), filteredUsersQuery),
Expression.in(new Column(new Table(table), Statuses.RETWEETED_BY_USER_ID), filteredUsersQuery),
Expression.in(new Column(new Table(table), Statuses.QUOTED_USER_ID), filteredUsersQuery)
);
final SQLSelectQuery.Builder filteredIdsQueryBuilder = SQLQueryBuilder
.select(true, new Column(new Table(table), Statuses._ID))
.from(new Tables(table))
.where(filteredUsersWhere)
.union()
.select(true, new Columns(new Column(new Table(table), Statuses._ID)))
.from(new Tables(table, Filters.Sources.TABLE_NAME))
.where(Expression.or(
Expression.likeRaw(new Column(new Table(table), Statuses.SOURCE),
"'%>'||" + Filters.Sources.TABLE_NAME + "." + Filters.Sources.VALUE + "||'</a>%'"),
Expression.likeRaw(new Column(new Table(table), Statuses.QUOTED_SOURCE),
"'%>'||" + Filters.Sources.TABLE_NAME + "." + Filters.Sources.VALUE + "||'</a>%'")
))
.union()
.select(true, new Columns(new Column(new Table(table), Statuses._ID)))
.from(new Tables(table, Filters.Keywords.TABLE_NAME))
.where(Expression.or(
Expression.likeRaw(new Column(new Table(table), Statuses.TEXT_PLAIN),
"'%'||" + Filters.Keywords.TABLE_NAME + "." + Filters.Keywords.VALUE + "||'%'"),
Expression.likeRaw(new Column(new Table(table), Statuses.QUOTED_TEXT_PLAIN),
"'%'||" + Filters.Keywords.TABLE_NAME + "." + Filters.Keywords.VALUE + "||'%'")
))
.union()
.select(true, new Columns(new Column(new Table(table), Statuses._ID)))
.from(new Tables(table, Filters.Links.TABLE_NAME))
.where(Expression.or(
Expression.likeRaw(new Column(new Table(table), Statuses.TEXT_HTML),
"'%>%'||" + Filters.Links.TABLE_NAME + "." + Filters.Links.VALUE + "||'%</a>%'"),
Expression.likeRaw(new Column(new Table(table), Statuses.QUOTED_TEXT_HTML),
"'%>%'||" + Filters.Links.TABLE_NAME + "." + Filters.Links.VALUE + "||'%</a>%'")
));
final Expression filterExpression = Expression.or(
Expression.notIn(new Column(new Table(table), Statuses._ID), filteredIdsQueryBuilder.build()),
Expression.equals(new Column(new Table(table), Statuses.IS_GAP), 1)
);
if (extraSelection != null) {
return Expression.and(filterExpression, extraSelection);
}
return filterExpression;
}
@NonNull
public static Expression buildActivityFilterWhereClause(@NonNull final String table, final Expression extraSelection) {
final SQLSelectQuery filteredUsersQuery = SQLQueryBuilder
.select(new Column(new Table(Filters.Users.TABLE_NAME), Filters.Users.USER_ID))
.from(new Tables(Filters.Users.TABLE_NAME))
.build();
final Expression filteredUsersWhere = Expression.or(
Expression.in(new Column(new Table(table), Activities.STATUS_USER_ID), filteredUsersQuery),
Expression.in(new Column(new Table(table), Activities.STATUS_RETWEETED_BY_USER_ID), filteredUsersQuery),
Expression.in(new Column(new Table(table), Activities.STATUS_QUOTED_USER_ID), filteredUsersQuery)
);
final SQLSelectQuery.Builder filteredIdsQueryBuilder = SQLQueryBuilder
.select(true, new Column(new Table(table), Activities._ID))
.from(new Tables(table))
.where(filteredUsersWhere)
.union()
.select(true, new Columns(new Column(new Table(table), Activities._ID)))
.from(new Tables(table, Filters.Sources.TABLE_NAME))
.where(Expression.or(
Expression.likeRaw(new Column(new Table(table), Activities.STATUS_SOURCE),
"'%>'||" + Filters.Sources.TABLE_NAME + "." + Filters.Sources.VALUE + "||'</a>%'"),
Expression.likeRaw(new Column(new Table(table), Activities.STATUS_QUOTE_SOURCE),
"'%>'||" + Filters.Sources.TABLE_NAME + "." + Filters.Sources.VALUE + "||'</a>%'")
))
.union()
.select(true, new Columns(new Column(new Table(table), Activities._ID)))
.from(new Tables(table, Filters.Keywords.TABLE_NAME))
.where(Expression.or(
Expression.likeRaw(new Column(new Table(table), Activities.STATUS_TEXT_PLAIN),
"'%'||" + Filters.Keywords.TABLE_NAME + "." + Filters.Keywords.VALUE + "||'%'"),
Expression.likeRaw(new Column(new Table(table), Activities.STATUS_QUOTE_TEXT_PLAIN),
"'%'||" + Filters.Keywords.TABLE_NAME + "." + Filters.Keywords.VALUE + "||'%'")
))
.union()
.select(true, new Columns(new Column(new Table(table), Activities._ID)))
.from(new Tables(table, Filters.Links.TABLE_NAME))
.where(Expression.or(
Expression.likeRaw(new Column(new Table(table), Activities.STATUS_TEXT_HTML),
"'%>%'||" + Filters.Links.TABLE_NAME + "." + Filters.Links.VALUE + "||'%</a>%'"),
Expression.likeRaw(new Column(new Table(table), Activities.STATUS_QUOTE_TEXT_HTML),
"'%>%'||" + Filters.Links.TABLE_NAME + "." + Filters.Links.VALUE + "||'%</a>%'")
));
final Expression filterExpression = Expression.or(
Expression.notIn(new Column(new Table(table), Activities._ID), filteredIdsQueryBuilder.build()),
Expression.equals(new Column(new Table(table), Activities.IS_GAP), 1)
);
if (extraSelection != null) {
return Expression.and(filterExpression, extraSelection);
}
return filterExpression;
}
public static int calculateInSampleSize(final int width, final int height, final int preferredWidth,
final int preferredHeight) {
if (preferredHeight > height && preferredWidth > width) return 1;
@ -687,7 +464,7 @@ public final class Utils implements Constants {
if (CachedStatuses.CONTENT_URI.equals(uri)) {
continue;
}
final String table = getTableNameByUri(uri);
final String table = DataStoreUtils.getTableNameByUri(uri);
final Expression account_where = new Expression(Statuses.ACCOUNT_ID + " = " + accountId);
final SQLSelectQuery.Builder qb = new SQLSelectQuery.Builder();
qb.select(new Column(Statuses._ID)).from(new Tables(table));
@ -698,7 +475,7 @@ public final class Utils implements Constants {
resolver.delete(uri, where.getSQL(), null);
}
for (final Uri uri : DIRECT_MESSAGES_URIS) {
final String table = getTableNameByUri(uri);
final String table = DataStoreUtils.getTableNameByUri(uri);
final Expression account_where = new Expression(DirectMessages.ACCOUNT_ID + " = " + accountId);
final SQLSelectQuery.Builder qb = new SQLSelectQuery.Builder();
qb.select(new Column(DirectMessages._ID)).from(new Tables(table));
@ -711,7 +488,7 @@ public final class Utils implements Constants {
}
// Clean cached values.
for (final Uri uri : CACHE_URIS) {
final String table = getTableNameByUri(uri);
final String table = DataStoreUtils.getTableNameByUri(uri);
if (table == null) continue;
final SQLSelectQuery.Builder qb = new SQLSelectQuery.Builder();
qb.select(new Column(BaseColumns._ID));
@ -728,7 +505,7 @@ public final class Utils implements Constants {
}
public static void clearAccountName() {
sAccountScreenNames.clear();
DataStoreUtils.sAccountScreenNames.clear();
}
public static void clearListViewChoices(final AbsListView view) {
@ -1182,7 +959,7 @@ public final class Utils implements Constants {
public static String getReadPositionTagWithAccounts(Context context, boolean activatedIfMissing, String tag, long... accountIds) {
if (accountIds == null || accountIds.length == 0 || (accountIds.length == 1 && accountIds[0] < 0)) {
final long[] activatedIds = getActivatedAccountIds(context);
final long[] activatedIds = DataStoreUtils.getActivatedAccountIds(context);
Arrays.sort(activatedIds);
return tag + "_" + TwidereArrayUtils.toString(activatedIds, '_', false);
}
@ -1380,7 +1157,7 @@ public final class Utils implements Constants {
if (nameFirst) {
name = getAccountName(context, accountId);
} else {
name = String.format("@%s", getAccountScreenName(context, accountId));
name = String.format("@%s", DataStoreUtils.getAccountScreenName(context, accountId));
}
return name;
}
@ -1433,7 +1210,7 @@ public final class Utils implements Constants {
public static String getAccountName(final Context context, final long accountId) {
if (context == null) return null;
final String cached = sAccountNames.get(accountId);
final String cached = DataStoreUtils.sAccountNames.get(accountId);
if (!isEmpty(cached)) return cached;
final Cursor cur = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI,
new String[]{Accounts.NAME}, Accounts.ACCOUNT_ID + " = " + accountId, null, null);
@ -1441,7 +1218,7 @@ public final class Utils implements Constants {
try {
if (cur.getCount() > 0 && cur.moveToFirst()) {
final String name = cur.getString(0);
sAccountNames.put(accountId, name);
DataStoreUtils.sAccountNames.put(accountId, name);
return name;
}
return null;
@ -1451,174 +1228,13 @@ public final class Utils implements Constants {
}
public static String[] getAccountNames(final Context context) {
return getAccountScreenNames(context, null);
}
public static String[] getAccountNames(final Context context, final long[] accountIds) {
if (context == null) return new String[0];
final String[] cols = new String[]{Accounts.NAME};
final String where = accountIds != null ? Expression.in(new Column(Accounts.ACCOUNT_ID),
new RawItemArray(accountIds)).getSQL() : null;
final Cursor cur = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI, cols, where,
null, null);
if (cur == null) return new String[0];
try {
cur.moveToFirst();
final String[] names = new String[cur.getCount()];
int i = 0;
while (!cur.isAfterLast()) {
names[i++] = cur.getString(0);
cur.moveToNext();
}
return names;
} finally {
cur.close();
}
return DataStoreUtils.getAccountScreenNames(context, null);
}
public static int getAccountNotificationId(final int notificationType, final long accountId) {
return Arrays.hashCode(new long[]{notificationType, accountId});
}
public static String getAccountScreenName(final Context context, final long accountId) {
if (context == null) return null;
final String cached = sAccountScreenNames.get(accountId);
if (!isEmpty(cached)) return cached;
final Cursor cur = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI,
new String[]{Accounts.SCREEN_NAME}, Accounts.ACCOUNT_ID + " = " + accountId, null, null);
if (cur == null) return null;
try {
if (cur.getCount() > 0 && cur.moveToFirst()) {
final String name = cur.getString(0);
sAccountScreenNames.put(accountId, name);
return name;
}
return null;
} finally {
cur.close();
}
}
public static String[] getAccountScreenNames(final Context context) {
return getAccountScreenNames(context, false);
}
public static String[] getAccountScreenNames(final Context context, final boolean includeAtChar) {
return getAccountScreenNames(context, null, includeAtChar);
}
public static String[] getAccountScreenNames(final Context context, final long[] accountIds) {
return getAccountScreenNames(context, accountIds, false);
}
public static String[] getAccountScreenNames(final Context context, final long[] accountIds,
final boolean includeAtChar) {
if (context == null) return new String[0];
final String[] cols = new String[]{Accounts.SCREEN_NAME};
final String where = accountIds != null ? Expression.in(new Column(Accounts.ACCOUNT_ID),
new RawItemArray(accountIds)).getSQL() : null;
final Cursor cur = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI, cols, where,
null, null);
if (cur == null) return new String[0];
try {
cur.moveToFirst();
final String[] screen_names = new String[cur.getCount()];
int i = 0;
while (!cur.isAfterLast()) {
screen_names[i++] = cur.getString(0);
cur.moveToNext();
}
return screen_names;
} finally {
cur.close();
}
}
public static long[] getActivatedAccountIds(final Context context) {
if (context == null) return new long[0];
final Cursor cur = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI,
new String[]{Accounts.ACCOUNT_ID}, Accounts.IS_ACTIVATED + " = 1", null, null);
if (cur == null) return new long[0];
try {
cur.moveToFirst();
final long[] ids = new long[cur.getCount()];
int i = 0;
while (!cur.isAfterLast()) {
ids[i++] = cur.getLong(0);
cur.moveToNext();
}
return ids;
} finally {
cur.close();
}
}
public static int getAllStatusesCount(final Context context, @NonNull final Uri uri) {
if (context == null) return 0;
final ContentResolver resolver = context.getContentResolver();
final String table = getTableNameByUri(uri);
if (table == null) return 0;
final Cursor cur = ContentResolverUtils.query(resolver, uri, new String[]{Statuses.STATUS_ID},
buildStatusFilterWhereClause(table, null).getSQL(),
null, null);
if (cur == null) return 0;
try {
return cur.getCount();
} finally {
cur.close();
}
}
public static int getStatusesCount(final Context context, final Uri uri, final long sinceId, final long... accountIds) {
if (context == null) return 0;
final ContentResolver resolver = context.getContentResolver();
final RawItemArray idsIn;
if (accountIds == null || accountIds.length == 0 || (accountIds.length == 1 && accountIds[0] < 0)) {
idsIn = new RawItemArray(getActivatedAccountIds(context));
} else {
idsIn = new RawItemArray(accountIds);
}
final Expression selection = Expression.and(
Expression.in(new Column(Statuses.ACCOUNT_ID), idsIn),
Expression.greaterThan(Statuses.STATUS_ID, sinceId),
buildStatusFilterWhereClause(getTableNameByUri(uri), null)
);
final Cursor cur = ContentResolverUtils.query(resolver, uri, new String[]{SQLFunctions.COUNT()},
selection.getSQL(),
null, null);
if (cur == null) return 0;
try {
if (cur.moveToFirst()) {
return cur.getInt(0);
}
} finally {
cur.close();
}
return 0;
}
@NonNull
public static long[] getAllStatusesIds(final Context context, final Uri uri) {
if (context == null) return new long[0];
final ContentResolver resolver = context.getContentResolver();
final String table = getTableNameByUri(uri);
if (table == null) return new long[0];
final Cursor cur = ContentResolverUtils.query(resolver, uri, new String[]{Statuses.STATUS_ID},
buildStatusFilterWhereClause(table, null).getSQL(),
null, null);
if (cur == null) return new long[0];
final long[] ids = new long[cur.getCount()];
cur.moveToFirst();
int i = 0;
while (!cur.isAfterLast()) {
ids[i] = cur.getLong(0);
cur.moveToNext();
i++;
}
cur.close();
return ids;
}
public static boolean isComposeNowSupported(Context context) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN || context == null) return false;
return hasNavBar(context);
@ -1792,7 +1408,7 @@ public final class Utils implements Constants {
public static String getDefaultAccountScreenName(final Context context) {
if (context == null) return null;
return getAccountScreenName(context, getDefaultAccountId(context));
return DataStoreUtils.getAccountScreenName(context, getDefaultAccountId(context));
}
public static int getDefaultTextSize(final Context context) {
@ -2097,69 +1713,6 @@ public final class Utils implements Constants {
return VALUE_TAB_DISPLAY_OPTION_CODE_BOTH;
}
public static int getTableId(final Uri uri) {
if (uri == null) return -1;
return CONTENT_PROVIDER_URI_MATCHER.match(uri);
}
public static String getTableNameById(final int id) {
switch (id) {
case TABLE_ID_ACCOUNTS:
return Accounts.TABLE_NAME;
case TABLE_ID_STATUSES:
return Statuses.TABLE_NAME;
case TABLE_ID_MENTIONS:
return Mentions.TABLE_NAME;
case TABLE_ID_ACTIVITIES_ABOUT_ME:
return Activities.AboutMe.TABLE_NAME;
case TABLE_ID_ACTIVITIES_BY_FRIENDS:
return Activities.ByFriends.TABLE_NAME;
case TABLE_ID_DRAFTS:
return Drafts.TABLE_NAME;
case TABLE_ID_FILTERED_USERS:
return Filters.Users.TABLE_NAME;
case TABLE_ID_FILTERED_KEYWORDS:
return Filters.Keywords.TABLE_NAME;
case TABLE_ID_FILTERED_SOURCES:
return Filters.Sources.TABLE_NAME;
case TABLE_ID_FILTERED_LINKS:
return Filters.Links.TABLE_NAME;
case TABLE_ID_DIRECT_MESSAGES_INBOX:
return DirectMessages.Inbox.TABLE_NAME;
case TABLE_ID_DIRECT_MESSAGES_OUTBOX:
return DirectMessages.Outbox.TABLE_NAME;
case TABLE_ID_DIRECT_MESSAGES:
return DirectMessages.TABLE_NAME;
case TABLE_ID_DIRECT_MESSAGES_CONVERSATIONS_ENTRIES:
return DirectMessages.ConversationEntries.TABLE_NAME;
case TABLE_ID_TRENDS_LOCAL:
return CachedTrends.Local.TABLE_NAME;
case TABLE_ID_TABS:
return Tabs.TABLE_NAME;
case TABLE_ID_CACHED_STATUSES:
return CachedStatuses.TABLE_NAME;
case TABLE_ID_CACHED_USERS:
return CachedUsers.TABLE_NAME;
case TABLE_ID_CACHED_HASHTAGS:
return CachedHashtags.TABLE_NAME;
case TABLE_ID_CACHED_RELATIONSHIPS:
return CachedRelationships.TABLE_NAME;
case TABLE_ID_SAVED_SEARCHES:
return SavedSearches.TABLE_NAME;
case TABLE_ID_SEARCH_HISTORY:
return SearchHistory.TABLE_NAME;
case TABLE_ID_NETWORK_USAGES:
return NetworkUsages.TABLE_NAME;
default:
return null;
}
}
public static String getTableNameByUri(final Uri uri) {
if (uri == null) return null;
return getTableNameById(getTableId(uri));
}
public static long getTimestampFromDate(final Date date) {
if (date == null) return -1;
return date.getTime();
@ -2471,21 +2024,6 @@ public final class Utils implements Constants {
return TwitterContentUtils.isOfficialKey(context, consumerKey, consumerSecret);
}
public static boolean isOnWifi(final Context context) {
if (context == null) return false;
final ConnectivityManager conn = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
final NetworkInfo networkInfo = conn.getActiveNetworkInfo();
return networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI
&& networkInfo.isConnected();
}
public static int getActiveNetworkType(final Context context) {
if (context == null) return -1;
final ConnectivityManager conn = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
final NetworkInfo networkInfo = conn.getActiveNetworkInfo();
return networkInfo != null && networkInfo.isConnected() ? networkInfo.getType() : -1;
}
public static boolean isRedirected(final int code) {
return code == 301 || code == 302 || code == 307;
}
@ -3623,29 +3161,6 @@ public final class Utils implements Constants {
SetUserNicknameDialogFragment.show(fm, status.user_id, nick);
break;
}
case R.id.translate: {
final ParcelableCredentials account
= ParcelableAccount.getCredentials(context, status.account_id);
if (isOfficialCredentials(context, account)) {
StatusTranslateDialogFragment.show(fm, status);
} else {
final Resources resources = context.getResources();
final Locale locale = resources.getConfiguration().locale;
try {
final String template = "http://translate.google.com/#%s|%s|%s";
final String sourceLang = "auto";
final String targetLang = URLEncoder.encode(locale.getLanguage(), "UTF-8");
final String text = URLEncoder.encode(status.text_unescaped, "UTF-8");
final Uri uri = Uri.parse(String.format(Locale.ROOT, template, sourceLang, targetLang, text));
final Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
context.startActivity(intent);
} catch (UnsupportedEncodingException ignore) {
}
}
break;
}
case R.id.open_with_account: {
final Intent intent = new Intent(INTENT_ACTION_SELECT_ACCOUNT);
intent.setClass(context, AccountSelectorActivity.class);

View File

@ -52,7 +52,6 @@ import org.mariotaku.twidere.provider.TwidereDataStore.CachedUsers;
import org.mariotaku.twidere.provider.TwidereDataStore.DirectMessages;
import org.mariotaku.twidere.provider.TwidereDataStore.Drafts;
import org.mariotaku.twidere.provider.TwidereDataStore.Filters;
import org.mariotaku.twidere.provider.TwidereDataStore.Mentions;
import org.mariotaku.twidere.provider.TwidereDataStore.NetworkUsages;
import org.mariotaku.twidere.provider.TwidereDataStore.SavedSearches;
import org.mariotaku.twidere.provider.TwidereDataStore.SearchHistory;
@ -80,7 +79,6 @@ public final class TwidereSQLiteOpenHelper extends SQLiteOpenHelper implements C
db.beginTransaction();
db.execSQL(createTable(Accounts.TABLE_NAME, Accounts.COLUMNS, Accounts.TYPES, true));
db.execSQL(createTable(Statuses.TABLE_NAME, Statuses.COLUMNS, Statuses.TYPES, true));
db.execSQL(createTable(Mentions.TABLE_NAME, Mentions.COLUMNS, Mentions.TYPES, true));
db.execSQL(createTable(Activities.AboutMe.TABLE_NAME, Activities.AboutMe.COLUMNS, Activities.AboutMe.TYPES, true));
db.execSQL(createTable(Activities.ByFriends.TABLE_NAME, Activities.ByFriends.COLUMNS, Activities.ByFriends.TYPES, true));
db.execSQL(createTable(Drafts.TABLE_NAME, Drafts.COLUMNS, Drafts.TYPES, true));
@ -120,7 +118,6 @@ public final class TwidereSQLiteOpenHelper extends SQLiteOpenHelper implements C
private void createIndices(SQLiteDatabase db) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return;
db.execSQL(createIndex("statuses_index", Statuses.TABLE_NAME, new String[]{Statuses.ACCOUNT_ID}, true));
db.execSQL(createIndex("mentions_index", Mentions.TABLE_NAME, new String[]{Statuses.ACCOUNT_ID}, true));
db.execSQL(createIndex("messages_inbox_index", DirectMessages.Inbox.TABLE_NAME, new String[]{DirectMessages.ACCOUNT_ID}, true));
db.execSQL(createIndex("messages_outbox_index", DirectMessages.Outbox.TABLE_NAME, new String[]{DirectMessages.ACCOUNT_ID}, true));
}
@ -134,14 +131,12 @@ public final class TwidereSQLiteOpenHelper extends SQLiteOpenHelper implements C
private void createTriggers(SQLiteDatabase db) {
db.execSQL(SQLQueryBuilder.dropTrigger(true, "delete_old_statuses").getSQL());
db.execSQL(SQLQueryBuilder.dropTrigger(true, "delete_old_mentions").getSQL());
db.execSQL(SQLQueryBuilder.dropTrigger(true, "delete_old_cached_statuses").getSQL());
db.execSQL(SQLQueryBuilder.dropTrigger(true, "delete_old_received_messages").getSQL());
db.execSQL(SQLQueryBuilder.dropTrigger(true, "delete_old_sent_messages").getSQL());
db.execSQL(SQLQueryBuilder.dropTrigger(true, "on_user_cache_update_trigger").getSQL());
db.execSQL(SQLQueryBuilder.dropTrigger(true, "delete_old_cached_hashtags").getSQL());
db.execSQL(createDeleteDuplicateStatusTrigger("delete_old_statuses", Statuses.TABLE_NAME).getSQL());
db.execSQL(createDeleteDuplicateStatusTrigger("delete_old_mentions", Mentions.TABLE_NAME).getSQL());
db.execSQL(createDeleteDuplicateStatusTrigger("delete_old_cached_statuses", CachedStatuses.TABLE_NAME).getSQL());
db.execSQL(createDeleteDuplicateMessageTrigger("delete_old_received_messages", DirectMessages.Inbox.TABLE_NAME).getSQL());
db.execSQL(createDeleteDuplicateMessageTrigger("delete_old_sent_messages", DirectMessages.Outbox.TABLE_NAME).getSQL());
@ -234,7 +229,6 @@ public final class TwidereSQLiteOpenHelper extends SQLiteOpenHelper implements C
draftsAlias.put(Drafts.MEDIA, "medias");
safeUpgrade(db, Accounts.TABLE_NAME, Accounts.COLUMNS, Accounts.TYPES, false, accountsAlias);
safeUpgrade(db, Statuses.TABLE_NAME, Statuses.COLUMNS, Statuses.TYPES, true, null);
safeUpgrade(db, Mentions.TABLE_NAME, Mentions.COLUMNS, Mentions.TYPES, true, null);
safeUpgrade(db, Activities.AboutMe.TABLE_NAME, Activities.AboutMe.COLUMNS,
Activities.AboutMe.TYPES, true, null);
safeUpgrade(db, Activities.ByFriends.TABLE_NAME, Activities.ByFriends.COLUMNS,

View File

@ -34,7 +34,7 @@ import com.squareup.okhttp.ResponseBody;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.model.RequestType;
import org.mariotaku.twidere.provider.TwidereDataStore.NetworkUsages;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.ConnectivityUtils;
import java.io.IOException;
import java.util.List;
@ -59,7 +59,7 @@ public class NetworkUsageUtils implements Constants {
public NetworkUsageInterceptor(Context context) {
this.context = context;
setNetworkType(Utils.getActiveNetworkType(context));
setNetworkType(ConnectivityUtils.getActiveNetworkType(context));
}
@Override

View File

@ -32,6 +32,7 @@ import android.widget.TextView;
import org.mariotaku.twidere.util.CompareUtils;
import org.mariotaku.twidere.util.support.view.ViewOutlineProviderCompat;
import org.mariotaku.twidere.view.iface.IForegroundView;
public final class ViewSupport {
@ -114,7 +115,9 @@ public final class ViewSupport {
public static void setForeground(View view, Drawable foreground) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
return;
if (view instanceof IForegroundView) {
view.setForeground(foreground);
}
} else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
ViewAccessorICS.setForeground(view, foreground);
} else {
@ -137,6 +140,8 @@ public final class ViewSupport {
if (view instanceof FrameLayout) {
//noinspection RedundantCast
((FrameLayout) view).setForeground(foreground);
} else if (view instanceof IForegroundView) {
view.setForeground(foreground);
}
}
}

View File

@ -53,9 +53,12 @@ public final class BirthdayView extends LayeredCanvasView {
private void init() {
setBackgroundColor(0xFF203040);
final AnimatedBitmapLayer tableLayer = new AnimatedBitmapLayer(getResources(), R.drawable.sprite_birthday_table_frames, 4, true);
final AnimatedBitmapLayer cakeLayer = new AnimatedBitmapLayer(getResources(), R.drawable.sprite_birthday_cake_frames, 4, false);
final AnimatedBitmapLayer lightStripLayer = new AnimatedBitmapLayer(getResources(), R.drawable.sprite_birthday_light_strip_frames, 4, true);
final AnimatedBitmapLayer tableLayer = new AnimatedBitmapLayer(getResources(),
R.drawable.sprite_birthday_table_frames, 4, true);
final AnimatedBitmapLayer cakeLayer = new AnimatedBitmapLayer(getResources(),
R.drawable.sprite_birthday_cake_frames, 4, false);
final AnimatedBitmapLayer lightStripLayer = new AnimatedBitmapLayer(getResources(),
R.drawable.sprite_birthday_light_strip_frames, 4, true);
tableLayer.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL);
tableLayer.setAntiAlias(false);
cakeLayer.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL);
@ -80,6 +83,7 @@ public final class BirthdayView extends LayeredCanvasView {
((AnimatedBitmapLayer) layers[2]).setScale(Math.max(1, w / 160));
}
@SuppressWarnings("deprecation")
@Override
protected boolean fitSystemWindows(@NonNull Rect insets) {
final int stripTop = Utils.getInsetsTopWithoutActionBarHeight(getContext(), insets.top);

View File

@ -87,184 +87,166 @@ public class ActivityTitleSummaryViewHolder extends ViewHolder implements View.O
public void displayActivity(ParcelableActivity activity, boolean byFriends) {
final Context context = adapter.getContext();
final Resources resources = adapter.getContext().getResources();
switch (activity.action) {
case Activity.ACTION_FOLLOW: {
activityTypeView.setImageResource(R.drawable.ic_activity_action_follow);
activityTypeView.setColorFilter(ContextCompat.getColor(context, R.color.highlight_follow), Mode.SRC_ATOP);
if (byFriends) {
titleView.setText(getTitleStringByFriends(R.string.activity_by_friends_follow,
R.string.activity_by_friends_follow_multi, activity.sources, activity.target_users));
} else {
titleView.setText(getTitleStringAboutMe(R.string.activity_about_me_follow,
R.string.activity_about_me_follow_multi, activity.sources));
}
displayUserProfileImages(activity.sources);
summaryView.setVisibility(View.GONE);
break;
final ParcelableUser[] sources = activity.getUnfilteredSources();
if (Activity.Action.FOLLOW.literal.equals(activity.action)) {
activityTypeView.setImageResource(R.drawable.ic_activity_action_follow);
activityTypeView.setColorFilter(ContextCompat.getColor(context, R.color.highlight_follow), Mode.SRC_ATOP);
if (byFriends) {
titleView.setText(getTitleStringByFriends(R.string.activity_by_friends_follow,
R.string.activity_by_friends_follow_multi, sources, activity.target_users));
} else {
titleView.setText(getTitleStringAboutMe(R.string.activity_about_me_follow,
R.string.activity_about_me_follow_multi, sources));
}
case Activity.ACTION_FAVORITE: {
if (adapter.shouldUseStarsForLikes()) {
activityTypeView.setImageResource(R.drawable.ic_activity_action_favorite);
activityTypeView.setColorFilter(ContextCompat.getColor(context, R.color.highlight_favorite), Mode.SRC_ATOP);
displayUserProfileImages(sources);
summaryView.setVisibility(View.GONE);
} else if (Activity.Action.FAVORITE.literal.equals(activity.action)) {
if (adapter.shouldUseStarsForLikes()) {
activityTypeView.setImageResource(R.drawable.ic_activity_action_favorite);
activityTypeView.setColorFilter(ContextCompat.getColor(context, R.color.highlight_favorite), Mode.SRC_ATOP);
if (byFriends) {
titleView.setText(getTitleStringByFriends(R.string.activity_by_friends_favorite,
R.string.activity_by_friends_favorite_multi, activity.sources, activity.target_statuses));
} else {
titleView.setText(getTitleStringAboutMe(R.string.activity_about_me_favorite,
R.string.activity_about_me_favorite_multi, activity.sources));
}
if (byFriends) {
titleView.setText(getTitleStringByFriends(R.string.activity_by_friends_favorite,
R.string.activity_by_friends_favorite_multi, sources, activity.target_statuses));
} else {
activityTypeView.setImageResource(R.drawable.ic_activity_action_like);
activityTypeView.setColorFilter(ContextCompat.getColor(context, R.color.highlight_like), Mode.SRC_ATOP);
titleView.setText(getTitleStringAboutMe(R.string.activity_about_me_favorite,
R.string.activity_about_me_favorite_multi, sources));
}
} else {
activityTypeView.setImageResource(R.drawable.ic_activity_action_like);
activityTypeView.setColorFilter(ContextCompat.getColor(context, R.color.highlight_like), Mode.SRC_ATOP);
if (byFriends) {
titleView.setText(getTitleStringByFriends(R.string.activity_by_friends_like,
R.string.activity_by_friends_like_multi, activity.sources, activity.target_statuses));
} else {
titleView.setText(getTitleStringAboutMe(R.string.activity_about_me_like,
R.string.activity_about_me_like_multi, activity.sources));
}
}
displayUserProfileImages(activity.sources);
summaryView.setText(activity.target_statuses[0].text_unescaped);
summaryView.setVisibility(View.VISIBLE);
break;
}
case Activity.ACTION_RETWEET: {
activityTypeView.setImageResource(R.drawable.ic_activity_action_retweet);
activityTypeView.setColorFilter(ContextCompat.getColor(context, R.color.highlight_retweet), Mode.SRC_ATOP);
if (byFriends) {
titleView.setText(getTitleStringByFriends(R.string.activity_by_friends_retweet,
R.string.activity_by_friends_retweet_multi, activity.sources, activity.target_statuses));
} else
titleView.setText(getTitleStringAboutMe(R.string.activity_about_me_retweet,
R.string.activity_about_me_retweet_multi, activity.sources));
displayUserProfileImages(activity.sources);
summaryView.setText(activity.target_statuses[0].text_unescaped);
summaryView.setVisibility(View.VISIBLE);
break;
}
case Activity.ACTION_FAVORITED_RETWEET: {
if (byFriends) {
showNotSupported();
return;
}
if (adapter.shouldUseStarsForLikes()) {
activityTypeView.setImageResource(R.drawable.ic_activity_action_favorite);
activityTypeView.setColorFilter(ContextCompat.getColor(context, R.color.highlight_favorite), Mode.SRC_ATOP);
titleView.setText(getTitleStringAboutMe(R.string.activity_about_me_favorited_retweet,
R.string.activity_about_me_favorited_retweet_multi, activity.sources));
titleView.setText(getTitleStringByFriends(R.string.activity_by_friends_like,
R.string.activity_by_friends_like_multi, sources, activity.target_statuses));
} else {
activityTypeView.setImageResource(R.drawable.ic_activity_action_like);
activityTypeView.setColorFilter(ContextCompat.getColor(context, R.color.highlight_like), Mode.SRC_ATOP);
titleView.setText(getTitleStringAboutMe(R.string.activity_about_me_liked_retweet,
R.string.activity_about_me_liked_retweet_multi, activity.sources));
titleView.setText(getTitleStringAboutMe(R.string.activity_about_me_like,
R.string.activity_about_me_like_multi, sources));
}
displayUserProfileImages(activity.sources);
summaryView.setText(activity.target_statuses[0].text_unescaped);
summaryView.setVisibility(View.VISIBLE);
break;
}
case Activity.ACTION_RETWEETED_RETWEET: {
if (byFriends) {
showNotSupported();
return;
}
activityTypeView.setImageResource(R.drawable.ic_activity_action_retweet);
activityTypeView.setColorFilter(ContextCompat.getColor(context, R.color.highlight_retweet), Mode.SRC_ATOP);
titleView.setText(getTitleStringAboutMe(R.string.activity_about_me_retweeted_retweet,
R.string.activity_about_me_retweeted_retweet_multi, activity.sources));
displayUserProfileImages(activity.sources);
summaryView.setText(activity.target_statuses[0].text_unescaped);
summaryView.setVisibility(View.VISIBLE);
break;
displayUserProfileImages(sources);
summaryView.setText(activity.target_statuses[0].text_unescaped);
summaryView.setVisibility(View.VISIBLE);
} else if (Activity.Action.RETWEET.literal.equals(activity.action)) {
activityTypeView.setImageResource(R.drawable.ic_activity_action_retweet);
activityTypeView.setColorFilter(ContextCompat.getColor(context, R.color.highlight_retweet), Mode.SRC_ATOP);
if (byFriends) {
titleView.setText(getTitleStringByFriends(R.string.activity_by_friends_retweet,
R.string.activity_by_friends_retweet_multi, sources, activity.target_statuses));
} else
titleView.setText(getTitleStringAboutMe(R.string.activity_about_me_retweet,
R.string.activity_about_me_retweet_multi, sources));
displayUserProfileImages(sources);
summaryView.setText(activity.target_statuses[0].text_unescaped);
summaryView.setVisibility(View.VISIBLE);
} else if (Activity.Action.FAVORITED_RETWEET.literal.equals(activity.action)) {
if (byFriends) {
showNotSupported();
return;
}
case Activity.ACTION_RETWEETED_MENTION: {
if (byFriends) {
showNotSupported();
return;
}
activityTypeView.setImageResource(R.drawable.ic_activity_action_retweet);
activityTypeView.setColorFilter(ContextCompat.getColor(context, R.color.highlight_retweet), Mode.SRC_ATOP);
titleView.setText(getTitleStringAboutMe(R.string.activity_about_me_retweeted_mention,
R.string.activity_about_me_retweeted_mention_multi, activity.sources));
displayUserProfileImages(activity.sources);
summaryView.setText(activity.target_statuses[0].text_unescaped);
summaryView.setVisibility(View.VISIBLE);
break;
if (adapter.shouldUseStarsForLikes()) {
activityTypeView.setImageResource(R.drawable.ic_activity_action_favorite);
activityTypeView.setColorFilter(ContextCompat.getColor(context, R.color.highlight_favorite), Mode.SRC_ATOP);
titleView.setText(getTitleStringAboutMe(R.string.activity_about_me_favorited_retweet,
R.string.activity_about_me_favorited_retweet_multi, sources));
} else {
activityTypeView.setImageResource(R.drawable.ic_activity_action_like);
activityTypeView.setColorFilter(ContextCompat.getColor(context, R.color.highlight_like), Mode.SRC_ATOP);
titleView.setText(getTitleStringAboutMe(R.string.activity_about_me_liked_retweet,
R.string.activity_about_me_liked_retweet_multi, sources));
}
case Activity.ACTION_FAVORITED_MENTION: {
if (byFriends) {
showNotSupported();
return;
}
if (adapter.shouldUseStarsForLikes()) {
activityTypeView.setImageResource(R.drawable.ic_activity_action_favorite);
activityTypeView.setColorFilter(ContextCompat.getColor(context, R.color.highlight_favorite), Mode.SRC_ATOP);
titleView.setText(getTitleStringAboutMe(R.string.activity_about_me_favorited_mention,
R.string.activity_about_me_favorited_mention_multi, activity.sources));
} else {
activityTypeView.setImageResource(R.drawable.ic_activity_action_like);
activityTypeView.setColorFilter(ContextCompat.getColor(context, R.color.highlight_like), Mode.SRC_ATOP);
titleView.setText(getTitleStringAboutMe(R.string.activity_about_me_liked_mention,
R.string.activity_about_me_liked_mention_multi, activity.sources));
}
displayUserProfileImages(activity.sources);
summaryView.setText(activity.target_statuses[0].text_unescaped);
summaryView.setVisibility(View.VISIBLE);
break;
displayUserProfileImages(sources);
summaryView.setText(activity.target_statuses[0].text_unescaped);
summaryView.setVisibility(View.VISIBLE);
} else if (Activity.Action.RETWEETED_RETWEET.literal.equals(activity.action)) {
if (byFriends) {
showNotSupported();
return;
}
case Activity.ACTION_LIST_CREATED: {
if (!byFriends) {
showNotSupported();
return;
}
activityTypeView.setImageResource(R.drawable.ic_activity_action_list_added);
activityTypeView.setColorFilter(activityTypeView.getDefaultColor(), Mode.SRC_ATOP);
titleView.setText(getTitleStringByFriends(R.string.activity_by_friends_list_created,
R.string.activity_by_friends_list_created_multi, activity.sources,
activity.target_object_user_lists));
displayUserProfileImages(activity.sources);
boolean firstLine = true;
summaryView.setText("");
for (ParcelableUserList item : activity.target_object_user_lists) {
if (!firstLine) {
summaryView.append("\n");
}
summaryView.append(item.description);
firstLine = false;
}
summaryView.setVisibility(View.VISIBLE);
break;
activityTypeView.setImageResource(R.drawable.ic_activity_action_retweet);
activityTypeView.setColorFilter(ContextCompat.getColor(context, R.color.highlight_retweet), Mode.SRC_ATOP);
titleView.setText(getTitleStringAboutMe(R.string.activity_about_me_retweeted_retweet,
R.string.activity_about_me_retweeted_retweet_multi, sources));
displayUserProfileImages(sources);
summaryView.setText(activity.target_statuses[0].text_unescaped);
summaryView.setVisibility(View.VISIBLE);
} else if (Activity.Action.RETWEETED_MENTION.literal.equals(activity.action)) {
if (byFriends) {
showNotSupported();
return;
}
case Activity.ACTION_LIST_MEMBER_ADDED: {
if (byFriends) {
showNotSupported();
return;
}
activityTypeView.setImageResource(R.drawable.ic_activity_action_list_added);
activityTypeView.setColorFilter(activityTypeView.getDefaultColor(), Mode.SRC_ATOP);
if (activity.sources.length == 1 && activity.target_object_user_lists != null
&& activity.target_object_user_lists.length == 1) {
final UserColorNameManager manager = adapter.getUserColorNameManager();
final SpannableString firstDisplayName = new SpannableString(manager.getDisplayName(
activity.sources[0], adapter.isNameFirst(), false));
final SpannableString listName = new SpannableString(activity.target_object_user_lists[0].name);
firstDisplayName.setSpan(new StyleSpan(Typeface.BOLD), 0, firstDisplayName.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
listName.setSpan(new StyleSpan(Typeface.BOLD), 0, listName.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
final String format = context.getString(R.string.activity_about_me_list_member_added_with_name);
final Configuration configuration = resources.getConfiguration();
titleView.setText(SpanFormatter.format(configuration.locale, format, firstDisplayName,
listName));
} else {
titleView.setText(getTitleStringAboutMe(R.string.activity_about_me_list_member_added,
R.string.activity_about_me_list_member_added_multi, activity.sources));
}
displayUserProfileImages(activity.sources);
summaryView.setVisibility(View.GONE);
break;
activityTypeView.setImageResource(R.drawable.ic_activity_action_retweet);
activityTypeView.setColorFilter(ContextCompat.getColor(context, R.color.highlight_retweet), Mode.SRC_ATOP);
titleView.setText(getTitleStringAboutMe(R.string.activity_about_me_retweeted_mention,
R.string.activity_about_me_retweeted_mention_multi, sources));
displayUserProfileImages(sources);
summaryView.setText(activity.target_statuses[0].text_unescaped);
summaryView.setVisibility(View.VISIBLE);
} else if (Activity.Action.FAVORITED_MENTION.literal.equals(activity.action)) {
if (byFriends) {
showNotSupported();
return;
}
if (adapter.shouldUseStarsForLikes()) {
activityTypeView.setImageResource(R.drawable.ic_activity_action_favorite);
activityTypeView.setColorFilter(ContextCompat.getColor(context, R.color.highlight_favorite), Mode.SRC_ATOP);
titleView.setText(getTitleStringAboutMe(R.string.activity_about_me_favorited_mention,
R.string.activity_about_me_favorited_mention_multi, sources));
} else {
activityTypeView.setImageResource(R.drawable.ic_activity_action_like);
activityTypeView.setColorFilter(ContextCompat.getColor(context, R.color.highlight_like), Mode.SRC_ATOP);
titleView.setText(getTitleStringAboutMe(R.string.activity_about_me_liked_mention,
R.string.activity_about_me_liked_mention_multi, sources));
}
displayUserProfileImages(sources);
summaryView.setText(activity.target_statuses[0].text_unescaped);
summaryView.setVisibility(View.VISIBLE);
} else if (Activity.Action.LIST_CREATED.literal.equals(activity.action)) {
if (!byFriends) {
showNotSupported();
return;
}
activityTypeView.setImageResource(R.drawable.ic_activity_action_list_added);
activityTypeView.setColorFilter(activityTypeView.getDefaultColor(), Mode.SRC_ATOP);
titleView.setText(getTitleStringByFriends(R.string.activity_by_friends_list_created,
R.string.activity_by_friends_list_created_multi, sources,
activity.target_object_user_lists));
displayUserProfileImages(sources);
boolean firstLine = true;
summaryView.setText("");
for (ParcelableUserList item : activity.target_object_user_lists) {
if (!firstLine) {
summaryView.append("\n");
}
summaryView.append(item.description);
firstLine = false;
}
summaryView.setVisibility(View.VISIBLE);
} else if (Activity.Action.LIST_MEMBER_ADDED.literal.equals(activity.action)) {
if (byFriends) {
showNotSupported();
return;
}
activityTypeView.setImageResource(R.drawable.ic_activity_action_list_added);
activityTypeView.setColorFilter(activityTypeView.getDefaultColor(), Mode.SRC_ATOP);
if (sources.length == 1 && activity.target_object_user_lists != null
&& activity.target_object_user_lists.length == 1) {
final UserColorNameManager manager = adapter.getUserColorNameManager();
final SpannableString firstDisplayName = new SpannableString(manager.getDisplayName(
sources[0], adapter.isNameFirst(), false));
final SpannableString listName = new SpannableString(activity.target_object_user_lists[0].name);
firstDisplayName.setSpan(new StyleSpan(Typeface.BOLD), 0, firstDisplayName.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
listName.setSpan(new StyleSpan(Typeface.BOLD), 0, listName.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
final String format = context.getString(R.string.activity_about_me_list_member_added_with_name);
final Configuration configuration = resources.getConfiguration();
titleView.setText(SpanFormatter.format(configuration.locale, format, firstDisplayName,
listName));
} else {
titleView.setText(getTitleStringAboutMe(R.string.activity_about_me_list_member_added,
R.string.activity_about_me_list_member_added_multi, sources));
}
displayUserProfileImages(sources);
summaryView.setVisibility(View.GONE);
}
}

View File

@ -3,11 +3,20 @@ package org.mariotaku.twidere.view.holder;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import org.mariotaku.twidere.R;
/**
* Created by mariotaku on 14/11/19.
*/
public class LoadIndicatorViewHolder extends RecyclerView.ViewHolder {
private final View loadProgress;
public LoadIndicatorViewHolder(View view) {
super(view);
loadProgress = view.findViewById(R.id.load_progress);
}
public void setLoadProgressVisible(boolean visible) {
loadProgress.setVisibility(visible ? View.VISIBLE : View.GONE);
}
}

View File

@ -18,7 +18,6 @@ import org.apache.commons.lang3.ArrayUtils;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.adapter.iface.IStatusesAdapter;
import org.mariotaku.twidere.api.twitter.model.TranslationResult;
import org.mariotaku.twidere.model.ParcelableLocation;
import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.model.ParcelableStatus;
@ -132,12 +131,12 @@ public class StatusViewHolder extends ViewHolder implements Constants, OnClickLi
@Override
public void displayStatus(final ParcelableStatus status, final boolean displayInReplyTo) {
displayStatus(status, null, displayInReplyTo, true);
displayStatus(status, displayInReplyTo, true);
}
@Override
public void displayStatus(@NonNull final ParcelableStatus status, @Nullable final TranslationResult translation,
final boolean displayInReplyTo, final boolean shouldDisplayExtraType) {
public void displayStatus(@NonNull final ParcelableStatus status, final boolean displayInReplyTo,
final boolean shouldDisplayExtraType) {
final MediaLoaderWrapper loader = adapter.getMediaLoader();
final AsyncTwitterWrapper twitter = adapter.getTwitterWrapper();
final TwidereLinkify linkify = adapter.getTwidereLinkify();
@ -253,9 +252,7 @@ public class StatusViewHolder extends ViewHolder implements Constants, OnClickLi
} else {
mediaPreview.setVisibility(View.GONE);
}
if (translation != null) {
textView.setText(translation.getText());
} else if (adapter.getLinkHighlightingStyle() == VALUE_LINK_HIGHLIGHT_OPTION_CODE_NONE) {
if (adapter.getLinkHighlightingStyle() == VALUE_LINK_HIGHLIGHT_OPTION_CODE_NONE) {
textView.setText(status.text_unescaped);
} else {
final Spanned text = HtmlSpanBuilder.fromHtml(status.text_html);

View File

@ -25,7 +25,6 @@ import android.view.View;
import android.widget.ImageView;
import org.mariotaku.twidere.adapter.iface.ContentCardClickListener;
import org.mariotaku.twidere.api.twitter.model.TranslationResult;
import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.view.CardMediaContainer;
@ -36,7 +35,7 @@ import org.mariotaku.twidere.view.CardMediaContainer;
public interface IStatusViewHolder extends CardMediaContainer.OnMediaClickListener {
void displayStatus(ParcelableStatus status, boolean displayInReplyTo);
void displayStatus(@NonNull ParcelableStatus status, @Nullable TranslationResult translation,
void displayStatus(@NonNull ParcelableStatus status,
boolean displayInReplyTo, boolean shouldDisplayExtraType);
@Nullable

View File

@ -0,0 +1 @@
Keep this directory from deleting

View File

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources xmlns:tools="http://schemas.android.com/tools" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_description">برنامجك الخاص لتويتر</string>
<string name="compose">كتابة</string>
<string name="add_account">اضافة حساب</string>
<string name="settings">الاعدادات</string>
@ -44,6 +45,7 @@
<string name="password">كلمة المرور</string>
<string name="label_data_provider">مزود قاعدة بيانات Twidere</string>
<string name="label_refresh_service">تحديث الخدمة</string>
<string name="label_streaming_service">خدمة البث المتواصل</string>
<string name="label_background_operation_service">خدمة التشغيل في الخلفية</string>
<string name="open_in_browser">فتح بالمستعرض</string>
<string name="tap_to_load_more">اضغط للتحميل اكثر</string>
@ -53,6 +55,8 @@
<string name="cancel_retweet">إلغاء إعادة التغريد</string>
<string name="favorite">تفضيل</string>
<string name="unfavorite">إزالة التفضيل</string>
<string name="like">اعجاب</string>
<string name="undo_like">إلغاء الاعجاب</string>
<string name="reply">رد</string>
<string name="share">مشاركة</string>
<string name="view_image">صورة</string>
@ -96,6 +100,7 @@
<string name="retweeted_by_count">أعاد تغريدها <xliff:g id="retweet_count">%d</xliff:g> شخصًا</string>
<string name="users_retweeted_this">المستخدمين الذين قاموا بإعادة التغريد</string>
<string name="users_favorited_this">المستخدمون الذين فضلوا التغريدة</string>
<string name="users_liked_this">اعجب المستخدمون</string>
<string name="reply_to">الرد على <xliff:g id="user_name">%s</xliff:g></string>
<string name="quote_user">إقتباس <xliff:g id="user_name">%s</xliff:g></string>
<string name="time_source"><xliff:g id="time">%1$s</xliff:g> · <xliff:g id="source">%2$s</xliff:g></string>
@ -129,6 +134,7 @@
<string name="location">الموقع</string>
<string name="url">الموقع</string>
<string name="favorites">المفضلة</string>
<string name="likes">إعجاب</string>
<string name="name">الإسم</string>
<string name="refresh">تحديث</string>
<string name="retry">إعادة المحاولة</string>
@ -209,6 +215,7 @@
<string name="accounts">الحسابات</string>
<string name="account">حساب</string>
<string name="mention_this_user">الإشارة لهذا المستخدم</string>
<string name="mention_user_name">إذكر <xliff:g id="name">%1$s</xliff:g></string>
<string name="signing_in_please_wait">يسجّل الدخول، يرجى الانتظار أو اضغط على زر العودة الخروج.</string>
<string name="connectivity">الإتصال</string>
<string name="add_member">إضافة عضو</string>
@ -241,6 +248,7 @@
<string name="status_shortener">مُقصّر التغريدة</string>
<string name="status_shortener_default">لايوجد (الغِ الارسال)</string>
<string name="error_message_status_too_long">تغريدتك طويلة جدا.</string>
<string name="error_message_message_too_long">الرسالة طويلة.</string>
<string name="error_message_no_content">لا محتوى</string>
<string name="error_message_tweet_shorten_failed">فشل في تقصير التغريدة.</string>
<string name="error_message_tweet_shortener_not_found">لم يتم العثور على مختصِر التغريدات ، ربما تم إلغاء تثبيته.</string>
@ -264,15 +272,37 @@
<string name="activity_about_me_favorite_multi"><xliff:g id="user">%1$s</xliff:g> و <xliff:g id="other">%2$s</xliff:g> فضّلا تغريدتك.</string>
<string name="activity_about_me_favorited_retweet"><xliff:g id="user">%s</xliff:g> من المغرّدين فضّلوا تغريدتك.</string>
<string name="activity_about_me_favorited_retweet_multi"><xliff:g id="user">%1$s</xliff:g> و <xliff:g id="other">%2$s</xliff:g> آخرين فضّلوا تغريدتك.</string>
<string name="activity_about_me_like"><xliff:g id="user">%s</xliff:g> أُعجب بتغريدتك.</string>
<string name="activity_about_me_like_multi"><xliff:g id="user">%1$s</xliff:g> and <xliff:g id="other">%2$s</xliff:g> أُعجبوا بتغريدتك.</string>
<string name="activity_about_me_liked_retweet"><xliff:g id="user">%s</xliff:g> أُعجب بإعادة تغريدك.</string>
<string name="activity_about_me_liked_retweet_multi"><xliff:g id="user">%1$s</xliff:g> and <xliff:g id="other">%2$s</xliff:g> أُعجبوا بإعادة تغريدك.</string>
<string name="activity_about_me_follow"><xliff:g id="user">%s</xliff:g> يتابعك.</string>
<string name="activity_about_me_follow_multi"><xliff:g id="user">%1$s</xliff:g> و<xliff:g id="other">%2$s</xliff:g> تابعوك.</string>
<string name="activity_about_me_retweet"><xliff:g id="user">%s</xliff:g> أعاد تغريدتك.</string>
<string name="activity_about_me_retweet_multi"><xliff:g id="user">%1$s</xliff:g> و<xliff:g id="other">%2$s</xliff:g> أعادوا تغريد تغريدتك.</string>
<string name="activity_about_me_retweeted_retweet"><xliff:g id="user">%s</xliff:g> أعاد تغريد تغريدتك.</string>
<string name="activity_about_me_retweeted_retweet_multi"><xliff:g id="user">%1$s</xliff:g> و<xliff:g id="other">%2$s</xliff:g> أعادوا تغريد تغريدتك المعادة.</string>
<string name="activity_about_me_retweeted_mention"><xliff:g id="user">%s</xliff:g> أعاد تغريدة تم الإشارة لك فيها.</string>
<string name="activity_about_me_retweeted_mention_multi"><xliff:g id="user">%s</xliff:g> و<xliff:g id="other">%2$s</xliff:g> أعادوا تغريدة تم الإشارة لك فيها.</string>
<string name="activity_about_me_favorited_mention"><xliff:g id="user">%s</xliff:g> فضّل تتغريدة تم الإشارة لك فيها.</string>
<string name="activity_about_me_favorited_mention_multi"><xliff:g id="user">%s</xliff:g> و<xliff:g id="other">%2$s</xliff:g> فضّلوا تغريدة تم الإشارة لك فيها.</string>
<string name="activity_about_me_liked_mention"><xliff:g id="user">%s</xliff:g> أُعجب بتغريدة تم الإشارة لك فيها.</string>
<string name="activity_about_me_liked_mention_multi"><xliff:g id="user">%s</xliff:g> و <xliff:g id="other">%2$s</xliff:g> أُعجبوا بتغريدة تم الإشارة لك فيها.</string>
<string name="activity_about_me_list_member_added"><xliff:g id="user">%s</xliff:g> أضافك إلى قائمة.</string>
<string name="activity_about_me_list_member_added_with_name"><xliff:g id="user">%1$s</xliff:g> أضافك لقائمة <xliff:g id="list">%2$s</xliff:g>\".</string>
<string name="activity_about_me_list_member_added_multi"><xliff:g id="user">%1$s</xliff:g> و<xliff:g id="other">%2$s</xliff:g> أضافوك إلى قوائمهم.</string>
<string name="activity_by_friends_favorite"><xliff:g id="user">%1$s</xliff:g> فضّل تغريدة <xliff:g id="target">%2$s</xliff:g>.</string>
<string name="activity_by_friends_favorite_multi"><xliff:g id="user">%1$s</xliff:g> فضّل <xliff:g id="target">%2$s</xliff:g> و تغريدات <xliff:g id="other">%3$s</xliff:g>.</string>
<string name="activity_by_friends_like"><xliff:g id="user">%1$s</xliff:g> أُعجب بتغريدات <xliff:g id="target">%2$s</xliff:g>.</string>
<string name="activity_by_friends_like_multi"><xliff:g id="user">%1$s</xliff:g> أُعجب <xliff:g id="target">%2$s</xliff:g> و تغريدات<xliff:g id="other">%3$s</xliff:g>.</string>
<string name="activity_by_friends_follow"><xliff:g id="user">%1$s</xliff:g> تابَع <xliff:g id="target">%2$s</xliff:g>.</string>
<string name="activity_by_friends_follow_multi"><xliff:g id="user">%1$s</xliff:g> تابع <xliff:g id="target">%2$s</xliff:g> و <xliff:g id="other">%3$s</xliff:g>.</string>
<string name="activity_by_friends_retweet"><xliff:g id="user">%1$s</xliff:g> أعاد تغريدة <xliff:g id="target">%2$s</xliff:g>.</string>
<string name="activity_by_friends_retweet_multi"><xliff:g id="user">%1$s</xliff:g> أعاد تغريد <xliff:g id="target">%2$s</xliff:g> و تغريدات <xliff:g id="other">%3$s</xliff:g>\'s tweet.</string>
<string name="activity_by_friends_list_member_added"><xliff:g id="user">%1$s</xliff:g> أضاف <xliff:g id="target">%2$s</xliff:g> إلى قائمة.</string>
<string name="activity_by_friends_list_member_added_multi"><xliff:g id="user">%1$s</xliff:g> أضاف <xliff:g id="target">%2$s</xliff:g> و <xliff:g id="other">%1$s</xliff:g> للقائمة.</string>
<string name="activity_by_friends_list_created"><xliff:g id="user">%1$s</xliff:g> أنشئ القائمة <xliff:g id="target">%2$s</xliff:g>.</string>
<string name="activity_by_friends_list_created_multi"><xliff:g id="user">%1$s</xliff:g>أنشأ قائمة <xliff:g id="target">%2$s</xliff:g> و <xliff:g id="other">%1$s</xliff:g>.</string>
<string name="status_not_updated">لم تُرسل التغريدة.</string>
<string name="status_not_updated_summary">لم تُرسل التغريدة لكنها حُفظت مسودة.</string>
<string name="incoming_friendships">في انتظار طلب المتابعة</string>
@ -328,6 +358,7 @@
<string name="hashtag">وسم</string>
<string name="links">روابط</string>
<string name="edit_profile">تعديل الملف الشخصي</string>
<string name="edit_details">تعديل التفاصيل</string>
<string name="display_sensitive_contents">عرض المحتويات الحساسة</string>
<string name="display_sensitive_contents_summary">عرض المحتويات الحساسة دون إشعار في الخط الزمني</string>
<string name="sensitive_content_warning">يحتمل أن تحتوي هذه التغريدة على محتوى حساس, هل أُكمل؟</string>
@ -340,6 +371,9 @@
<string name="clear_search_history">محو سجل البحث</string>
<string name="permission_description_none">لا يوجد صلاحيات مُحتاجة.</string>
<string name="permission_description_refresh">تحديث الخط الزمني (بما في ذلك الرسائل الخاصة)</string>
<string name="permission_description_read">قراءة التغريدات وبعض البيانات المؤقتة</string>
<string name="permission_description_write">ارسال لقاعدة البيانات، في حالة تحديث</string>
<string name="permission_description_direct_messages">قراءة/كتابة/ارسال الرسائل المباشرة</string>
<string name="permission_description_accounts">الإطلاع على معلومات الحساب</string>
<string name="permission_description_preferences">إعدادات القراءة</string>
<string name="permissions_request">طلب الصلاحيات</string>
@ -348,6 +382,7 @@
<string name="no_thanks">لا، شكرا</string>
<string name="revoke_permissions">إبطال الإستئذانات</string>
<string name="fast_scroll_thumb">تنقل الإبهام السريع</string>
<string name="indicate_your_status">إشارة الى تغريدتك</string>
<string name="default_ringtone">الرنة الافتراضية</string>
<string name="phishing_link_warning">تحذير من الوصلات الملغومة</string>
<string name="phishing_link_warning_summary">سأحذّرك عند فتح وصلة يمكن أن تكون ملغومةً في رسالة خاصّة.</string>
@ -361,12 +396,15 @@
<string name="quote_protected_status_notice">لا يُنصح بإقتباس تغريدةٍ محمية.</string>
<string name="edit_draft">تعدبل المسودة</string>
<string name="profile_image">صورة الملف الشخصي</string>
<string name="your_profile_image">صورة الملف الشخصي</string>
<string name="mention_user">الإشارة إلى <xliff:g id="user">%s</xliff:g></string>
<string name="theme_color">لون السِمَة</string>
<string name="wrong_url_format">صيغة الرابط خاطئة.</string>
<string name="wrong_username_password">إسم المستخدم أو كلمة السر خاطئة.</string>
<string name="network_error">خطأ في الشبكة.</string>
<string name="api_data_corrupted">بيانات الواجهة البرمجية تالفة.</string>
<string name="ssl_error">خطأ في تشفير SSL، تحتاج لتفعيل خيار Ignore SSL error.</string>
<string name="wrong_api_key">رابط API أو شيفرة consumer key/secret غير صحيحة ، تأكد منها مرة أخرى.</string>
<string name="status_updated">أُرسلت التغريدة.</string>
<string name="status_deleted">حُذفت التغريدة.</string>
<string name="status_favorited">فضّلت التغريدة.</string>
@ -381,6 +419,7 @@
<string name="search_name_deleted">حُذِف البحث \"<xliff:g id="name">%s</xliff:g>\".</string>
<string name="import_from">استيراد من &#8230;</string>
<string name="link_to_quoted_status">ربط لتغريدة مقتبسة</string>
<string name="quote_original_status">اقتباس التغريدة الأصلية</string>
<string name="followed_user">تابعتَ <xliff:g id="user">%s</xliff:g>.</string>
<string name="sent_follow_request_to_user">أرسل طلب المتابعة إلى <xliff:g id="user">%s</xliff:g>.</string>
<string name="unfollowed_user">ألغيت متابعة <xliff:g id="user">%s</xliff:g>.</string>
@ -398,11 +437,15 @@
<string name="added_N_users_to_list_quantity_other" tools:ignore="PluralsCandidate">أُضيف <xliff:g id="items">%1$d</xliff:g> من المستخدمين إلى القائمة "<xliff:g id="list">%2$s</xliff:g>\".</string>
<string name="added_user_to_list">أُضيف <xliff:g id="user">%1$s</xliff:g> إلى قائمة "<xliff:g id="list">%2$s</xliff:g>\".</string>
<string name="deleted_user_from_list">حُذف <xliff:g id="user">%1$s</xliff:g> من قائمة "<xliff:g id="list">%2$s</xliff:g>\".</string>
<string name="deleted_N_users_from_list_quantity_one" tools:ignore="PluralsCandidate">حذف <xliff:g id="items">%1$d</xliff:g> المستخدم من قائمة "<xliff:g id="list">%2$s</xliff:g>\".</string>
<string name="deleted_N_users_from_list_quantity_other" tools:ignore="PluralsCandidate">حذف <xliff:g id="items">%1$d</xliff:g> مستخدمين من قائمة "<xliff:g id="list">%2$s</xliff:g>\".</string>
<string name="delete_user_from_list_confirm">هل أنت متأكد أنك تريد حذف <xliff:g id="user">%1$s</xliff:g> من قائمة "<xliff:g id="list">%2$s</xliff:g>\"؟</string>
<string name="delete_N_users_from_list_confirm_quantity_one" tools:ignore="PluralsCandidate">هل أنت متأكد أنك تريد حذف <xliff:g id="items">%1$d</xliff:g> من المستخدمين من قائمة <xliff:g id="list">%2$s</xliff:g>؟</string>
<string name="delete_N_users_from_list_confirm_quantity_other" tools:ignore="PluralsCandidate">هل أنت متأكد أنك تريد حذف مستخدم <xliff:g id="items">%1$d</xliff:g> من قائمة <xliff:g id="list">%2$s</xliff:g> ؟</string>
<string name="subscribe">الإشتراك</string>
<string name="unsubscribe">إلغاء الإشتراك</string>
<string name="background_toast_notification">التنبيهات البسيطة في الخلفية</string>
<string name="background_toast_notification_summary">اظهار التنبيهات الخفيفة اذا تحولت الى الخلفية</string>
<string name="original_status">التغريدة الأصلية</string>
<string name="ask">سأل</string>
<string name="no_close_after_status_updated">ترك \"كتابة التغريدة\" مفتوح بعد إرسال التغريدة</string>
@ -434,6 +477,7 @@
<string name="lists_following_user_with_name">قوائم تتابع <xliff:g id="name">%s</xliff:g></string>
<string name="highlight">تعليم</string>
<string name="underline">تسطير</string>
<string name="link_highlight_option">خيار تمييز الروابط</string>
<string name="users_statuses">التغريدات</string>
<string name="card_animation">حركة البطاقات</string>
<string name="name_first">إظهار الاسم أولاً</string>
@ -448,7 +492,6 @@
<string name="wizard_page_welcome_import_settings">إستيراد الإعدادات</string>
<string name="wizard_page_theme_text">اختر سمةُ تُعجبك.</string>
<string name="wizard_page_tabs_text">أضف بعض للتبويبات إلى تويدر.\nتتبع الأشخاص أو الأشياء التي تهتم بشأنها.</string>
<string name="wizard_page_tabs_unchanged_message">يمكنك إضافة تبويبات من \"إعدادات\" - \"تبويبات\"</string>
<string name="wizard_page_cards_text">إعداد مكونات البطاقة.</string>
<string name="wizard_page_hints_text">بعض الإشارات المفيدة.</string>
<string name="wizard_page_finished_title">إنتهى</string>
@ -492,8 +535,6 @@
<string name="theme_background_default">افتراضي</string>
<string name="theme_background_solid">أبيض وأسود خالصين</string>
<string name="theme_background_transparent">شفاف</string>
<string name="wizard_hint_quote_format">حدد شكل الإقتباس المفضل لديك في \"الإعدادات\" - \"المحتوى والتخزين\"</string>
<string name="wizard_hint_filters">يمكنك كتم التغريدات التي لا تريدها من الخط الزمني والإخطارات باستعمال \"قواعد الكتم\".</string>
<string name="view_replies">عرض الردود</string>
<string name="compact_cards">بطاقات مختصرة</string>
<string name="compact_cards_summary">عرض بطاقات أكثر على الشاشة</string>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources>
<string name="error_http_407">يجب توثيق الوسيط</string>
<string name="error_http_407">يجب توثيق البروكسي</string>
</resources>

View File

@ -1,19 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources>
<string name="error_twitter_32">تعذرت مصادقتك، قد تحتاج لإعادة تسجيل الدخول.</string>
<string name="error_twitter_32">لقد تعذر توثيق دخولك، قد تحتاج لإعادة تسجيل الدخول.</string>
<string name="error_twitter_34">هذه التغريدة أو المغرد أو الصفحة غير موجودة.</string>
<string name="error_twitter_88">تجاوزت حد التغريدات المسموح، يرجى المحاولة لاحقا.</string>
<string name="error_twitter_89">بيانات تسجيل الدخول غير صحيحة أو انتهت صلاحيتها، المرجو إعادة تسجيل الدخول.</string>
<string name="error_twitter_64">إن حسابك موقف ولا يملك الصلاحية للولوج إلى هذه الخاصية.</string>
<string name="error_twitter_88">تجاوزت الحد المسموح به، يرجى المحاولة لاحقا.</string>
<string name="error_twitter_89">بيانات تسجيل الدخول غير صحيحة أو إنتهت صلاحيتها، الرجاء إعادة تسجيل الدخول.</string>
<string name="error_twitter_64">إن حسابك موقوف ولا يملك الصلاحية للولوج إلى هذه الخاصية.</string>
<string name="error_twitter_130">تويتر يتعرض لعدد كبير جداً من الطلبات يفوق قدرته، نرجو المحاولة لاحقاً.</string>
<string name="error_twitter_131">يحتمل أن يكون خادم تويتر معطل مؤقتا، نرجو المحاولة لاحقاً.</string>
<string name="error_twitter_135">المرجو التحقق من ساعة النظام.</string>
<string name="error_twitter_135">الرجاء التحقق من ساعة النظام لديك.</string>
<string name="error_twitter_136">لقد تم حجبك من قبل هذا المستخدم.</string>
<string name="error_twitter_139">لقد قمت بتفضيل هذه التغريدة سابقا.</string>
<string name="error_twitter_161">لقد طلبت متابعة هذا المستخدم سابقًا، انتظر الموافقة.</string>
<string name="error_twitter_162">هذا المغرد قد حظرك.</string>
<string name="error_twitter_162">قد تم حظرك من قبل هذا المغرد.</string>
<string name="error_twitter_172">لقد حفظت هذا البحث سابقًا.</string>
<string name="error_twitter_179">لا يمكنك مشاهدة التغريدات المحمية لهذا المستخدم.</string>
<string name="error_twitter_187">لقد أرسلت هذه التغريدة سابقًا.</string>
<string name="error_twitter_179">لا يمكنك مشاهدة تغريدات هذا المستخدم المحمي.</string>
<string name="error_twitter_187">لقد قمت بإرسال هذه التغريدة سابقا.</string>
<string name="error_twitter_193">الصورة التي تريد رفعها كبيرة جدا.</string>
<string name="error_twitter_215">قد تحتاج إلى إعادة تسجيل الدخول من جديد.</string>
<string name="error_twitter_215">قد تحتاج إلى إعادة تسجيل الدخول.</string>
</resources>

View File

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources xmlns:tools="http://schemas.android.com/tools" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_description">El to veceru propiu de Twitter</string>
<string name="compose">Componer</string>
<string name="add_account">Amestar cuenta</string>
<string name="settings">Axustes</string>
@ -31,14 +32,14 @@
<string name="edit_api">Editar API</string>
<string name="home">Aniciu</string>
<string name="mentions">Menciones</string>
<string name="error_occurred">Asocedió un fallu, por favor inténtalo de nueves.</string>
<string name="error_occurred">Asocedió un fallu. Inténtalo de nueves, por favor.</string>
<string name="error_already_logged_in">Yá aniciesti sesión.</string>
<string name="no_account_selected">Nun s\'esbilló cuenta dala.</string>
<string name="error_unknown_error">Fallu: Fallu desconocíu, esto quiciabes sía un problema.</string>
<string name="error_message">Fallu: <xliff:g id="message">%s</xliff:g></string>
<string name="error_message_with_action">Fallu en <xliff:g id="action">%1$s</xliff:g>: <xliff:g id="message">%2$s</xliff:g></string>
<string name="error_message_rate_limit">Perpasóse\'l llímite de tasa de Twitter, por favor reinténtalo en <xliff:g id="time">%s</xliff:g></string>
<string name="error_message_rate_limit_with_action">Perpasóse\'l llímite de tasa de Twiter en: <xliff:g id="action">%1$s</xliff:g>, inténtalo de nueves en <xliff:g id="time">%2$s</xliff:g></string>
<string name="error_message_rate_limit">Perpasóse\'l llímite de tasa de Twitter. Reinténtalo en <xliff:g id="time">%s</xliff:g>, por favor</string>
<string name="error_message_rate_limit_with_action">Perpasóse\'l llímite de tasa de Twiter en: <xliff:g id="action">%1$s</xliff:g>. Reintenta <xliff:g id="time">%2$s</xliff:g>, por favor</string>
<string name="select_account">Esbilla de cuentes</string>
<string name="username">Nome d\'usuariu</string>
<string name="password">Contraseña</string>
@ -54,6 +55,8 @@
<string name="cancel_retweet">Encaboxar retuit</string>
<string name="favorite">Marcar como favoritu</string>
<string name="unfavorite">Desmarcar como favoritu</string>
<string name="like">Prestar</string>
<string name="undo_like">Desfacer Prestóme</string>
<string name="reply">Responder</string>
<string name="share">Compartir</string>
<string name="view_image">Imaxe</string>
@ -97,6 +100,7 @@
<string name="retweeted_by_count">Retuitiáu por <xliff:g id="retweet_count">%d</xliff:g> usuarios</string>
<string name="users_retweeted_this">Los usuarios retuitiaron esto</string>
<string name="users_favorited_this">Los usuarios marcaron como favoritu esto</string>
<string name="users_liked_this">Usuarios que-yos prestó esto</string>
<string name="reply_to">Rempuesta a <xliff:g id="user_name">%s</xliff:g></string>
<string name="quote_user">Citar a <xliff:g id="user_name">%s</xliff:g></string>
<string name="time_source"><xliff:g id="time">%1$s</xliff:g> · <xliff:g id="source">%2$s</xliff:g></string>
@ -130,6 +134,7 @@
<string name="location">Allugamientu</string>
<string name="url">URL</string>
<string name="favorites">Favoritos</string>
<string name="likes">Prestóme</string>
<string name="name">Nome</string>
<string name="refresh">Refrescar</string>
<string name="retry">Reintentar</string>
@ -141,6 +146,7 @@
<string name="set_as_default">Afitar como predetermináu</string>
<string name="search_users">Guetar usuarios</string>
<string name="search_statuses">Guetar tuits</string>
<string name="created_at">Creóse a les</string>
<string name="search_hint">Gueta tuits o usuarios</string>
<string name="remember_position">Recordar posición</string>
<string name="remember_position_summary">Recuerda la posición de llistes/llingüetes enantes de zarrar Twidere</string>
@ -150,7 +156,7 @@
<string name="reported_user_for_spam">Informóse a esti usuariu de spam.</string>
<string name="reported_users_for_spam">Informáronse a estos usuarios de spam.</string>
<string name="filename_hint">Nome de ficheru</string>
<string name="please_wait">Por favor, espera.</string>
<string name="please_wait">Espera, por favor.</string>
<string name="saved_to_gallery">Guardóse a la galería.</string>
<string name="proxy">Proxy</string>
<string name="http_proxy">Proxy HTTP</string>
@ -209,8 +215,8 @@
<string name="accounts">Cuentes</string>
<string name="account">Cuenta</string>
<string name="mention_this_user">Mentar a esti usuariu</string>
<string name="mention_user_name">Mencionar <xliff:g id="name">%1$s</xliff:g></string>
<string name="signing_in_please_wait">Aniciando sesión, por favor espera o primi ATRÁS pa colar.</string>
<string name="mention_user_name">Mentar <xliff:g id="name">%1$s</xliff:g></string>
<string name="signing_in_please_wait">Aniciando sesión. Espera o primi ATRÁS pa colar, por favor.</string>
<string name="connectivity">Conectividá</string>
<string name="add_member">Amestar miembros</string>
<string name="new_user_list">Llistáu nuevu</string>
@ -271,6 +277,10 @@
<string name="activity_about_me_favorite_multi"><xliff:g id="user">%1$s</xliff:g> y <xliff:g id="other">%2$s</xliff:g> marcaron como favoritu\'l to tuit.</string>
<string name="activity_about_me_favorited_retweet"><xliff:g id="user">%s</xliff:g> marcó como favoritu\'l to retuit.</string>
<string name="activity_about_me_favorited_retweet_multi"><xliff:g id="user">%1$s</xliff:g> y <xliff:g id="other">%2$s</xliff:g> marcaron como favoritu\'l to retuit.</string>
<string name="activity_about_me_like"><xliff:g id="user">%s</xliff:g> prestó-y el to tuit.</string>
<string name="activity_about_me_like_multi">A <xliff:g id="user">%1$s</xliff:g> y <xliff:g id="other">%2$s</xliff:g> prestáron-yos el to tuit.</string>
<string name="activity_about_me_liked_retweet"><xliff:g id="user">%s</xliff:g> prestó-y el to retuit.</string>
<string name="activity_about_me_liked_retweet_multi">A <xliff:g id="user">%1$s</xliff:g> y <xliff:g id="other">%2$s</xliff:g> prestáron-yos el to retuit.</string>
<string name="activity_about_me_follow"><xliff:g id="user">%s</xliff:g> ta siguiéndote.</string>
<string name="activity_about_me_follow_multi"><xliff:g id="user">%1$s</xliff:g> y <xliff:g id="other">%2$s</xliff:g> tán siguiéndote.</string>
<string name="activity_about_me_retweet"><xliff:g id="user">%s</xliff:g> retuitió\'l to tuit.</string>
@ -281,19 +291,24 @@
<string name="activity_about_me_retweeted_mention_multi"><xliff:g id="user">%s</xliff:g> y <xliff:g id="other">%2$s</xliff:g> retuitiaron un tuit que te mentó.</string>
<string name="activity_about_me_favorited_mention"><xliff:g id="user">%s</xliff:g> marcó como favoritu un tuit que te mentó.</string>
<string name="activity_about_me_favorited_mention_multi"><xliff:g id="user">%s</xliff:g> y <xliff:g id="other">%2$s</xliff:g> marcaron como favoritu un tuit que te mentó.</string>
<string name="activity_about_me_liked_mention">A <xliff:g id="user">%s</xliff:g> prestó-y un tuit que te mentó.</string>
<string name="activity_about_me_liked_mention_multi">A <xliff:g id="user">%s</xliff:g> y <xliff:g id="other">%2$s</xliff:g> prestó-yos un tuit que te mentó.</string>
<string name="activity_about_me_list_member_added"><xliff:g id="user">%s</xliff:g> amestóte al llistáu.</string>
<string name="activity_about_me_list_member_added_with_name"><xliff:g id="user">%1$s</xliff:g> amestóte al llistáu «<xliff:g id="list">%2$s</xliff:g>».</string>
<string name="activity_about_me_list_member_added_multi"><xliff:g id="user">%1$s</xliff:g> y <xliff:g id="other">%2$s</xliff:g> amestáronte a los sos llistaos.</string>
<string name="activity_by_friends_favorite"><xliff:g id="user">%1$s</xliff:g> marcó como favoritu\'l tuit de <xliff:g id="target">%2$s</xliff:g>.</string>
<string name="activity_by_friends_favorite_multi"><xliff:g id="user">%1$s</xliff:g> marcó como favoritu <xliff:g id="target">%2$s</xliff:g> y el tuit de <xliff:g id="other">%3$s</xliff:g>.</string>
<string name="activity_by_friends_like"><xliff:g id="user">%1$s</xliff:g> prestó-y el tuit de <xliff:g id="target">%2$s</xliff:g>.</string>
<string name="activity_by_friends_follow"><xliff:g id="user">%1$s</xliff:g> ta siguiendo a <xliff:g id="target">%2$s</xliff:g>.</string>
<string name="activity_by_friends_follow_multi"><xliff:g id="user">%1$s</xliff:g> ta siguiendo a <xliff:g id="target">%2$s</xliff:g> y <xliff:g id="other">%3$s</xliff:g>.</string>
<string name="activity_by_friends_retweet"><xliff:g id="user">%1$s</xliff:g> retuitió\'l tuit de <xliff:g id="target">%2$s</xliff:g>.</string>
<string name="activity_by_friends_retweet_multi"><xliff:g id="user">%1$s</xliff:g> retuitió los tuits de <xliff:g id="target">%2$s</xliff:g> y <xliff:g id="other">%3$s</xliff:g>.</string>
<string name="activity_by_friends_list_member_added"><xliff:g id="user">%1$s</xliff:g> amestó <xliff:g id="target">%2$s</xliff:g> al llistáu.</string>
<string name="activity_by_friends_list_member_added_multi"><xliff:g id="user">%1$s</xliff:g> amestó a <xliff:g id="target">%2$s</xliff:g> y <xliff:g id="other">%1$s</xliff:g> al llistáu.</string>
<string name="activity_by_friends_list_created"><xliff:g id="user">%1$s</xliff:g> creó\'l llistáu <xliff:g id="target">%2$s</xliff:g>.</string>
<string name="activity_by_friends_list_created_multi"><xliff:g id="user">%1$s</xliff:g> creó\'l llistáu <xliff:g id="target">%2$s</xliff:g> y <xliff:g id="other">%1$s</xliff:g>.</string>
<string name="status_not_updated">Nun s\'unvió\'l tuit.</string>
<string name="status_not_updated_summary">Nun s\'unvió\'l tuit pero guardóse a borradores.</string>
<string name="status_not_updated_summary">Nun s\'unvió\'l tuit pero guardóse en Borradores.</string>
<string name="incoming_friendships">Solicitúes de siguimientu pendientes</string>
<string name="send_follow_request">Unviar solicitú de siguimientu</string>
<string name="follow_request_sent">Unvióse la solicitú de siguimientu</string>
@ -383,23 +398,23 @@
<string name="preview_images">Previsualización d\'imáxenes</string>
<string name="preload_wifi_only">Precargar usando namái Wi-Fi</string>
<string name="sign_in_method_introduction_title">¿Cómo furrula?</string>
<string name="sign_in_method_introduction">La mayoría de veceros abren una páxina web pa l\'autorización de Twitter, esto podría ser un inconveniente usando una API personalizada, o nuna rede lenta. Twidere simula un restolador normal p\'ayudar a anicia rsesión en Twitter. Nun t\'esmolezas, la to contraseña enxamás s\'atroxará o filtrará.</string>
<string name="sign_in_method_introduction">La mayoría de veceros abren una páxina web pa l\'autorización de Twitter, esto podría ser un inconveniente usando una API personalizada o nuna rede lenta. Twidere simula un restolador normal p\'ayudar a aniciar sesión en Twitter. Nun t\'esmolezas, la to contraseña enxamás s\'atroxará o filtrará.</string>
<string name="quote_protected_status_notice">Nun s\'aconseya citar tuits protexíos.</string>
<string name="edit_draft">Editar borador</string>
<string name="profile_image">Imaxe de perfil</string>
<string name="your_profile_image">La to imaxe de perfil</string>
<string name="mention_user">Mencionar a <xliff:g id="user">%s</xliff:g></string>
<string name="mention_user">Mentar a <xliff:g id="user">%s</xliff:g></string>
<string name="theme_color">Color del tema</string>
<string name="wrong_url_format">Formatu d\'URL incorreutu.</string>
<string name="wrong_username_password">Nome d\'usuariu/contraseña incorreutos.</string>
<string name="network_error">Fallu de rede.</string>
<string name="api_data_corrupted">Datos d\'API toyíos.</string>
<string name="ssl_error">Fallu SSL, quiciabes necesites habilitar la opción «Inorar fallu SSL».</string>
<string name="wrong_api_key">URL d\'API o clave/secretu de consumidor incorreutos, por favor compruébalos de nueves.</string>
<string name="wrong_api_key">URL d\'API o clave/secretu de consumidor incorreutos. Compruébalos de nueves, por favor.</string>
<string name="status_updated">Unvióse\'l tuit.</string>
<string name="status_deleted">Desanicióse\'l tuit.</string>
<string name="status_favorited">Tuit marcáu como favoritu.</string>
<string name="status_unfavorited">Tuit desmarcáu como favoritu.</string>
<string name="status_favorited">Marcóse\'l tuit como favoritu.</string>
<string name="status_unfavorited">Desmarcóse\'l tuit como favoritu.</string>
<string name="status_retweeted">Retuitióse.</string>
<string name="retweet_cancelled">Encaboxóse\'l retuit.</string>
<string name="direct_message_sent">Unvióse\'l mensaxe direutu.</string>
@ -441,7 +456,7 @@
<string name="ask">Entrugar</string>
<string name="no_close_after_status_updated">Caltener abiertu «Componer» dempués d\'unviar el tuit</string>
<string name="no_close_after_status_updated_summary">Un regalín pa «Chatterbox»</string>
<string name="status_saved_to_draft">Guardóse\'l tuit a borradores.</string>
<string name="status_saved_to_draft">Guardóse\'l tuit en Borradores.</string>
<string name="default_account">Cuenta por defeutu</string>
<string name="created_at_with_N_tweets_per_day_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="created_at">%1$s</xliff:g> (<xliff:g id="daily_tweet">%2$d</xliff:g> tuit per día)</string>
<string name="created_at_with_N_tweets_per_day_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="created_at">%1$s</xliff:g> (<xliff:g id="daily_tweet">%2$d</xliff:g> tuits per día)</string>
@ -462,6 +477,7 @@
<string name="safety">Seguranza</string>
<string name="updating_status_notification">Unviando\'l tuit...</string>
<string name="name_with_nickname"><xliff:g id="name">%1$s</xliff:g> (<xliff:g id="nickname">%2$s</xliff:g>)</string>
<string name="input_text">Entrada de testu</string>
<string name="users_lists_with_name">Llistaos de <xliff:g id="name">%s</xliff:g></string>
<string name="lists_following_user_with_name">Llistaos siguiendo a <xliff:g id="name">%s</xliff:g></string>
<string name="highlight">Resaltar</string>
@ -481,7 +497,7 @@
<string name="wizard_page_welcome_import_settings">Importar axustes</string>
<string name="wizard_page_theme_text">Escueyi un tema que te preste.</string>
<string name="wizard_page_tabs_text">Amiesta delles llingüetes a Twidere.\nSigui a la xente o coses que t\'importen.</string>
<string name="wizard_page_tabs_unchanged_message">Pues amestar llingüetes n\'«Axustes» - «Llingüetes»</string>
<string name="wizard_page_tabs_unchanged_message">Pues amestar llingüetes n\'&quot;Axustes&quot; - &quot;Llingüetes&quot;</string>
<string name="wizard_page_cards_text">Configuración d\'elementos de tarxetes.</string>
<string name="wizard_page_hints_text">Equí hai dellos conseyos interesantes.</string>
<string name="wizard_page_usage_statistics_text">Twidere participa en dellos proyeutos d\'investigación que necesiten dél usu de datos.</string>
@ -517,7 +533,7 @@
<string name="translate">Torna</string>
<string name="sponsored_by">Col sofitu de</string>
<string name="special_thanks_to">Gracies especiales a</string>
<string name="contributors_list_summary">Si nun alcuentres el to nome, por favor dímoslu na nuesa cuenta del proyeutu.</string>
<string name="contributors_list_summary">Si nun alcuentres el to nome dímoslu na nuesa cuenta del proyeutu, por favor.</string>
<string name="account_options">Opciones de cuenta</string>
<string name="show_in_timeline">Amosar na llinia temporal</string>
<string name="cards">Tarxetes</string>
@ -535,8 +551,9 @@
<string name="theme_background_transparent">Tresparente</string>
<string name="theme_dark_actionbar">Barra d\'aiciones escura</string>
<string name="wizard_hint_compose_select_account">Primi na imaxe de perfil pa esbillar la cuenta al escribir un tuit.</string>
<string name="wizard_hint_quote_format">Afita\'l to formatu de cita favoritu n\'«Axustes» - «Conteníu y almacenamientu»</string>
<string name="wizard_hint_filters">Pues anubrir tuits de la llinia temporal y avisos que nun quieras usando «Peñeres».</string>
<string name="wizard_hint_quote_format">Afita\'l to formatu de cita favoritu n\'&laquo;Axustes&raquo;
- &laquo;Componer&raquo;</string>
<string name="wizard_hint_filters">Pues anubrir tuits que nun quieras de la llinia temporal y avisos usando &quot;Peñeres&quot;.</string>
<string name="view_replies">Ver rempuestes</string>
<string name="compact_cards">Tarxetes compautes</string>
<string name="compact_cards_summary">Amuesa más tarxetes na pantalla</string>
@ -549,9 +566,9 @@
<string name="status_share_subject_format_with_time">Tuit de <xliff:g id="name">%1$s</xliff:g> (@<xliff:g id="screen_name">%2$s</xliff:g>), a les <xliff:g id="time">%3$s</xliff:g></string>
<string name="status_share_text_format_with_link"><xliff:g id="text">%1$s</xliff:g>\n\n<xliff:g id="link">%2$s</xliff:g></string>
<string name="rate_limit">Llímite de tasa</string>
<string name="wizard_hint_rate_limit">Si alcuentres problemes de llímite de tasa, por favor nun me culpes, ye la política de Twitter.</string>
<string name="wizard_hint_rate_limit">Si alcuentres problemes de llímite de tasa, nun me culpes por favor, ye la política de Twitter.</string>
<string name="preparing_database">Tresnando base de datos</string>
<string name="preparing_database_toast">Tresnando base de datos, por favor espera un momentu.</string>
<string name="preparing_database_toast">Tresnando base de datos. Espera un momentu, por favor.</string>
<string name="action_name_saved_at_time"><xliff:g id="action">%1$s</xliff:g>, guardóse a les <xliff:g id="time">%2$s</xliff:g></string>
<string name="update_status">Unviar tuit</string>
<string name="sending_direct_message">Unviando\'l mensaxe direutu</string>
@ -611,7 +628,6 @@
<string name="delete_drafts_confirm">¿Desaniciar los borradores esbillaos?</string>
<string name="extra_configurations">Configuraciones estra</string>
<string name="click_item_to_config">Clic nun elementu pa configuralu</string>
<string name="dark_drawer">Caxón escuru</string>
<string name="retweets_of_me">Retuits de mio</string>
<string name="from_gallery">Dende la galería</string>
<string name="from_camera">Dende la cámara</string>
@ -724,6 +740,8 @@
<string name="N_statuses_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> tuits</string>
<string name="N_favorites_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> favoritos</string>
<string name="N_favorites_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> favoritos</string>
<string name="N_likes_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> prestóme</string>
<string name="N_likes_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> prestóme</string>
<string name="drafts_hint_messages">Equí guardaránse los tos tuits ensin unviar</string>
<string name="keyboard_shortcuts">Atayos de tecláu</string>
<string name="keyboard_shortcut_hint">Primi les tecles</string>
@ -747,6 +765,8 @@
<string name="delete_conversation_confirm_message">¿Desaniciar tolos mensaxes d\'esta conversación?</string>
<string name="name_first_summary_on">Amuesa primero\'l nome</string>
<string name="name_first_summary_off">Amosar primero \@NomeUsuariu</string>
<string name="comment_hint">Comentariu...</string>
<string name="comment">Comentar</string>
<string name="enable_retweets">Habilitar retuits</string>
<string name="disable_retweets">Deshabilitar retuits</string>
<string name="play">Reproducir</string>
@ -758,6 +778,8 @@
<string name="dark_theme">Tema prietu</string>
<string name="wizard_hint_title_location_requirement">Permisu d\'allugamientu</string>
<string name="wizard_hint_summary_location_requirement">Twidere necesita\'l permisu d\'allugamientu cuando unvies un tuit col allugamientu.</string>
<string name="wizard_hint_title_storage_requirement">Permisu d\'almacenamientu</string>
<string name="wizard_hint_summary_storage_requirement">Twidere necesita\'l permisu d\'almacenamientu cuando accedas a los documentos.</string>
<string name="scrapyard">Bagul d\'axustes</string>
<string name="crop_image">Retayar imaxe</string>
<string name="usage_label_sent">Unviao</string>
@ -772,4 +794,28 @@
<string name="bug_reports">Informes de fallos</string>
<string name="invalid_consumer_key">Clave de consumidor non válida</string>
<string name="invalid_consumer_secret">Secretu de consumidor non válidu</string>
<string name="page_up">Páxina arriba</string>
<string name="page_down">Páxina abaxo</string>
<string name="combined_notifications">Avisos combinaos</string>
<string name="combined_notifications_summary_on">Agruparánse los avisos</string>
<string name="combined_notifications_summary_off">Los avisos amosaránse de mou separtáu</string>
<string name="save_media_no_storage_permission_message">Necesítase\'l permisu d\'almacenamientu pa guardar semeyes y videos.</string>
<string name="select_file_no_storage_permission_message">Necesitase\'l permisu d\'almacenamientu pa esbillar ficheros.</string>
<string name="user_mentioned_you"><xliff:g id="user">%s</xliff:g> mentóte</string>
<string name="cant_load_all_replies_message">Nun puen cargase toles rempuestes. &lt;a href=\"#dialog\";&gt;¿Por qué?&lt;/a&gt;</string>
<string name="cant_load_all_replies_explanation">Pola mor de la llimitación de Twitter a veceros de terceres partes, Twidere nun tien accesu a les rempuestes d\'un tuit. Nun hai garantía dala de que Twidere cargue toles sos rempuestes.</string>
<string name="current_status">Tuit actual</string>
<string name="twitter_optimized_searches">Guetes optimizaes de Twitter</string>
<string name="twitter_optimized_searches_summary">Usa términos especiales de gueta p\'ameyorar los resultaos de gueta como escluyir retuits</string>
<string name="i_want_my_stars_back">¡Quiero les mios estrelles de nueves!</string>
<string name="i_want_my_stars_back_summary">Usa\'l favoritu (★) en cuantes del préstame (♥︎)</string>
<string name="copy_link">Copiar enllaz</string>
<string name="link_copied_to_clipboard">Copióse l\'enllaz al cartafueyu</string>
<string name="login_verification">Verificación del aniciu sesión</string>
<string name="login_verification_pin_hint">Comprueba\'l to teléfono por un códigu PIN ya introduzlu p\'aniciar sesión.</string>
<string name="login_verification_push_hint">Aceuta la solicitú de verificación dende la to aplicación de Twitter, namái que l\'apruebes, primi Aceutar.</string>
<string name="login_verification_failed">Fallu na verificación del aniciu de sesión.</string>
<string name="saved_searches_already_saved_hint">Quiciabes yá guardesti esta gueta</string>
<string name="unsupported_activity_action_title">Aición <xliff:g id="action">%s</xliff:g></string>
<string name="unsupported_activity_action_summary">Informa de l\'aición d\'enriba</string>
</resources>

View File

@ -381,7 +381,6 @@
<string name="preview_images">Previsualització d\'imatges</string>
<string name="preload_wifi_only">Precarrega només a través de Wi-Fi</string>
<string name="sign_in_method_introduction_title">Com funciona, això?</string>
<string name="sign_in_method_introduction">La majoria de clients obre una pàgina web per autoritzar a Twitter, això podria ser un inconvenient quan es fa servir una API personalitzada, o a una xarxa lenta. Twidere simula un navegador normal per registrar-te a Twitter. No et preocupis, la teva contrasenya no s\'emmagatzemarà ni es filtrarà.</string>
<string name="quote_protected_status_notice">No és recomanable citar piulades protegides.</string>
<string name="edit_draft">Edita l\'esborrany</string>
<string name="profile_image">Imatge de perfil</string>
@ -481,7 +480,6 @@
<string name="wizard_page_welcome_import_settings">Importa els paràmetres</string>
<string name="wizard_page_theme_text">Trieu un tema que us agradi.</string>
<string name="wizard_page_tabs_text">Afegeix alguna pestanya al Twidere.\nPodreu seguir la gent o els temes que us importin.</string>
<string name="wizard_page_tabs_unchanged_message">Podeu afegir pestanyes a «Paràmetres» - «Pestanyes»</string>
<string name="wizard_page_cards_text">Configura els elements de les targetes.</string>
<string name="wizard_page_hints_text">A continuació us deixem uns consells.</string>
<string name="wizard_page_usage_statistics_text">Twidere participa en un projecte de recerca, que consumeix una mica de dades.</string>
@ -536,8 +534,6 @@
<string name="theme_background_transparent">Transparent</string>
<string name="theme_dark_actionbar">Barra d\'acció fosca</string>
<string name="wizard_hint_compose_select_account">Prem la imatge de perfil per seleccionar un compte al escriure un tuit.</string>
<string name="wizard_hint_quote_format">Estableix el text de cita a «Paràmetres» - «Contingut i emmagatzematge»</string>
<string name="wizard_hint_filters">Podeu evitar que apareguin piulades no desitjades a la vostra cronologia i com a notificacions mitjançant «Filtres».</string>
<string name="view_replies">Mostra les respostes</string>
<string name="compact_cards">Targetes més compactes</string>
<string name="compact_cards_summary">Fa que es vegin més piulades per pàgina</string>
@ -612,7 +608,6 @@
<string name="delete_drafts_confirm">Voleu eliminar els esborranys seleccionats?</string>
<string name="extra_configurations">Paràmetres addicionals</string>
<string name="click_item_to_config">Feu clic en un element per configurar-lo</string>
<string name="dark_drawer">Calaix fosc</string>
<string name="retweets_of_me">Repiulades meves</string>
<string name="from_gallery">Des de la galeria</string>
<string name="from_camera">Des de la càmera</string>

View File

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources xmlns:tools="http://schemas.android.com/tools" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_description">Deine eignene Twitter-App</string>
<string name="compose">Neuer Tweet</string>
<string name="add_account">Account hinzufügen</string>
<string name="settings">Einstellungen</string>
@ -45,7 +46,7 @@
<string name="label_data_provider">Twidere Datenbankanbieter</string>
<string name="label_refresh_service">Dienst aktualisieren</string>
<string name="label_streaming_service">Streaming Service</string>
<string name="label_background_operation_service">Hintergrunddienste</string>
<string name="label_background_operation_service">Hintergrunddienst</string>
<string name="open_in_browser">Im Browser öffnen</string>
<string name="tap_to_load_more">Weitere Tweets laden</string>
<string name="delete">Löschen</string>
@ -54,6 +55,8 @@
<string name="cancel_retweet">Retweet abbrechen</string>
<string name="favorite">Favorisieren</string>
<string name="unfavorite">Favorit löschen</string>
<string name="like">Gefällt mir</string>
<string name="undo_like">Gefällt mir nicht mehr</string>
<string name="reply">Antworten</string>
<string name="share">Teilen</string>
<string name="view_image">Bild</string>
@ -97,6 +100,7 @@
<string name="retweeted_by_count">Retweetet von <xliff:g id="retweet_count">%d</xliff:g> Benutzern</string>
<string name="users_retweeted_this">Benutzer retweeteten dies</string>
<string name="users_favorited_this">Benutzer haben dies favorisiert</string>
<string name="users_liked_this">Usern gefällt</string>
<string name="reply_to">Antworten <xliff:g id="user_name">%s</xliff:g></string>
<string name="quote_user">Zitat <xliff:g id="user_name">%s</xliff:g></string>
<string name="time_source"><xliff:g id="time">%1$s</xliff:g> · <xliff:g id="source">%2$s</xliff:g></string>
@ -130,6 +134,7 @@
<string name="location">Ort</string>
<string name="url">URL</string>
<string name="favorites">Favoriten</string>
<string name="likes">Gefällt mir Angaben</string>
<string name="name">Name</string>
<string name="refresh">Aktualisieren</string>
<string name="retry">Wiederholen</string>
@ -272,12 +277,21 @@
<string name="activity_about_me_favorite_multi"><xliff:g id="user">%1$s</xliff:g> und <xliff:g id="other">%2$s</xliff:g> haben deinen Tweet favorisiert.</string>
<string name="activity_about_me_favorited_retweet"><xliff:g id="user">%s</xliff:g> hat deinen Tweet favorisiert.</string>
<string name="activity_about_me_favorited_retweet_multi"><xliff:g id="user">%1$s</xliff:g> und <xliff:g id="other">%2$s</xliff:g> haben deinen Retweet favorisiert.</string>
<string name="activity_about_me_like"><xliff:g id="user">%s</xliff:g> mochte deinen Tweet.</string>
<string name="activity_about_me_like_multi"><xliff:g id="user">%1$s</xliff:g> und <xliff:g id="other">%2$s</xliff:g> mochten deinen Tweet.</string>
<string name="activity_about_me_liked_retweet"><xliff:g id="user">%s</xliff:g> mochte deinen Retweet.</string>
<string name="activity_about_me_follow"><xliff:g id="user">%s</xliff:g> folgt dir.</string>
<string name="activity_about_me_follow_multi"><xliff:g id="user">%1$s</xliff:g> und <xliff:g id="other">%2$s</xliff:g> folgen Dir.</string>
<string name="activity_about_me_retweet"><xliff:g id="user">%s</xliff:g> retweetete deinen Tweet.</string>
<string name="activity_about_me_retweet_multi"><xliff:g id="user">%1$s</xliff:g> und <xliff:g id="other">%2$s</xliff:g> haben deinen Tweet retweeted.</string>
<string name="activity_about_me_retweeted_retweet"><xliff:g id="user">%s</xliff:g> hat deinen Retweet retweeted.</string>
<string name="activity_about_me_retweeted_retweet_multi"><xliff:g id="user">%1$s</xliff:g> und <xliff:g id="other">%2$s</xliff:g> haben deinen Retweet retweeted.</string>
<string name="activity_about_me_retweeted_mention"><xliff:g id="user">%s</xliff:g> retweetete einen Tweet, in dem du erwähnt wurdest.</string>
<string name="activity_about_me_retweeted_mention_multi"><xliff:g id="user">%s</xliff:g> und <xliff:g id="other">%2$s</xliff:g> retweeteten einen Tweet, in dem du erwähnt wurdest.</string>
<string name="activity_about_me_favorited_mention"><xliff:g id="user">%s</xliff:g> favorisierte einen Tweet, in dem du erwähnt wurdest.</string>
<string name="activity_about_me_favorited_mention_multi"><xliff:g id="user">%s</xliff:g> und <xliff:g id="other">%2$s</xliff:g> favorisierten einen Tweet, in dem du erwähnt wurdest.</string>
<string name="activity_about_me_liked_mention"><xliff:g id="user">%s</xliff:g> favorisierte einen Tweet, in dem du erwähnt wurdest.</string>
<string name="activity_about_me_liked_mention_multi"><xliff:g id="user">%s</xliff:g> und <xliff:g id="other">%2$s</xliff:g> favorisierten einen Tweet, in dem du erwähnt wurdest.</string>
<string name="activity_about_me_list_member_added"><xliff:g id="user">%s</xliff:g> hat Dich zur Liste hinzugefügt.</string>
<string name="activity_about_me_list_member_added_with_name"><xliff:g id="user">%1$s</xliff:g> hat Dich zur Liste "<xliff:g id="list">%2$s</xliff:g>\" hinzugefügt.</string>
<string name="activity_about_me_list_member_added_multi"><xliff:g id="user">%1$s</xliff:g> und <xliff:g id="other">%2$s</xliff:g> haben Dich zu ihren Listen hinzugefügt.</string>
@ -286,7 +300,9 @@
<string name="activity_by_friends_follow"><xliff:g id="user">%1$s</xliff:g>folgt <xliff:g id="target">%2$s</xliff:g>.</string>
<string name="activity_by_friends_follow_multi"><xliff:g id="user">%1$s</xliff:g> folgt <xliff:g id="target">%2$s</xliff:g> und <xliff:g id="other">%3$s</xliff:g>.</string>
<string name="activity_by_friends_retweet"><xliff:g id="user">%1$s</xliff:g> retweetete <xliff:g id="target">%2$s</xliff:g>s tweet.</string>
<string name="activity_by_friends_retweet_multi"><xliff:g id="user">%1$s</xliff:g> retweetete <xliff:g id="target">%2$s</xliff:g> und <xliff:g id="other">%3$s</xliff:g>\'s Tweet.</string>
<string name="activity_by_friends_list_member_added"><xliff:g id="user">%1$s</xliff:g> fügte <xliff:g id="target">%2$s</xliff:g> zur Liste hinzu.</string>
<string name="activity_by_friends_list_member_added_multi"><xliff:g id="user">%1$s</xliff:g> hat <xliff:g id="target">%2$s</xliff:g> und <xliff:g id="other">%1$s</xliff:g> zur Liste hinzugefügt.</string>
<string name="activity_by_friends_list_created"><xliff:g id="user">%1$s</xliff:g> hat die Liste <xliff:g id="target">%2$s</xliff:g> erstellt.</string>
<string name="activity_by_friends_list_created_multi"><xliff:g id="user">%1$s</xliff:g> hat die Listen <xliff:g id="target">%2$s</xliff:g> und <xliff:g id="other">%1$s</xliff:g> erstellt.</string>
<string name="status_not_updated">Tweet nicht gesendet.</string>
@ -371,7 +387,7 @@
<string name="fast_scroll_thumb">Schnelldurchlauf Vorschaubild</string>
<string name="indicate_your_status">Kennzeichne meinen Tweet</string>
<string name="default_ringtone">Standard Klingelton</string>
<string name="phishing_link_warning">Warnung vor Phinshing Link</string>
<string name="phishing_link_warning">Warnung vor Phishing Link</string>
<string name="phishing_link_warning_summary">Warnung beim Öffnen eines möglichen Phishing Links in der Direktnachricht.</string>
<string name="phishing_link_warning_message_1">Sie öffnen gerade einen Link in einer Direktnachricht, der Sie möglicherweise zu einer Phishing Seite leiten könnte.\n\nÜberprüfen Sie die Webadresse zweimal bevor Sie persönliche Daten eingeben.</string>
<string name="phishing_link_warning_message_2">Wollen Sie wirklich fortfahren?</string>
@ -380,6 +396,7 @@
<string name="preview_images">Vorschaubilder</string>
<string name="preload_wifi_only">Vorausladen nur mit WLAN</string>
<string name="sign_in_method_introduction_title">Wie funktioniert es?</string>
<string name="sign_in_method_introduction">Die meisten Programme &ouml;ffnen eine Webseite, um sich zu bei Twitter anzumelden. Das kann beim Nutzen einer eigenen API oder bei einer langsamen Verbindung nervig sein. Twidere gibt sich als normaler Browser aus und kann sich so zuverl&auml;ssiger anmelden. Und keine Sorge, das Passwort wird nirgendwo gespeichert oder gar ver&ouml;ffentlicht.</string>
<string name="quote_protected_status_notice">Es ist nicht empfohlen einen geschützten Tweet zu zitieren.</string>
<string name="edit_draft">Bearbeite Entwurf</string>
<string name="profile_image">Profilbild</string>
@ -479,7 +496,7 @@
<string name="wizard_page_welcome_import_settings">Einstellungen importieren</string>
<string name="wizard_page_theme_text">Theme auswählen.</string>
<string name="wizard_page_tabs_text">Neue Tabs hinzufügen.\nInteressensgebiete hinterlegen.</string>
<string name="wizard_page_tabs_unchanged_message">Neue Tabs in \"Einstellungen\" - \"Reiter\"</string>
<string name="wizard_page_tabs_unchanged_message">Tabs können unter &quot;Einstellungen&quot; - &quot;Tabs&quot; hinzugef&uuml;gt werden</string>
<string name="wizard_page_cards_text">Tweet-Karten konfigurieren.</string>
<string name="wizard_page_hints_text">Hier sind ein paar nützliche Hinweise.</string>
<string name="wizard_page_usage_statistics_text">Twidere hat an einem Forschungsprojekt teilgenommen, das ein paar Nutzungsstatistiken benötigt.</string>
@ -533,8 +550,8 @@
<string name="theme_background_transparent">Transparent</string>
<string name="theme_dark_actionbar">Dunkle Aktionsleiste</string>
<string name="wizard_hint_compose_select_account">Drücke auf das Profil Bild um den Account auszuwählen, wenn du einen Tweet schreibst.</string>
<string name="wizard_hint_quote_format">Stell das Zitat-Format in \"Einstellungen\" - \"Inhalt &amp; Speicher\" ein</string>
<string name="wizard_hint_filters">Du kannst ungewünschte Tweets aus Deiner Timeline mit einem \"Filter\" entfernen.</string>
<string name="wizard_hint_quote_format">Konfiguriere dein bevorzugtes Zitat-Format unter &quot;Einstellungen&quot; - &quot;Neuer Tweet&quot;</string>
<string name="wizard_hint_filters">Unter &quot;Filter&quot; können bestimmte Tweets und Erinnerungen versteckt werden</string>
<string name="view_replies">Antworten ansehen</string>
<string name="compact_cards">kompaktere Karten</string>
<string name="compact_cards_summary">Mehr Karten anzeigen</string>
@ -609,7 +626,6 @@
<string name="delete_drafts_confirm">Ausgewählte Entwürfe löschen?</string>
<string name="extra_configurations">Erweiterte Einstellungen</string>
<string name="click_item_to_config">Klicke auf einen Eintrag, um ihn zu konfigurieren</string>
<string name="dark_drawer">Dunkle Schublade</string>
<string name="retweets_of_me">Meine Retweets</string>
<string name="from_gallery">Aus der Galerie</string>
<string name="from_camera">Von Kamera</string>
@ -684,6 +700,7 @@
<string name="getting_location">Hole Position</string>
<string name="save_to_gallery">In Galerie speichern</string>
<string name="usage_statistics">Nutzungsstatistiken</string>
<string name="research_hot_mobile">Datenbasierte Suche im mobilen Netzwerk</string>
<string name="unknown_location">Unbekannte Position</string>
<string name="ellipsis">&#8230;</string>
<string name="import_export_settings">Einstellungen importieren/exportieren</string>
@ -721,6 +738,7 @@
<string name="N_statuses_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> Tweets</string>
<string name="N_favorites_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> Favoriten</string>
<string name="N_favorites_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> Favoriten</string>
<string name="N_likes_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g>Gefällt mir</string>
<string name="drafts_hint_messages">Nicht gesendete Tweets werden hier gespeichert</string>
<string name="keyboard_shortcuts">Tastaturkommandos</string>
<string name="keyboard_shortcut_hint">Drücke Tasten</string>
@ -757,6 +775,8 @@
<string name="dark_theme">Dark Theme</string>
<string name="wizard_hint_title_location_requirement">Ortungserlaubnis</string>
<string name="wizard_hint_summary_location_requirement">Twidere benötigt Ortungserlaubnis wenn ein Tweet mit Ortungsinformationen gesendet werden soll.</string>
<string name="wizard_hint_title_storage_requirement">Berechtigung für den Speicher</string>
<string name="wizard_hint_summary_storage_requirement">Twidere braucht die Speicherberechtigung, um auf Dokumente zugreifen zu können.</string>
<string name="scrapyard">Schrottplatz</string>
<string name="crop_image">Bild zurechtschneiden</string>
<string name="usage_label_sent">Gesendet</string>
@ -765,4 +785,25 @@
<string name="media_preload">Medien im Voraus laden</string>
<string name="on_mobile_network">Im mobilen Netzwerk</string>
<string name="set_consumer_key_secret_message">Twidere hat das token limit erreicht, du musst eine app unter https://apps.twitter.com/ erstellen und den Benutzer-Key und den geheimen unten einfügen.\nWenn du weiterhin deinen Standard-Schlüssel verwendest, kannst du dich möglicherweise nicht mehr einloggen.</string>
<string name="send_at">Gesendet an</string>
<string name="scheduled_statuses">Geplante Tweets</string>
<string name="report_usage_statistics_now">Verschicke Benutzungsstatistiken jetzt</string>
<string name="cache_size_limit">Begrenzung der Cachegröße</string>
<string name="bug_reports">Fehlerberichte</string>
<string name="invalid_consumer_key">Ungültiger Benutzer-Key</string>
<string name="invalid_consumer_secret">Ungültiges Benutzer-Secret</string>
<string name="page_up">Ganze Seite nach oben</string>
<string name="page_down">Ganze Seite nach unten</string>
<string name="combined_notifications">Kombinierte Erinnerungen</string>
<string name="combined_notifications_summary_on">Erinnerungen werden zusammen angezeigt</string>
<string name="combined_notifications_summary_off">Erinnerungen werden getrennt angezeigt</string>
<string name="save_media_no_storage_permission_message">Speicherberechtigung nötig, um Bilder und Videos zu speichern.</string>
<string name="select_file_no_storage_permission_message">Speicherberechtigung nötig, um Dateien zu w&auml;hlen.</string>
<string name="user_mentioned_you"><xliff:g id="name">%s</xliff:g> hat Dich erw&auml;hnt</string>
<string name="cant_load_all_replies_message">Kann nicht alle Antworten laden. &lt;a href=\"#dialog\";&gt;Warum?&lt;/a&gt;</string>
<string name="cant_load_all_replies_explanation">Wegen der Einschr&auml;nkung Programme anderer Hersteller durch Twitter, hat Twidere keinen Zugriff auf die Antworten auf einen Tweet, Twidere kann nicht garantieren, alle Antworten laden zu k&ouml;nnen.</string>
<string name="current_status">Letzter Tweet</string>
<string name="twitter_optimized_searches">Twitter-optimierte Suche</string>
<string name="twitter_optimized_searches_summary">Verwenden Sie spezielle Begriffe um die Suchergebnisse zu verbessern sowie Retweets auszuschließen</string>
<string name="i_want_my_stars_back">Ich will meine Sterne zurück!</string>
</resources>

View File

@ -9,6 +9,8 @@
<string name="error_twitter_130">Twitter ist momentan überlastet.</string>
<string name="error_twitter_131">Twitters Server sind momentan nicht erreichbar, bitte versuche es später erneut.</string>
<string name="error_twitter_135">Bitte überprüfe deine Systemuhr.</string>
<string name="error_twitter_136">Du wurdest von diesem Benutzer blockiert.</string>
<string name="error_twitter_139">Du hast diesen Tweet bereits favorisiert.</string>
<string name="error_twitter_161">Du hast bereits angegeben, diesem Nutzer folgen zu wollen.</string>
<string name="error_twitter_162">Du wurdest von diesem Benutzer blockiert.</string>
<string name="error_twitter_172">Du hast diese Suche bereits gespeichert.</string>

View File

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources xmlns:tools="http://schemas.android.com/tools" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_description">Tu propia aplicación de Twitter</string>
<string name="compose">Componer</string>
<string name="add_account">Añadir cuenta</string>
<string name="settings">Configuración</string>
@ -44,7 +45,7 @@
<string name="password">Contraseña</string>
<string name="label_data_provider">Proveedor de base de datos Twidere</string>
<string name="label_refresh_service">Recargar servicio</string>
<string name="label_streaming_service">Servicio Stream</string>
<string name="label_streaming_service">Servicio en directo</string>
<string name="label_background_operation_service">Servicio en segundo plano</string>
<string name="open_in_browser">Abrir en el navegador</string>
<string name="tap_to_load_more">Puntee para cargar más</string>
@ -54,6 +55,8 @@
<string name="cancel_retweet">Cancelar retweet</string>
<string name="favorite">Añadir a Favoritos</string>
<string name="unfavorite">Quitar de Favoritos</string>
<string name="like">Me gusta</string>
<string name="undo_like">Quitar me gusta</string>
<string name="reply">Respuesta</string>
<string name="share">Compartir</string>
<string name="view_image">Imagen</string>
@ -97,6 +100,7 @@
<string name="retweeted_by_count">Retwitteado por <xliff:g id="retweet_count">%d</xliff:g> usuarios</string>
<string name="users_retweeted_this">Usuarios retweeted esto</string>
<string name="users_favorited_this">Favoritos de los usuarios</string>
<string name="users_liked_this">Usuarios a los que les gustó esto</string>
<string name="reply_to">Respuesta a <xliff:g id="user_name">%s</xliff:g></string>
<string name="quote_user">Cita <xliff:g id="user_name">%s</xliff:g></string>
<string name="time_source"><xliff:g id="time">%1$s</xliff:g> · <xliff:g id="source">%2$s</xliff:g></string>
@ -130,6 +134,7 @@
<string name="location">Ubicación</string>
<string name="url">URL</string>
<string name="favorites">Favoritos</string>
<string name="likes">Me gusta</string>
<string name="name">Nombre</string>
<string name="refresh">Actualizar</string>
<string name="retry">Reintentar</string>
@ -272,6 +277,10 @@
<string name="activity_about_me_favorite_multi"><xliff:g id="user">%1$s</xliff:g> and <xliff:g id="other">%2$s</xliff:g> marcaron como favorito tu tweet.</string>
<string name="activity_about_me_favorited_retweet"><xliff:g id="user">%s</xliff:g> marcó como favorito tu retweet.</string>
<string name="activity_about_me_favorited_retweet_multi"><xliff:g id="user">%1$s</xliff:g> y <xliff:g id="other">%2$s</xliff:g> marcaron como favorito tu retweet.</string>
<string name="activity_about_me_like"><xliff:g id="user">%s</xliff:g> le gustó tu tweet.</string>
<string name="activity_about_me_like_multi">A <xliff:g id="user">%1$s</xliff:g> y a <xliff:g id="other">%2$s</xliff:g> les gustó tu tweet.</string>
<string name="activity_about_me_liked_retweet">A <xliff:g id="user">%s</xliff:g> le gustó tu retweet.</string>
<string name="activity_about_me_liked_retweet_multi">A <xliff:g id="user">%1$s</xliff:g> y a <xliff:g id="other">%2$s</xliff:g> les gustó tu retweet.</string>
<string name="activity_about_me_follow"><xliff:g id="user">%s</xliff:g> te está siguiendo.</string>
<string name="activity_about_me_follow_multi"><xliff:g id="user">%1$s</xliff:g> y <xliff:g id="other">%2$s</xliff:g> te están siguiendo.</string>
<string name="activity_about_me_retweet"><xliff:g id="user">%s</xliff:g> te retwitteó.</string>
@ -282,11 +291,15 @@
<string name="activity_about_me_retweeted_mention_multi"><xliff:g id="user">%s</xliff:g> y <xliff:g id="other">%2$s</xliff:g> han retuiteado un tweet dónde eres mencionado.</string>
<string name="activity_about_me_favorited_mention"><xliff:g id="user">%s</xliff:g> ha guardado como favorito un tweet dónde eres mencionado.</string>
<string name="activity_about_me_favorited_mention_multi"><xliff:g id="user">%s</xliff:g> y <xliff:g id="other">%2$s</xliff:g> han guardado como favorito un tweet dónde eres mencionado.</string>
<string name="activity_about_me_liked_mention">A <xliff:g id="user">%s</xliff:g> le gustó un tweet donde te mencionaban.</string>
<string name="activity_about_me_liked_mention_multi">A <xliff:g id="user">%s</xliff:g> y a <xliff:g id="other">%2$s</xliff:g> les gustó un tweet donde te mencionaban.</string>
<string name="activity_about_me_list_member_added"><xliff:g id="usuario">%s</xliff:g> te añadió a una lista.</string>
<string name="activity_about_me_list_member_added_with_name"><xliff:g id="user">%1$s</xliff:g> te agregaron a la lista "<xliff:g id="list">%2$s</xliff:g>\".</string>
<string name="activity_about_me_list_member_added_multi"><xliff:g id="user">%1$s</xliff:g> y <xliff:g id="other">%2$s</xliff:g> te han agregado a sus listas.</string>
<string name="activity_by_friends_favorite"><xliff:g id="user">%1$s</xliff:g> marcó como favorito el tweet de <xliff:g id="target">%2$s</xliff:g>.</string>
<string name="activity_by_friends_favorite_multi"><xliff:g id="user">%1$s</xliff:g> marcó como favorito <xliff:g id="target">%2$s</xliff:g> y <xliff:g id="other">%3$s</xliff:g>\'s tweet.</string>
<string name="activity_by_friends_like">A <xliff:g id="user">%1$s</xliff:g> le gustó el tweet de <xliff:g id="target">%2$s</xliff:g>.</string>
<string name="activity_by_friends_like_multi">A <xliff:g id="user">%1$s</xliff:g> le gustó el tweet de <xliff:g id="target">%2$s</xliff:g> y <xliff:g id="other">%3$s</xliff:g>.</string>
<string name="activity_by_friends_follow"><xliff:g id="user">%1$s</xliff:g> ahora sigue a <xliff:g id="target">%2$s</xliff:g>.</string>
<string name="activity_by_friends_follow_multi"><xliff:g id="user">%1$s</xliff:g> está siguiendo <xliff:g id="target">%2$s</xliff:g> y <xliff:g id="other">%3$s</xliff:g>.</string>
<string name="activity_by_friends_retweet"><xliff:g id="user">%1$s</xliff:g> ha retuiteado el tuit de <xliff:g id="target">%2$s</xliff:g>.</string>
@ -386,7 +399,7 @@
<string name="preview_images">Previsualizar imágenes</string>
<string name="preload_wifi_only">Precargar solo con Wi-Fi</string>
<string name="sign_in_method_introduction_title">¿Cómo funciona?</string>
<string name="sign_in_method_introduction">Muchos clientes abren una página web para autorizar en Twitter, esto puede resultar inconveniente cuando se usa una API personalizada o con conexiones lentas. Twidere simula un navegador web normal para ayudar a realizar la autorización en Twitter. No te preocupes, tu contraseña nunca será almacenada ni mostrada.</string>
<string name="sign_in_method_introduction">Muchos clientes abren una página web para autorizar en Twitter, esto puede ser un inconveniente si usas una API personalizada o tienes una conexión lenta. Twidere simula un navegador web normal para ayudar a realizar la autorización en Twitter. No te preocupes, tu contraseña nunca será almacenada ni filtrada.</string>
<string name="quote_protected_status_notice">No se recomienda citar tweets protegidos.</string>
<string name="edit_draft">Editar borrador</string>
<string name="profile_image">Imagen de perfil</string>
@ -412,7 +425,7 @@
<string name="search_deleted">Búsqueda borrada.</string>
<string name="search_name_deleted">Búsqueda \"<xliff:g id="name">%s</xliff:g>\" borrada.</string>
<string name="import_from">Importar desde...</string>
<string name="link_to_quoted_status">Enlace al tweet mencionado</string>
<string name="link_to_quoted_status">Enlace al tweet citado</string>
<string name="quote_original_status">Citar tweet original</string>
<string name="followed_user">Siguiendo a <xliff:g id="user">%s</xliff:g>.</string>
<string name="sent_follow_request_to_user">Enviar una petición de Seguir a <xliff:g id="user">%s</xliff:g>.</string>
@ -486,7 +499,7 @@
<string name="wizard_page_welcome_import_settings">Importar configuración</string>
<string name="wizard_page_theme_text">Selecciona el tema que te gusta.</string>
<string name="wizard_page_tabs_text">Añade algunas pestañas a Twidere.\nMantén un registro de las personas o las cosas que te importan.</string>
<string name="wizard_page_tabs_unchanged_message">Puedes añadir pestañas en \"Configuración\">\"Pestañas\"</string>
<string name="wizard_page_tabs_unchanged_message">Puedes añadir pestañas en &quot;Ajustes&quot; - &quot;Pestañas&quot;</string>
<string name="wizard_page_cards_text">Configura artículos de la tarjeta.</string>
<string name="wizard_page_hints_text">Aquí algunos consejos útiles.</string>
<string name="wizard_page_usage_statistics_text">Twidere participa en un proyecto de investigación que necesita algunos datos de uso.</string>
@ -540,8 +553,8 @@
<string name="theme_background_transparent">Transparente</string>
<string name="theme_dark_actionbar">Barra de acciones oscura</string>
<string name="wizard_hint_compose_select_account">Click en la imagen de perfil para seleccionar una cuenta al escribir un tweet.</string>
<string name="wizard_hint_quote_format">Configure su formato de cita favorita en \"Configuración\">\"Contenido y Almacenamiento\"</string>
<string name="wizard_hint_filters">Puede ocultar tweets indeseados de su cronología y notificaciones usando «Filtros».</string>
<string name="wizard_hint_quote_format">Selecciona tu forma de citar favorita en &quot;Ajustes&quot; - &quot;Componer&quot;</string>
<string name="wizard_hint_filters">Puedes esconder tweets no deseados de la timeline y de las notificaciones usando &quot;Filtros&quot;.</string>
<string name="view_replies">Ver respuestas</string>
<string name="compact_cards">Compactar tarjetas</string>
<string name="compact_cards_summary">Visualizar más tarjetas en pantalla</string>
@ -616,7 +629,6 @@
<string name="delete_drafts_confirm">¿Confirma que quiere eliminar los borradores?</string>
<string name="extra_configurations">Configuraciones Extra</string>
<string name="click_item_to_config">Selecciona un ítem para configurar</string>
<string name="dark_drawer">Cajón oscuro</string>
<string name="retweets_of_me">Retweets de mi</string>
<string name="from_gallery">Desde la galería</string>
<string name="from_camera">Desde la cámara</string>
@ -650,17 +662,17 @@
<string name="state_blocking">Bloqueando</string>
<string name="load_more">Cargar más</string>
<string name="photo">Foto</string>
<string name="camera">Camara</string>
<string name="camera">Cámara</string>
<string name="gallery">Galería</string>
<string name="source_camera">Camara</string>
<string name="source_camera">Cámara</string>
<string name="source_gallery">Galería</string>
<string name="source_clipboard">Portapapeles</string>
<string name="remove">Eliminar</string>
<string name="load_media">Cargar multimedia</string>
<string name="profile_text_color">Color del texto</string>
<string name="profile_background_color">Color del fondo</string>
<string name="profile_link_color_main_color">Color enlaces (color primario)</string>
<string name="retweet_quote_confirm_title">¿Retweet a tus seguidores?</string>
<string name="profile_link_color_main_color">Color de enlaces (color primario)</string>
<string name="retweet_quote_confirm_title">¿Retweetear a tus seguidores?</string>
<string name="font">Fuente</string>
<string name="size">Tamaño</string>
<string name="just_now">Justo ahora</string>
@ -681,10 +693,10 @@
<string name="read_from_bottom_summary_off">Saltar al último tuit después de actualizar</string>
<string name="read_from_bottom_summary_on">Mantenga la posición de lectura después de actualizar</string>
<string name="register">Registrar</string>
<string name="follows">Sigue</string>
<string name="follows">Sigue a</string>
<string name="belongs_to">Pertenece a</string>
<string name="blocked_by_user_summary">Fuiste bloqueado por <xliff:g id="name">%s</xliff:g></string>
<string name="select_accounts">Seleccione la cuenta</string>
<string name="select_accounts">Seleccione las cuentas</string>
<string name="media_preview">Previsualización multimedia</string>
<string name="edit_tabs">Editar pestañas</string>
<string name="no_location">Sin localización</string>
@ -729,6 +741,8 @@
<string name="N_statuses_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> tweets</string>
<string name="N_favorites_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> favoritos</string>
<string name="N_favorites_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> favoritos</string>
<string name="N_likes_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> me gusta</string>
<string name="N_likes_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> le gusta</string>
<string name="drafts_hint_messages">Tus tweets sin enviar se guardarán aquí</string>
<string name="keyboard_shortcuts">Atajos de teclado</string>
<string name="keyboard_shortcut_hint">Presionar teclas</string>
@ -765,6 +779,8 @@
<string name="dark_theme">Tema oscuro</string>
<string name="wizard_hint_title_location_requirement">Acceso a locación</string>
<string name="wizard_hint_summary_location_requirement">Twidere necesita acceso a su locación cuando ud envía un tweet que contiene locación.</string>
<string name="wizard_hint_title_storage_requirement">Permiso de almacenamiento</string>
<string name="wizard_hint_summary_storage_requirement">Twidere necesita permiso de almacenamiento cuando accedes a documentos.</string>
<string name="scrapyard">Chatarrería</string>
<string name="crop_image">Cortar imagen</string>
<string name="usage_label_sent">Enviado</string>
@ -780,4 +796,25 @@
<string name="bug_reports">Reporte de fallos</string>
<string name="invalid_consumer_key">Clave consumidora inválida</string>
<string name="invalid_consumer_secret">Secreto consumidor inválido</string>
<string name="page_up">Página arriba</string>
<string name="page_down">Página abajo</string>
<string name="combined_notifications">Notificaciones combinadas</string>
<string name="combined_notifications_summary_on">Las notificaciones estarán agrupadas</string>
<string name="combined_notifications_summary_off">Las notificaciones serán mostradas por separado</string>
<string name="save_media_no_storage_permission_message">Se necesita permiso de almacenamiento para guardar archivos.</string>
<string name="select_file_no_storage_permission_message">Se necesita permiso de almacenamiento para seleccionar un archivo.</string>
<string name="user_mentioned_you"><xliff:g id="name">%s</xliff:g> te mencionó</string>
<string name="cant_load_all_replies_message">No se pueden cargar todas las menciones. &lt;a href=\"#dialog\";&gt;¿Por qué?&lt;/a&gt;</string>
<string name="cant_load_all_replies_explanation">Debido a la limitación por parte de Twitter a aplicaciones de terceros, Twidere no tiene acceso a las respuestas de un tweet, no hay garantía de que Twidere pueda cargar todas las respuestas.</string>
<string name="current_status">Tweet actual</string>
<string name="twitter_optimized_searches">Búsquedas optimizadas de Twitter</string>
<string name="twitter_optimized_searches_summary">Usa los términos de búsqueda especiales para mejorar los resultados de búsqueda como excluir los retweets</string>
<string name="i_want_my_stars_back">¡Quiero a las estrellas de favoritos de vuelta!</string>
<string name="i_want_my_stars_back_summary">Usar favorito (★) en vez de me gusta (♥︎)</string>
<string name="copy_link">Copiar enlace</string>
<string name="link_copied_to_clipboard">Enlace copiado al portapapeles</string>
<string name="login_verification">Verificación de inicio de sesión</string>
<string name="login_verification_pin_hint">Comprueba tu teléfono y busca un código PIN para introducirlo e iniciar sesión.</string>
<string name="login_verification_push_hint">Acepta la verificación de inicio de sesión requerido por la app de Twitter, una vez apruebes la petición, pulsa Aceptar.</string>
<string name="login_verification_failed">Verificación de inicio de sesión fallida.</string>
</resources>

View File

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources xmlns:tools="http://schemas.android.com/tools" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_description">کارهٔ توییتر خودتان</string>
<string name="compose">ایجاد</string>
<string name="add_account">افزودن حساب</string>
<string name="settings">تنظیمات</string>
@ -37,6 +38,8 @@
<string name="error_unknown_error">خطا: خطای ناشناخته، احتمالاً یک مشکل است.</string>
<string name="error_message">خطا: <xliff:g id="message">%s</xliff:g></string>
<string name="error_message_with_action">خطا‌ هنگام <xliff:g id="action">%1$s</xliff:g>: <xliff:g id="message">%2$s</xliff:g></string>
<string name="error_message_rate_limit">از کرانهٔ نرخ توییتر تجاوز شد. لطفاً <xliff:g id="time">%s</xliff:g> دیگر دوباره تلاش کنید</string>
<string name="error_message_rate_limit_with_action">هنگام <xliff:g id="action">%1$s</xliff:g> از کرانهٔ نرخ توییتر تجاوز شد. لطفاً <xliff:g id="time">%2$s</xliff:g> دیگر دوباره تلاش کنید</string>
<string name="select_account">گزینش حساب</string>
<string name="username">نام‌کاربری</string>
<string name="password">گذرواژه</string>
@ -52,6 +55,8 @@
<string name="cancel_retweet">لغو بازتوییت</string>
<string name="favorite">برگزیدن</string>
<string name="unfavorite">برنگزیدن</string>
<string name="like">پسندیدن</string>
<string name="undo_like">بازگردانی پسندیدن</string>
<string name="reply">پاسخ</string>
<string name="share">هم‌رسانی</string>
<string name="view_image">تصویر</string>
@ -76,6 +81,7 @@
<string name="gzip_compressing_summary">فشرده‌سازی همه‌ی درخواست‌های API، می‌تواند مصرف داده را بکاهد، اما ممکن است روی همه‌ی کارگزارهای API کار نکند.</string>
<string name="storage">ذخیره‌سازی</string>
<string name="database_item_limit">کران اندازهٔ پایگاه داده</string>
<string name="database_item_limit_summary">کران بالای موارد ذخیره شده در پایگاه‌های داده برای هر حساب. برای ذخیرهٔ فضا و افزایش سرعت بار کردن، مقدار کم‌تری تنظیم کنید.</string>
<string name="clear_cache">پاک‌سازی انباره</string>
<string name="clear_cache_summary">پاک‌سازی انبارهٔٔ تصویر نمایهٔ ذخیره‌شده.</string>
<string name="clear_databases">پاک‌سازی پایگاه‌داده‌ها</string>
@ -94,6 +100,7 @@
<string name="retweeted_by_count">بازتوییت شده توسّط <xliff:g id="retweet_count">%d</xliff:g> کاربر</string>
<string name="users_retweeted_this">کاربرانی که این را بازتوییت کردند</string>
<string name="users_favorited_this">کاربرانی که این را برگزیدند</string>
<string name="users_liked_this">کاربرانی که این را پسندیدند</string>
<string name="reply_to">پاسخ به <xliff:g id="user_name">%s</xliff:g></string>
<string name="quote_user">نقل قول از <xliff:g id="user_name">%s</xliff:g></string>
<string name="time_source"><xliff:g id="time">%1$s</xliff:g> · <xliff:g id="source">%2$s</xliff:g></string>
@ -127,6 +134,7 @@
<string name="location">موقعیت</string>
<string name="url">پیوند</string>
<string name="favorites">برگزیده‌ها</string>
<string name="likes">پسندها</string>
<string name="name">نام</string>
<string name="refresh">تازه‌سازی</string>
<string name="retry">سعی دوباره</string>
@ -269,21 +277,35 @@
<string name="activity_about_me_favorite_multi"><xliff:g id="user">%1$s</xliff:g> و <xliff:g id="other">%2$s</xliff:g> توئیت شما را می‌پسندند.</string>
<string name="activity_about_me_favorited_retweet"><xliff:g id="user">%s</xliff:g> بازتوئیت شما را پسندید.</string>
<string name="activity_about_me_favorited_retweet_multi"><xliff:g id="user">%1$s</xliff:g> و <xliff:g id="other">%2$s</xliff:g> بازتوئیت شما را می‌پسندند.</string>
<string name="activity_about_me_like"><xliff:g id="user">%s</xliff:g> توییتتان را پسندید.</string>
<string name="activity_about_me_like_multi"><xliff:g id="user">%1$s</xliff:g> و <xliff:g id="other">%2$s</xliff:g> توییتان را پسندیدند.</string>
<string name="activity_about_me_liked_retweet"><xliff:g id="user">%s</xliff:g> بازتوییتتان را پسندید.</string>
<string name="activity_about_me_liked_retweet_multi"><xliff:g id="user">%1$s</xliff:g> و <xliff:g id="other">%2$s</xliff:g> بازتوییتان را پسندیدند.</string>
<string name="activity_about_me_follow"><xliff:g id="user">%s</xliff:g> شما را دنبال می‌کند.</string>
<string name="activity_about_me_follow_multi"><xliff:g id="user">%1$s</xliff:g> و <xliff:g id="other">%2$s</xliff:g> شما را دنبال می‌کنند.</string>
<string name="activity_about_me_retweet"><xliff:g id="user">%s</xliff:g> توئیت شما را بازتوئیت کرد.</string>
<string name="activity_about_me_retweet_multi"><xliff:g id="user">%1$s</xliff:g> و <xliff:g id="other">%2$s</xliff:g> توئیت شما را بازتوئیت کردند.</string>
<string name="activity_about_me_retweeted_retweet"><xliff:g id="user">%s</xliff:g> بازتوئیت شما را بازتوئیت کرد.</string>
<string name="activity_about_me_retweeted_retweet_multi"><xliff:g id="user">%1$s</xliff:g> و <xliff:g id="other">%2$s</xliff:g> بازتوئیت شما را بازتوئیت کردند.</string>
<string name="activity_about_me_retweeted_mention"><xliff:g id="user">%s</xliff:g> توییتی که در آن اشاره شده بودید را بازتوییت کرد.</string>
<string name="activity_about_me_retweeted_mention_multi"><xliff:g id="user">%s</xliff:g> and <xliff:g id="other">%2$s</xliff:g>، توییتی که در آن اشاره شده بودید را بازتوییت کردند.</string>
<string name="activity_about_me_favorited_mention"><xliff:g id="user">%s</xliff:g> توییتی که در آن اشاره شده بودید را برگزید.</string>
<string name="activity_about_me_favorited_mention_multi"><xliff:g id="user">%s</xliff:g> and <xliff:g id="other">%2$s</xliff:g>، توییتی که در آن اشاره شده بودید را برگزیدند.</string>
<string name="activity_about_me_liked_mention"><xliff:g id="user">%s</xliff:g> توییتی که در آن اشاره شده بودید را پسندید.</string>
<string name="activity_about_me_liked_mention_multi"><xliff:g id="user">%s</xliff:g> and <xliff:g id="other">%2$s</xliff:g>، توییتی که در آن اشاره شده بودید را پسندیدند.</string>
<string name="activity_about_me_list_member_added"><xliff:g id="user">%s</xliff:g> شما را به فهرست افزود.</string>
<string name="activity_about_me_list_member_added_with_name"><xliff:g id="user">%1$s</xliff:g> شما را به فهرست <xliff:g id="list">%2$s</xliff:g> افزود.</string>
<string name="activity_about_me_list_member_added_multi"><xliff:g id="user">%1$s</xliff:g> و <xliff:g id="other">%2$s</xliff:g> شما را به فهرست‌هایشان افزودند.</string>
<string name="activity_by_friends_favorite"><xliff:g id="user">%1$s</xliff:g> توئیت <xliff:g id="target">%2$s</xliff:g> را می‌پسندد.</string>
<string name="activity_by_friends_favorite_multi"><xliff:g id="user">%1$s</xliff:g> توئیت <xliff:g id="target">%2$s</xliff:g> و <xliff:g id="other">%3$s</xliff:g> را می‌پسندد.</string>
<string name="activity_by_friends_like"><xliff:g id="user">%1$s</xliff:g> توییت <xliff:g id="target">%2$s</xliff:g> را پسندید.</string>
<string name="activity_by_friends_like_multi"><xliff:g id="user">%1$s</xliff:g> توییت <xliff:g id="target">%2$s</xliff:g> و <xliff:g id="other">%3$s</xliff:g> را پسندید.</string>
<string name="activity_by_friends_follow"><xliff:g id="user">%1$s</xliff:g> <xliff:g id="target">%2$s</xliff:g> را دنبال می‌کند.</string>
<string name="activity_by_friends_follow_multi"><xliff:g id="user">%1$s</xliff:g>، <xliff:g id="target">%2$s</xliff:g> و <xliff:g id="other">%3$s</xliff:g> را دنبال می‌کند.</string>
<string name="activity_by_friends_retweet"><xliff:g id="user">%1$s</xliff:g> توئیت <xliff:g id="target">%2$s</xliff:g> را بازتوئیت کرد.</string>
<string name="activity_by_friends_retweet_multi"><xliff:g id="user">%1$s</xliff:g> توییت <xliff:g id="target">%2$s</xliff:g> و <xliff:g id="other">%3$s</xliff:g> را بازتوییت کرد.</string>
<string name="activity_by_friends_list_member_added"><xliff:g id="user">%1$s</xliff:g>، <xliff:g id="target">%2$s</xliff:g> را به فهرست افزود.</string>
<string name="activity_by_friends_list_member_added_multi"><xliff:g id="user">%1$s</xliff:g>، <xliff:g id="target">%2$s</xliff:g> و <xliff:g id="other">%1$s</xliff:g> را به فهرست افزود.</string>
<string name="activity_by_friends_list_created"><xliff:g id="user">%1$s</xliff:g> فهرست <xliff:g id="target">%2$s</xliff:g> را ساخت.</string>
<string name="activity_by_friends_list_created_multi"><xliff:g id="user">%1$s</xliff:g> فهرست <xliff:g id="target">%2$s</xliff:g> و <xliff:g id="other">%1$s</xliff:g> را ساخت.</string>
<string name="status_not_updated">توئیت فرستاده نشد.</string>
@ -343,7 +365,7 @@
<string name="links">پیوندها</string>
<string name="edit_profile">ویرایش نمایه</string>
<string name="edit_details">ویرایش جزییات</string>
<string name="display_sensitive_contents">نمایش مختوای حسّاسیت‌برانگیز</string>
<string name="display_sensitive_contents">نمایش محتوای حسّاسیت‌برانگیز</string>
<string name="display_sensitive_contents_summary">نمایش بدون هشدار محتوای حسّاسیت‌برانگیر در خط زمانی</string>
<string name="sensitive_content_warning">ممکن است این توییت محتوای حسّاسیت برانگیر داشته باشد، ادامه دهیم؟</string>
<string name="mark_as_sensitive">علامت گذاری به هنوان حسّاسیت برانگیز</string>
@ -365,6 +387,7 @@
<string name="accept_permission_request">تأیید</string>
<string name="no_thanks">نه، ممنون</string>
<string name="revoke_permissions">لغو دسترسی</string>
<string name="fast_scroll_thumb">لغزش سریع با شست</string>
<string name="indicate_your_status">نمایش دادن توئیتتان</string>
<string name="default_ringtone">زنگ پیش‌فرض</string>
<string name="phishing_link_warning">هشدار Phishing پیوند</string>
@ -376,6 +399,7 @@
<string name="preview_images">پیش‌نمایش تصاویر</string>
<string name="preload_wifi_only">فقط با Wi-Fi پیش بارگذاری کن</string>
<string name="sign_in_method_introduction_title">چگونه کار می‌کند؟</string>
<string name="sign_in_method_introduction">بیش‌تر کاره‌های توییتر برای تأیید هویت با توییتر، صفحهٔ وبی می‌گشایند. این کار می‌تواند هنگام استفاده از یک رابط برنامه‌نویسی شخصی یا در شبکه‌های کند، ناراحت‌کننده باشد. توییدر برای کمک به ورود به توییتر، یک مرورگر عادی را شبیه‌سازی می‌کند. نگران نباشید، گذرواژه‌تان هرگز ذخیره نشده یا درز نمی‌کند.</string>
<string name="quote_protected_status_notice">توصیه نمی‌شود که توئیت‌های محافظت‌شده را نقل قول کنید.</string>
<string name="edit_draft">ویرایش پیش‌نویس</string>
<string name="profile_image">تصویر نمایه</string>
@ -409,6 +433,7 @@
<string name="blocked_user"><xliff:g id="user">%s</xliff:g> مسدود شد.</string>
<string name="unblocked_user"><xliff:g id="user">%s</xliff:g> غیرمسدود شد.</string>
<string name="profile_updated">نمایه به‌روز شد.</string>
<string name="profile_banner_image_updated">تصویر پرچم نمایه به‌روز شد.</string>
<string name="profile_image_updated">تصویر نمایه به‌روز شد.</string>
<string name="created_list">فهرست «<xliff:g id="list">%s</xliff:g>» را ساخت.</string>
<string name="deleted_list">فهرست «<xliff:g id="list">%s</xliff:g>» را حذف کرد.</string>
@ -429,12 +454,14 @@
<string name="original_status">توییت اصلی</string>
<string name="ask">پرسش</string>
<string name="no_close_after_status_updated">باز نگه داشتن «ایجاد»، پس از ارسال توییت</string>
<string name="no_close_after_status_updated_summary">هدیه‌ای گوچک برای پرحرف‌ها</string>
<string name="status_saved_to_draft">توییت در چرک‌نویس‌ها ذخیره شد.</string>
<string name="default_account">حساب پیش‌گزیده</string>
<string name="created_at_with_N_tweets_per_day_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="created_at">%1$s</xliff:g> (<xliff:g id="daily_tweet">%2$d</xliff:g> توییت در روز)</string>
<string name="created_at_with_N_tweets_per_day_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="created_at">%1$s</xliff:g> (<xliff:g id="daily_tweet">%2$d</xliff:g> توییت در روز)</string>
<string name="empty_content">محتوای خالی</string>
<string name="fast_image_loading">بار کردن تصویر سریع</string>
<string name="fast_image_loading_summary">برای بار شدن سریع‌تر تصویرها فعّال کنید. اگر برخی تصویرها نتوانستند نمایش داده شوند، غیر فعّال کنید.</string>
<string name="select_user_list">گزینش فهرست کاربر</string>
<string name="select_user">گزینش کاربر</string>
<string name="created_by">ایجاد شده توسّط <xliff:g id="created_by">%s</xliff:g></string>
@ -470,7 +497,7 @@
<string name="wizard_page_welcome_import_settings">واردکردن تنظیمات</string>
<string name="wizard_page_theme_text">زمینه‌ای که دوست دارید انتخاب کنید.</string>
<string name="wizard_page_tabs_text">تعدادی برگه به Twidere بیافزایید.\nافرادی را که بهشان توجه دارید دنبال کنید.</string>
<string name="wizard_page_tabs_unchanged_message">می‌توانید برگه‌ها را در «تنظیمات» - «برگه‌ها» اضافه کنید.</string>
<string name="wizard_page_tabs_unchanged_message">می‌توانید در &quot;تنظیمات&quot; - &quot;زبانه‌ها&quot;، زبانه‌هایی بیفزایید</string>
<string name="wizard_page_cards_text">تنظیم موارد کارتی.</string>
<string name="wizard_page_hints_text">این‌جا راهنماهای مفیدی هست.</string>
<string name="wizard_page_usage_statistics_text">Twidere در برخی پروژه‌های تحقیقی نقش دارد که نیازمند داده‌های مصرف است.</string>
@ -494,6 +521,9 @@
<string name="destroy_status_confirm_message">این توییت حذف شود؟</string>
<string name="destroy_saved_search">حذف جست‌وجوی ذخیره‌شدهٔ «<xliff:g id="name">%s</xliff:g>»</string>
<string name="destroy_saved_search_confirm_message">جست‌وجوی ذخیره‌شدهٔ «<xliff:g id="name">%s</xliff:g>» حذف شود؟ می‌توانید بعداً دوباره ذخیره‌اش کنید.</string>
<string name="signing_in_error_browser_sign_in_hint">خطا هنگام ورود.شاید لازم باشد از روش ورود با مرورگر استفاده کنید. این کار تنظیمات رابط برنامه‌نویسی شخصی را در طول ورود نادیده خواهد گرفت.</string>
<string name="report_user">گزارش <xliff:g id="name">%s</xliff:g></string>
<string name="report_user_confirm_message">گزارش <xliff:g id="name">%s</xliff:g> برای هرزنامه؟ هم‌چنین این کاربر را مسدود خواهید کرد.</string>
<string name="twidere_test">آزمودن تویدر</string>
<string name="staggered_home_timeline">حط زمانی خانگی موزاییکی</string>
<string name="unread_count">شمار ناخوانده‌ها</string>
@ -513,6 +543,7 @@
<string name="delete_user_confirm_message"><xliff:g id="name">%s</xliff:g> حذف شود؟ این کار بازگشت‌پذیر نیست.</string>
<string name="toggle">جابه‌جایی</string>
<string name="general">عمومی</string>
<string name="hints">راهنمایی‌ها</string>
<string name="finish">پایان</string>
<string name="background">پس‌زمینه</string>
<string name="theme_background_default">پیش‌گزیده</string>
@ -520,14 +551,28 @@
<string name="theme_background_transparent">شفّاف</string>
<string name="theme_dark_actionbar">نوار کنش تیره</string>
<string name="wizard_hint_compose_select_account">هنگام نوشتن یک توییت، برای گزینش حساب، روی تصویر نمایه کلیک کنید.</string>
<string name="wizard_hint_quote_format">قالب نقل‌قول دلخواهتان را در &quot;تنظیمات&quot; - &quot;ایجاد&quot; تنظیم کنید</string>
<string name="wizard_hint_filters">می‌توانید با استفاده از &quot;پالایه‌ها&quot;، توییت‌های ناخواسته را خط زمانتان پنهان کنید.</string>
<string name="view_replies">دیدن پاسخ‌ها</string>
<string name="compact_cards">کارت‌های فشرده</string>
<string name="compact_cards_summary">نمایش کارت‌های بیش‌تر روی صفحه</string>
<string name="N_new_statuses_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="items">%Id</xliff:g> توییت جدید</string>
<string name="N_new_statuses_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="items">%Id</xliff:g> توییت جدید</string>
<string name="N_new_mentions_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="items">%Id</xliff:g> اشارهٔ جدید</string>
<string name="N_new_mentions_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="items">%Id</xliff:g> اشارهٔ جدید</string>
<string name="N_new_messages_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="items">%Id</xliff:g> گفت‌وگوی جدید</string>
<string name="N_new_messages_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="items">%Id</xliff:g> گفت‌وگوی جدید</string>
<string name="status_share_subject_format_with_time">توییت از <xliff:g id="name">%1$s</xliff:g> (@<xliff:g id="screen_name">%2$s</xliff:g>)، در <xliff:g id="time">%3$s</xliff:g></string>
<string name="status_share_text_format_with_link"><xliff:g id="text">%1$s</xliff:g>\n\n<xliff:g id="link">%2$s</xliff:g></string>
<string name="rate_limit">کران نرخ</string>
<string name="wizard_hint_rate_limit">اگر با مشکلات کران نرخ روبه‌رو شدید، لطفاً مرا سرزنش نکنید. این سیاستِ توییتر است.</string>
<string name="preparing_database">آماده سازی پایگاه داده</string>
<string name="preparing_database_toast">آماده‌سازی پایگاه داده… لطفاً مدّتی صبر کنید.</string>
<string name="action_name_saved_at_time"><xliff:g id="action">%1$s</xliff:g>, ذخیره شده در <xliff:g id="time">%2$s</xliff:g></string>
<string name="update_status">ارسال توییت</string>
<string name="sending_direct_message">فرستادن پیام مستقیم</string>
<string name="tab_display_option">گزینهٔ نمایش زبانه</string>
<string name="livewp_daydream_enabled_message">هدیهٔ کوچکی برای شما وجود دارد. آن را در تنظیمات سامانه پیدا کنید (:</string>
<string name="center">مرکز</string>
<string name="multi_select">انتخاب چندگانه</string>
<string name="long_click_to_open_menu">کلیک طولانی برای گشودن فهرست</string>
@ -552,6 +597,7 @@
<string name="progress">پیشرفت</string>
<string name="hidden_settings">تنظیمات پنهان</string>
<string name="hidden_settings_warning_title">هشدار: این تنظمیمات ممکن است صدمه بزنند!</string>
<string name="hidden_settings_warning_message">در صورتی که نمی‌دانید این تنظیمات چیستند، هرگز آن‌ها را تغییر ندهید، وگرنه:\n * گربه‌تان را می‌کشد\n * سلاح‌های هسته‌ای در کرهٔ شمالی را شلّیک مي‌کند\n * تمام ماهوشوجوها را به موجو تبدیل می‌کند\n * جهان را نابود می‌کند</string>
<string name="force_using_private_apis">اجبار به استفاده زا API شخصی</string>
<string name="status_text_limit">کران متن توییت</string>
<string name="load_more_from_top">بار کردن بیش‌تر از بالا</string>
@ -580,7 +626,6 @@
<string name="delete_drafts_confirm">حدف چرک‌نویس‌های گزیده؟</string>
<string name="extra_configurations">پیکربندی‌های اضافی</string>
<string name="click_item_to_config">برای پیکربندی، روی یک مورد کلیک کنید</string>
<string name="dark_drawer">کشوی تیره</string>
<string name="retweets_of_me">بارتوییت‌های من</string>
<string name="from_gallery">از جُنگ</string>
<string name="from_camera">از دوربین</string>
@ -679,10 +724,13 @@
<string name="user_type_protected">محافظت‌شده</string>
<string name="tweet_hashtag">توییت #<xliff:g id="text">%1$s</xliff:g></string>
<string name="share_status">هم‌رسانی توییت</string>
<string name="pebble_notifications">آگهی‌های پبل</string>
<string name="pebble_notifications_summary">ارسال آگهی‌ها به پبلتان</string>
<string name="tweet_from_name">توییت از <xliff:g id="text">%1$s</xliff:g></string>
<string name="permission_label_shorten_status">توییت کوتاه شده</string>
<string name="permission_label_upload_media">بارگذاری رسانه</string>
<string name="permission_label_sync_timeline">هم‌گام‌سازی خط زمانی</string>
<string name="thumbor_integration">یک‌پارچه سازی تومبور</string>
<string name="server_address">نشانی کارساز</string>
<string name="security_key">کلید امنیتی</string>
<string name="hide_card_actions">پنهان کردن عملیات کارت</string>
@ -690,6 +738,8 @@
<string name="N_statuses_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> توییت</string>
<string name="N_favorites_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> برگزیده</string>
<string name="N_favorites_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> برگزیده</string>
<string name="N_likes_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="count">%Id</xliff:g> پسند</string>
<string name="N_likes_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="count">%Id</xliff:g> پسند</string>
<string name="drafts_hint_messages">توییت‌های فرستاده نشده‌تان این‌حا ذخیره می‌شوند</string>
<string name="keyboard_shortcuts">میان‌برهای صفحه‌کلید</string>
<string name="keyboard_shortcut_hint">فشردن کلیدها</string>
@ -723,15 +773,45 @@
<string name="dark_theme">زمینهٔ تیره</string>
<string name="wizard_hint_title_location_requirement">اجازهٔ موقعیّت</string>
<string name="wizard_hint_summary_location_requirement">هنگامی که توییتی شامل موقعیّت می‌فرستید* تویدر نیاز به اجازهٔ موقعیّت دارد.</string>
<string name="wizard_hint_title_storage_requirement">اجازهٔ ذخیره</string>
<string name="wizard_hint_summary_storage_requirement">توییدر هنگامی که به سندها دسترسی پیدا می‌کنید، نیاز به اجازهٔ ذخیره دارد.</string>
<string name="scrapyard">ظاهر</string>
<string name="crop_image">بریدن تصویر</string>
<string name="usage_label_sent">ارسال شده</string>
<string name="usage_label_received">دریافت شده</string>
<string name="this_month">این ماه</string>
<string name="media_preload">پیش‌بارگیری رسانه</string>
<string name="on_mobile_network">روی شبکهٔ همراه</string>
<string name="set_consumer_key_secret_message">توییدر به کران ژتون رسیده است. باید در https://apps.twitter.com/ کاره‌ای ساختع و کلید و رمز مصرف‌کننده را در زیر بچسبانید.\nاگر به استفاده از کلید پیش‌گزیده ادامه دهید، ممکن است قادر به ورود نباشید.</string>
<string name="send_at">ارسال در</string>
<string name="scheduled_statuses">تویتت‌های زمان‌بندی شده</string>
<string name="report_usage_statistics_now">اکنون آمار استفاده را گزارش کن</string>
<string name="cache_size_limit">کران اندازهٔ انباره</string>
<string name="bug_reports">گزارش‌های مشکل</string>
<string name="invalid_consumer_key">کلید مصرف‌کنندهٔ نامعتبر</string>
<string name="invalid_consumer_secret">رمز مصرف‌کنندهٔ نامعتبر</string>
<string name="page_up">صفحه بالا</string>
<string name="page_down">صفحه پایین</string>
<string name="combined_notifications">آگهی‌های ترکیبی</string>
<string name="combined_notifications_summary_on">آگهی‌ها دسته‌بندی خواهند شد</string>
<string name="combined_notifications_summary_off">آگهی‌ها به صورت تکی نمایش داده خواهند شد</string>
<string name="save_media_no_storage_permission_message">برای ذخیرهٔ داده، نیاز به اجازهٔ ذخیره است.</string>
<string name="select_file_no_storage_permission_message">برای گزینش پرونده،‌نیاز به اجازهٔ ذخیره است.</string>
<string name="user_mentioned_you"><xliff:g id="user">%s</xliff:g> به شما اشاره کرد</string>
<string name="cant_load_all_replies_message">نمی‌توان تمام پاسخ‌ها را بار کرد. &lt;a href=\"#dialog\";&gt;چرا؟&lt;/a&gt;</string>
<string name="cant_load_all_replies_explanation">به خاطر محدودیت‌های توییتر برای کاره‌های توییتر شخص ثالث، توییدر به پاسخ‌ها به یک توییت دسترسی ندارد. تضمینی نیست که توییدر بتواند تمام پاسخ‌ها به یک توییت را بار کند.</string>
<string name="current_status">توییت جاری</string>
<string name="twitter_optimized_searches">جست‌وجوهای بهینه شدهٔ توییتر</string>
<string name="twitter_optimized_searches_summary">استفاده از عبارت‌های جست‌وجوی مخصوص برای بهبود نتایج، مانند خارج کردن بازتوییت‌ها</string>
<string name="i_want_my_stars_back">ستاره‌های ما رو پس بگیر!</string>
<string name="i_want_my_stars_back_summary">استفاده ار برگزیدن (★) به‌جای پسندیدن (♥︎)</string>
<string name="copy_link">رونوشت از پیوند</string>
<string name="link_copied_to_clipboard">پیوند در حافظه رونوشت شد</string>
<string name="login_verification">تأیید هویت ورود</string>
<string name="login_verification_pin_hint">تلفنتان را برای یک رمز پین بررسی کرده و برای ورود، آن را وارد کنید.</string>
<string name="login_verification_push_hint">قبول درخواست تأیید ورود از کارهٔ توییتر. پس از این که درخواست را تأیید کردید، روی قبول کلیک کنید.</string>
<string name="login_verification_failed">تأیید هویت ورود شکست خورد.</string>
<string name="saved_searches_already_saved_hint">احتمالاً از پیش این جست‌‌وجو را ذخیره کرده‌اید</string>
<string name="unsupported_activity_action_title">عمل <xliff:g id="action">%s</xliff:g></string>
<string name="unsupported_activity_action_summary">لطفاً عمل بالا را گزارش دهید</string>
</resources>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources>
<string name="error_http_407">نیاز به تأیید هویت پیشکار</string>
</resources>

View File

@ -380,7 +380,6 @@
<string name="preview_images">Esikatsele kuvia</string>
<string name="preload_wifi_only">Lataa etukäteen vain Wi-Fi-yhteydellä</string>
<string name="sign_in_method_introduction_title">Kuinka se toimii?</string>
<string name="sign_in_method_introduction">Suurin osa Twitter sovelluksista avaa sivuston antaakseen sovellukselle luvan käyttää Twitter-tiliäsi, tämä voi tuntua hankalalta, jos sovellus käyttää sille räätälöityä ohjelmointirajapintaa, tai jos yhteys on huono. Twidere simuloi tavallista selainta helpottaakseen käyttäjää kirjautumaan Twitter-tililleen. Salasanaasi ei tulla koskaan tallentamaan eikä sitä tulla vuotamaan.</string>
<string name="quote_protected_status_notice">Ei ole suositeltavaa lainata suojattua twiittiä.</string>
<string name="edit_draft">Muokkaa luonnosta</string>
<string name="profile_image">Profiilikuva</string>
@ -480,7 +479,6 @@
<string name="wizard_page_welcome_import_settings">Tuo asetukset</string>
<string name="wizard_page_theme_text">Valitse haluamasi teema.</string>
<string name="wizard_page_tabs_text">Lisää välilehtiä Twidereen\nSeuraa ihmisiä ja asioita, joista olet kiinnostunut.</string>
<string name="wizard_page_tabs_unchanged_message">Voit lisätä välilehtiä kohdasta \"Asetukset\" ja \"Välilehdet\"</string>
<string name="wizard_page_cards_text">Määritä kortit.</string>
<string name="wizard_page_hints_text">Tässä on joitakin hyödyllisiä vinkkejä.</string>
<string name="wizard_page_usage_statistics_text">Twidere otti osaa erääseen tutkimukseen, joka tarvitsee jonkin verran käyttötietoja.</string>
@ -534,8 +532,6 @@
<string name="theme_background_transparent">Läpinäkyvä</string>
<string name="theme_dark_actionbar">Tumma ActionBar</string>
<string name="wizard_hint_compose_select_account">Kosketa käyttäjäkuvaa valitaksesi tilin, jolla twiitti lähetetään.</string>
<string name="wizard_hint_quote_format">Määritä haluamasi lainausmuoto kohdasta \"Asetukset\" - \"Sisältö &amp; säilytys\"</string>
<string name="wizard_hint_filters">Suodattimilla voit piilottaa aikajanasta ja ilmoituksista twiitit, joita et halua nähdä.</string>
<string name="view_replies">Näytä vastaukset</string>
<string name="compact_cards">Tiiviit kortit</string>
<string name="compact_cards_summary">Näytä ruudulla enemmän kortteja</string>
@ -610,7 +606,6 @@
<string name="delete_drafts_confirm">Poistetaanko valittu luonnos?</string>
<string name="extra_configurations">Lisäasetukset</string>
<string name="click_item_to_config">Määritä napauttamalla</string>
<string name="dark_drawer">Tumma vetolaatikko</string>
<string name="retweets_of_me">Twiittieni uudelleentwiittaukset</string>
<string name="from_gallery">Galleriasta</string>
<string name="from_camera">Kamerasta</string>

View File

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?><!--Generated by crowdin.com-->
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources>
<string name="error_http_407">Välityspalvelimen vahvistus vaaditaan</string>
<string name="error_http_407">Välityspalvelimen vahvistus vaaditaan</string>
</resources>

View File

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources xmlns:tools="http://schemas.android.com/tools" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_description">Ta propre application Twitter</string>
<string name="compose">Écrire</string>
<string name="add_account">Ajouter un compte</string>
<string name="settings">Paramètres</string>
@ -11,7 +12,7 @@
<string name="remove_location">Supprimer l\'emplacement</string>
<string name="remove_image">Supprimer l\'image</string>
<string name="remove_photo">Supprimer la photo</string>
<string name="status_hint">Que se passe-t-il ?</string>
<string name="status_hint">Quoi de neuf?</string>
<string name="sign_up">S\'inscrire</string>
<string name="sign_in">Se connecter</string>
<string name="rest_base_url">URL de la base REST</string>
@ -54,6 +55,8 @@
<string name="cancel_retweet">Annuler le retweet</string>
<string name="favorite">Ajouter aux favoris</string>
<string name="unfavorite">Supprimer des favoris</string>
<string name="like">J\'aime</string>
<string name="undo_like">Ne plus aimer</string>
<string name="reply">Répondre</string>
<string name="share">Partager</string>
<string name="view_image">Image</string>
@ -88,7 +91,7 @@
<string name="image_load_summary">Désactiver ceci va augmenter la vitesse de défilement et de réduire la consommation des données.</string>
<string name="in_reply_to_name">En réponse à <xliff:g id="user_name">%s</xliff:g></string>
<string name="name_retweeted"><xliff:g id="user_name">%s</xliff:g> a retweeté</string>
<string name="name_and_another_retweeted"><xliff:g id="user_name">%1$s</xliff:g> et un autre a retweeté</string>
<string name="name_and_another_retweeted"><xliff:g id="user_name">%1$s</xliff:g> et d\'autres ont retweetés</string>
<string name="name_and_count_retweeted"><xliff:g id="user_name">%1$s</xliff:g> et <xliff:g id="retweet_count">%2$d</xliff:g> autres ont retweeté</string>
<string name="N_retweeted_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="retweet_count">%d</xliff:g> retweet</string>
<string name="N_retweeted_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="retweet_count">%d</xliff:g> retweets</string>
@ -96,7 +99,8 @@
<string name="retweeted_by_name_with_count">Retweeté par <xliff:g id="user_name">%1$s</xliff:g> et <xliff:g id="retweet_count">%2$d</xliff:g> autres</string>
<string name="retweeted_by_count">Retweeté par <xliff:g id="retweet_count">%d</xliff:g> utilisateurs</string>
<string name="users_retweeted_this">Utilisateurs ont retweeté ceci</string>
<string name="users_favorited_this">Utilisateurs ont ajouté ceci à leur favoris</string>
<string name="users_favorited_this">Utilisateurs ayant ajouté ceci à leur favoris</string>
<string name="users_liked_this">Des utilisateurs aiment ça</string>
<string name="reply_to">Répondre à <xliff:g id="user_name">%s</xliff:g></string>
<string name="quote_user">Citer <xliff:g id="user_name">%s</xliff:g></string>
<string name="time_source"><xliff:g id="time">%1$s</xliff:g> · <xliff:g id="source">%2$s</xliff:g></string>
@ -114,7 +118,7 @@
<string name="pick_color">Choisir une couleur</string>
<string name="follow">Suivre</string>
<string name="unfollow">Ne plus suivre</string>
<string name="leftside_compose_button">Bouton Écrire à gauche</string>
<string name="leftside_compose_button">Bouton \"Écrire\" à gauche</string>
<string name="leftside_compose_button_summary">Placer le bouton d\'écriture à gauche.</string>
<string name="load_item_limit">Limite de chargement</string>
<string name="load_item_limit_summary">Nombre de tweets par chargement.</string>
@ -130,6 +134,7 @@
<string name="location">Emplacement</string>
<string name="url">URL</string>
<string name="favorites">Favoris</string>
<string name="likes">J\'aimes</string>
<string name="name">Nom</string>
<string name="refresh">Rafraîchir</string>
<string name="retry">Rééssayer</string>
@ -152,7 +157,7 @@
<string name="reported_users_for_spam">Utilisateurs signalés pour spam.</string>
<string name="filename_hint">Nom du fichier</string>
<string name="please_wait">Veuillez patienter.</string>
<string name="saved_to_gallery">Sauvegardé dans la gallerie.</string>
<string name="saved_to_gallery">Sauvegardé dans la galerie.</string>
<string name="proxy">Proxy</string>
<string name="http_proxy">Proxy HTTP</string>
<string name="http_proxy_summary">Utiliser le Proxy HTTP pour toutes les requêtes réseau.</string>
@ -270,8 +275,12 @@
<string name="activities_by_friends">Activités par amis</string>
<string name="activity_about_me_favorite"><xliff:g id="user">%s</xliff:g> a ajouté votre tweet à ses favoris.</string>
<string name="activity_about_me_favorite_multi"><xliff:g id="user">%1$s</xliff:g> et <xliff:g id="other">%2$s</xliff:g> ont mis votre tweet en favoris.</string>
<string name="activity_about_me_favorited_retweet"><xliff:g id="user">%s</xliff:g> a mit votre retweet en favoris.</string>
<string name="activity_about_me_favorited_retweet_multi"><xliff:g id="user">%1$s</xliff:g> et <xliff:g id="other">%2$s</xliff:g> ont mis votre retweet en favoris.</string>
<string name="activity_about_me_favorited_retweet"><xliff:g id="user">%s</xliff:g> a ajouté votre retweet à ses favoris.</string>
<string name="activity_about_me_favorited_retweet_multi"><xliff:g id="user">%1$s</xliff:g> et <xliff:g id="other">%2$s</xliff:g> ont ajoutés votre retweet en favoris.</string>
<string name="activity_about_me_like"><xliff:g id="user">%s</xliff:g> aime votre tweet.</string>
<string name="activity_about_me_like_multi"><xliff:g id="user">%1$s</xliff:g> et <xliff:g id="other">%2$s</xliff:g> aiment votre tweet.</string>
<string name="activity_about_me_liked_retweet"><xliff:g id="user">%s</xliff:g> aime votre retweet.</string>
<string name="activity_about_me_liked_retweet_multi"><xliff:g id="user">%1$s</xliff:g> and <xliff:g id="other">%2$s</xliff:g> aiment votre retweet.</string>
<string name="activity_about_me_follow"><xliff:g id="user">%s</xliff:g> vous suit.</string>
<string name="activity_about_me_follow_multi"><xliff:g id="user">%1$s</xliff:g> et <xliff:g id="other">%2$s</xliff:g> vous suivent désormais.</string>
<string name="activity_about_me_retweet"><xliff:g id="user">%s</xliff:g> a retweeté votre tweet.</string>
@ -282,11 +291,15 @@
<string name="activity_about_me_retweeted_mention_multi"><xliff:g id="user">%s</xliff:g> et <xliff:g id="other">%2$s</xliff:g> ont retweeté un tweet vous mentionnant.</string>
<string name="activity_about_me_favorited_mention"><xliff:g id="user">%s</xliff:g> a mis en favoris un tweet qui vous mentionne.</string>
<string name="activity_about_me_favorited_mention_multi"><xliff:g id="user">%s</xliff:g> et <xliff:g id="other">%2$s</xliff:g> ont mis en favoris un tweet qui vous mentionne.</string>
<string name="activity_about_me_liked_mention"><xliff:g id="user">%s</xliff:g> a mis en favoris un tweet qui vous mentionne.</string>
<string name="activity_about_me_liked_mention_multi"><xliff:g id="user">%s</xliff:g> et <xliff:g id="other">%2$s</xliff:g> ont mis en favoris un tweet qui vous mentionne.</string>
<string name="activity_about_me_list_member_added"><xliff:g id="user">%s</xliff:g> vous a ajouté à une liste.</string>
<string name="activity_about_me_list_member_added_with_name"><xliff:g id="user">%1$s</xliff:g> vous a ajouté à la liste <xliff:g id="list">%2$s</xliff:g>\".</string>
<string name="activity_about_me_list_member_added_multi"><xliff:g id="user">%1$s</xliff:g> et <xliff:g id="other">%2$s</xliff:g> vous ont ajouté à leurs listes.</string>
<string name="activity_by_friends_favorite"><xliff:g id="user">%1$s</xliff:g> a ajouté en favoris le tweet de <xliff:g id="target">%2$s</xliff:g>.</string>
<string name="activity_by_friends_favorite_multi"><xliff:g id="user">%1$s</xliff:g> a mit en favoris les tweets de <xliff:g id="target">%2$s</xliff:g> et <xliff:g id="other">%3$s</xliff:g>.</string>
<string name="activity_by_friends_like"><xliff:g id="user">%1$s</xliff:g> aime le tweet de <xliff:g id="target">%2$s</xliff:g>.</string>
<string name="activity_by_friends_like_multi"><xliff:g id="user">%1$s</xliff:g> aime les tweets de <xliff:g id="target">%2$s</xliff:g> et <xliff:g id="other">%3$s</xliff:g>.</string>
<string name="activity_by_friends_follow"><xliff:g id="user">%1$s</xliff:g> suit <xliff:g id="target">%2$s</xliff:g>.</string>
<string name="activity_by_friends_follow_multi"><xliff:g id="user">%1$s</xliff:g> suit <xliff:g id="target">%2$s</xliff:g> et <xliff:g id="other">%3$s</xliff:g>.</string>
<string name="activity_by_friends_retweet"><xliff:g id="user">%1$s</xliff:g> a retweeté le tweet de <xliff:g id="target">%2$s</xliff:g>.</string>
@ -486,7 +499,7 @@
<string name="wizard_page_welcome_import_settings">Importer des paramètres</string>
<string name="wizard_page_theme_text">Choisissez un thème que vous aimez.</string>
<string name="wizard_page_tabs_text">Ajouter des onglets à Twidere.\nGarder un œil sur les personnes ou les choses qui vous intéressent.</string>
<string name="wizard_page_tabs_unchanged_message">Vous pouvez ajouter des onglets dans \"Paramètres\" - \"Onglets personnalisés\"</string>
<string name="wizard_page_tabs_unchanged_message">Tu peux ajouter des onglets dans \"Paramètres\" - \"Onglets\"</string>
<string name="wizard_page_cards_text">Configurer les objets de la carte.</string>
<string name="wizard_page_hints_text">Voici quelques conseils utiles.</string>
<string name="wizard_page_usage_statistics_text">Twidere prend part à certains projets de recherche qui nécessitent l\'utilisation de données.</string>
@ -540,8 +553,8 @@
<string name="theme_background_transparent">Transparent</string>
<string name="theme_dark_actionbar">«ActionBar» sombre</string>
<string name="wizard_hint_compose_select_account">Cliquez sur l\'image de profil pour sélectionner un compte lorsque vous composez un tweet.</string>
<string name="wizard_hint_quote_format">Configurer le format de citation favori dans \"Paramètres\" - \"Contenu &amp; Stockage\"</string>
<string name="wizard_hint_filters">Vous pouvez cacher les tweets indésirables du fil d\'actualité et des notifications en utilisant les \"Filtres\".</string>
<string name="wizard_hint_quote_format">Définissez le format favoris de vos citations dans &quot;Paramètres&quot; - &quot;&Eacute;crire&quot;</string>
<string name="wizard_hint_filters">Vous pouvez masquer les tweets indésirables de la timeline et des notifications en utilisant des &quot;Filtres&quot;.</string>
<string name="view_replies">Voir les réponses</string>
<string name="compact_cards">Cartes compactes</string>
<string name="compact_cards_summary">Afficher plus de cartes à l\'écran</string>
@ -616,7 +629,6 @@
<string name="delete_drafts_confirm">Supprimer les brouillons sélectionnés ?</string>
<string name="extra_configurations">Configurations supplémentaires</string>
<string name="click_item_to_config">Cliquez sur un élément à configurer</string>
<string name="dark_drawer">Tiroir sombre</string>
<string name="retweets_of_me">Retweets de moi</string>
<string name="from_gallery">Depuis la galerie</string>
<string name="from_camera">Depuis l\'appareil photo</string>
@ -729,6 +741,8 @@
<string name="N_statuses_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> tweets</string>
<string name="N_favorites_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> favoris</string>
<string name="N_favorites_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> favoris</string>
<string name="N_likes_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> J\'aime</string>
<string name="N_likes_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> J\'aimes</string>
<string name="drafts_hint_messages">Vos tweets non-lus sont sauvés ici</string>
<string name="keyboard_shortcuts">Raccourcis clavier</string>
<string name="keyboard_shortcut_hint">Pressez les touches</string>
@ -765,6 +779,8 @@
<string name="dark_theme">Thème sombre</string>
<string name="wizard_hint_title_location_requirement">Permission de localisation</string>
<string name="wizard_hint_summary_location_requirement">Twidere a besoin de votre permission pour la localisation quand vous envoyez un tweet contenant la localisation.</string>
<string name="wizard_hint_title_storage_requirement">Permissions de stockage</string>
<string name="wizard_hint_summary_storage_requirement">Twidere nécessite les autorisations de stockage lorsque vous accédez à des documents.</string>
<string name="scrapyard">Divers</string>
<string name="crop_image">Rogner l\'image</string>
<string name="usage_label_sent">Envoyé</string>
@ -778,4 +794,27 @@
<string name="report_usage_statistics_now">Rapport immédiat des statistiques d\'utilisation</string>
<string name="cache_size_limit">Taille limite du cache</string>
<string name="bug_reports">Rapports de bugs</string>
<string name="invalid_consumer_key">Clé de client invalide</string>
<string name="invalid_consumer_secret">Clé secrète de client invalide</string>
<string name="page_up">Page précédente</string>
<string name="page_down">Page suivante</string>
<string name="combined_notifications">Notifications combinées</string>
<string name="combined_notifications_summary_on">Les notifications seront groupées</string>
<string name="combined_notifications_summary_off">Les notifications seront affichées séparément</string>
<string name="save_media_no_storage_permission_message">Les autorisations de stockage sont nécessaires pour sauvegarder les médias.</string>
<string name="select_file_no_storage_permission_message">Les autorisations de stockage sont nécessaires pour sélectionner un fichier.</string>
<string name="user_mentioned_you"><xliff:g id="user">%s</xliff:g> vous a mentioné</string>
<string name="cant_load_all_replies_message">Impossible de charger toutes les réponses. Pourquoi ?</string>
<string name="cant_load_all_replies_explanation">A cause des limitations de Twitter pour les applications tierces, Twidere n\'a pas accès aux réponse à un tweet. Il n\'y a pas de garanties que Twidere puisse charger toutes les réponses à un tweet.</string>
<string name="current_status">Tweet en cours</string>
<string name="twitter_optimized_searches">Recherche optimisée Twitter</string>
<string name="twitter_optimized_searches_summary">Utilisez des termes de recherche spécifiques pour améliorer les résultats de recherche comme l\'exclusion des retweets</string>
<string name="i_want_my_stars_back">Je veux retrouvez mes étoiles !</string>
<string name="i_want_my_stars_back_summary">Utiliser les favoris (★) à la place des J\'aime (♥︎)</string>
<string name="copy_link">Copier le lien</string>
<string name="link_copied_to_clipboard">Lien copié dans le presse-papier</string>
<string name="login_verification">Vérification de l\'identifiant</string>
<string name="login_verification_pin_hint">Surveillez sur votre téléphone l\'arrivé d\'un code PIN et saisissez-le pour vous connecter.</string>
<string name="login_verification_push_hint">Acceptez la demande d\'authentification par l\'application Twitter, une fois la demande acceptée, cliquez sur OK.</string>
<string name="login_verification_failed">Échec lors de la vérification de la connexion.</string>
</resources>

View File

@ -380,7 +380,6 @@
<string name="preview_images">Slike predpregleda</string>
<string name="preload_wifi_only">Predpregled sam preko Wi-Fi</string>
<string name="sign_in_method_introduction_title">Kako to funkcionira?</string>
<string name="sign_in_method_introduction">Većina klijenata otvara web stranicu za autentikaciju za Twitter, ovo može biti neprikladno ako se koristi prilagođeni API ili ako ste na sporoj mreži. Twidere simulira uobičajeni preglednik kako bi vam pomogao kod prijave u Twitter. Ne brinite se, vaša lozinka nikad neće biti spremljena ili će procuriti.</string>
<string name="quote_protected_status_notice">Ne preporuča se citirati zaštićene tweetove.</string>
<string name="edit_draft">Uredi skicu</string>
<string name="profile_image">Slika profila</string>
@ -480,7 +479,6 @@
<string name="wizard_page_welcome_import_settings">Uvezi postavke</string>
<string name="wizard_page_theme_text">Odaberite temu koja vam se sviđa.</string>
<string name="wizard_page_tabs_text">Dodajte tabove u Twidere.\nPratite ljude i stvari do kojih vam je stalo.</string>
<string name="wizard_page_tabs_unchanged_message">Možete dodati tabove u \"Postavke\" - \"Tabovi\"</string>
<string name="wizard_page_cards_text">Postavite stavke kartice.</string>
<string name="wizard_page_hints_text">Evo nekoliko korisnih savjeta.</string>
<string name="wizard_page_usage_statistics_text">Twidere sudjeluje u istraživačkom projektu kojemu trebaju podaci o korištenju.</string>
@ -534,8 +532,6 @@
<string name="theme_background_transparent">Prozirno</string>
<string name="theme_dark_actionbar">Tamna Akcijska Traka</string>
<string name="wizard_hint_compose_select_account">Dodirnite sliku profila za odabir računa kod pisanja tweeta.</string>
<string name="wizard_hint_quote_format">Postavite format nadražih citata u \"Postavke\" - \"Sadržaj &amp; Pohrana\"</string>
<string name="wizard_hint_filters">Možete sakriti neželjene tweetove s timelinea i obavijesti koristeći \"Filtri\".</string>
<string name="view_replies">Pregledaj Odgovore</string>
<string name="compact_cards">Kompaktne kartice</string>
<string name="compact_cards_summary">Prikaži više kartice na zaslonu</string>
@ -610,7 +606,6 @@
<string name="delete_drafts_confirm">Obrisati odabrane skice?</string>
<string name="extra_configurations">Dodatne postavke</string>
<string name="click_item_to_config">Dodirnite stavku za postavljanje</string>
<string name="dark_drawer">Tamna ladica</string>
<string name="retweets_of_me">Moji rewteetovi</string>
<string name="from_gallery">Iz galerije</string>
<string name="from_camera">Iz kamere</string>

View File

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources xmlns:tools="http://schemas.android.com/tools" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_description">A te Twitter alkalmazásod</string>
<string name="compose">Létrehoz</string>
<string name="add_account">Fiók hozzáadása</string>
<string name="settings">Beállítások</string>
@ -54,6 +55,8 @@
<string name="cancel_retweet">Retweet visszavonása</string>
<string name="favorite">Kedvencnek jelöl</string>
<string name="unfavorite">Mégsem kedvenc</string>
<string name="like">Tetszik</string>
<string name="undo_like">Mégsem tetszik</string>
<string name="reply">Válasz</string>
<string name="share">Megosztás</string>
<string name="view_image">Kép</string>
@ -97,6 +100,7 @@
<string name="retweeted_by_count">Retweetelte <xliff:g id="retweet_count">%d</xliff:g> felhasználó</string>
<string name="users_retweeted_this">Következő felhasználók által retweetelve</string>
<string name="users_favorited_this">Kedvencnek jelölő felhasználók</string>
<string name="users_liked_this">Felhasználó kedveli</string>
<string name="reply_to">Válasz neki: <xliff:g id="user_name">%s</xliff:g></string>
<string name="quote_user">Idézet: <xliff:g id="user_name">%s</xliff:g></string>
<string name="time_source"><xliff:g id="time">%1$s</xliff:g> · <xliff:g id="source">%2$s</xliff:g></string>
@ -130,6 +134,7 @@
<string name="location">Tartózkodási hely</string>
<string name="url">URL</string>
<string name="favorites">Kedvencek</string>
<string name="likes">Kedvelés</string>
<string name="name">Név</string>
<string name="refresh">Frissít</string>
<string name="retry">Újrapróbál</string>
@ -272,21 +277,35 @@
<string name="activity_about_me_favorite_multi"><xliff:g id="user">%1$s</xliff:g> és <xliff:g id="other">%2$s</xliff:g> a kedvencek közé rakták a tweeted.</string>
<string name="activity_about_me_favorited_retweet"><xliff:g id="user">%s</xliff:g> kedvencek közé rakta a retweeted.</string>
<string name="activity_about_me_favorited_retweet_multi"><xliff:g id="user">%1$s</xliff:g> és <xliff:g id="other">%2$s</xliff:g> a kedvencek közé rakták a retweeted.</string>
<string name="activity_about_me_like"><xliff:g id="user">%s</xliff:g> kedveli a tweeted.</string>
<string name="activity_about_me_like_multi"><xliff:g id="user">%1$s</xliff:g> és <xliff:g id="other">%2$s</xliff:g> kedveli a tweeted.</string>
<string name="activity_about_me_liked_retweet"><xliff:g id="user">%s</xliff:g> kedveli a retweeted.</string>
<string name="activity_about_me_liked_retweet_multi"><xliff:g id="user">%1$s</xliff:g> és <xliff:g id="other">%2$s</xliff:g> kedveli a retweeted.</string>
<string name="activity_about_me_follow"><xliff:g id="user">%s</xliff:g> követ téged.</string>
<string name="activity_about_me_follow_multi"><xliff:g id="user">%1$s</xliff:g> és <xliff:g id="other">%2$s</xliff:g> követnek téged.</string>
<string name="activity_about_me_retweet"><xliff:g id="user">%s</xliff:g> retweetelt.</string>
<string name="activity_about_me_retweet_multi"><xliff:g id="user">%1$s</xliff:g> és <xliff:g id="other">%2$s</xliff:g> retweetelte a tweeted.</string>
<string name="activity_about_me_retweeted_retweet"><xliff:g id="user">%s</xliff:g> retweetelte a retweeted.</string>
<string name="activity_about_me_retweeted_retweet_multi"><xliff:g id="user">%1$s</xliff:g> és <xliff:g id="other">%2$s</xliff:g> retweetelték a retweeted.</string>
<string name="activity_about_me_retweeted_mention"><xliff:g id="user">%s</xliff:g> retweetelte a tweetet miben említenek.</string>
<string name="activity_about_me_retweeted_mention_multi"><xliff:g id="user">%s</xliff:g> és <xliff:g id="other">%2$s</xliff:g> retweetelte a tweetet miben említenek.</string>
<string name="activity_about_me_favorited_mention"><xliff:g id="user">%s</xliff:g> kedvence a tweet miben említenek.</string>
<string name="activity_about_me_favorited_mention_multi"><xliff:g id="user">%s</xliff:g> és <xliff:g id="other">%2$s</xliff:g> kedvence a tweet miben említenek.</string>
<string name="activity_about_me_liked_mention"><xliff:g id="user">%s</xliff:g> kedveli a tweet miben említenek.</string>
<string name="activity_about_me_liked_mention_multi"><xliff:g id="user">%s</xliff:g> és <xliff:g id="other">%2$s</xliff:g> kedveli a tweet miben említenek.</string>
<string name="activity_about_me_list_member_added"><xliff:g id="user">%s</xliff:g> hozzáadott egy listájához.</string>
<string name="activity_about_me_list_member_added_with_name"><xliff:g id="user">%1$s</xliff:g> hozzáadott téged a következő listához: "<xliff:g id="list">%2$s</xliff:g>\".</string>
<string name="activity_about_me_list_member_added_multi"><xliff:g id="user">%1$s</xliff:g> és <xliff:g id="other">%2$s</xliff:g> hozzáadtak téged listáikhoz.</string>
<string name="activity_by_friends_favorite"><xliff:g id="user">%1$s</xliff:g> kedvencek közé rakta <xliff:g id="target">%2$s</xliff:g> tweetjét.</string>
<string name="activity_by_friends_favorite_multi"><xliff:g id="user">%1$s</xliff:g> kedvencek közé rakta <xliff:g id="target">%2$s</xliff:g> és <xliff:g id="other">%3$s</xliff:g> tweetjét.</string>
<string name="activity_by_friends_like"><xliff:g id="user">%1$s</xliff:g> kedveli <xliff:g id="target">%2$s</xliff:g> tweetjét.</string>
<string name="activity_by_friends_like_multi"><xliff:g id="user">%1$s</xliff:g> kedveli <xliff:g id="target">%2$s</xliff:g> és <xliff:g id="other">%3$s</xliff:g> tweetjét.</string>
<string name="activity_by_friends_follow"><xliff:g id="user">%1$s</xliff:g> követi <xliff:g id="target">%2$s</xliff:g> felhasználót.</string>
<string name="activity_by_friends_follow_multi"><xliff:g id="user">%1$s</xliff:g> követni kezdte <xliff:g id="target">%2$s</xliff:g> és <xliff:g id="other">%3$s</xliff:g> felhasználókat.</string>
<string name="activity_by_friends_retweet"><xliff:g id="user">%1$s</xliff:g> retweetelte <xliff:g id="target">%2$s</xliff:g> tweetjét.</string>
<string name="activity_by_friends_retweet_multi"><xliff:g id="user">%1$s</xliff:g> retweetelte <xliff:g id="target">%2$s</xliff:g> és <xliff:g id="other">%3$s</xliff:g> tweetjét.</string>
<string name="activity_by_friends_list_member_added"><xliff:g id="user">%1$s</xliff:g> hozzáadta <xliff:g id="target">%2$s</xliff:g> felhasználót a listához.</string>
<string name="activity_by_friends_list_member_added_multi"><xliff:g id="user">%1$s</xliff:g> hozzáadta <xliff:g id="target">%2$s</xliff:g> és <xliff:g id="other">%1$s</xliff:g> egy listához.</string>
<string name="activity_by_friends_list_created"><xliff:g id="user">%1$s</xliff:g> létrehozott egy listát: <xliff:g id="target">%2$s</xliff:g>.</string>
<string name="activity_by_friends_list_created_multi"><xliff:g id="user">%1$s</xliff:g> listákat hozott létre: <xliff:g id="target">%2$s</xliff:g> és <xliff:g id="other">%1$s</xliff:g>.</string>
<string name="status_not_updated">Tweet nincs elküldve.</string>
@ -479,7 +498,6 @@
<string name="wizard_page_welcome_import_settings">Beállítások importálása</string>
<string name="wizard_page_theme_text">Válassz egy neked tetsző témát.</string>
<string name="wizard_page_tabs_text">Adj hozzá néhány fület a Twidere-hez.\nKövesd a számodra érdekes embereket, vagy dolgokat.</string>
<string name="wizard_page_tabs_unchanged_message">Füleket a \"Beállítások\" - \"Fülek\" helyen tudsz hozzáadni</string>
<string name="wizard_page_cards_text">Kártya elemek beállítása.</string>
<string name="wizard_page_hints_text">Itt van néhány hasznos link:</string>
<string name="wizard_page_usage_statistics_text">A Twidere részt vett néhány kutatási projektben, amelyeknek szüksége van használati adatokra.</string>
@ -533,8 +551,6 @@
<string name="theme_background_transparent">Átlátszó</string>
<string name="theme_dark_actionbar">Sötét ActionBar</string>
<string name="wizard_hint_compose_select_account">Érintsd meg a profilképet a tweet írásakor a használandó fiók kiválasztásához.</string>
<string name="wizard_hint_quote_format">Állítsd be a kedvenc idézet formátumodat a \"Beállítások\" - \"Tartalom\" menüben</string>
<string name="wizard_hint_filters">Elrejtheted a nem kívánt tweeteket az idővonaladról és az értesítésekből a \"Szűrők\" használatával.</string>
<string name="view_replies">Válaszok megtekintése</string>
<string name="compact_cards">Kompakt kártyák</string>
<string name="compact_cards_summary">Több kártya megjelenítése a képernyőn</string>
@ -609,7 +625,6 @@
<string name="delete_drafts_confirm">Töröljem a kiválasztott piszkozatokat?</string>
<string name="extra_configurations">Egyéb beállítások</string>
<string name="click_item_to_config">Érints meg egy bejegyzést a beállításhoz</string>
<string name="dark_drawer">Sötét fiók</string>
<string name="retweets_of_me">Retweetjeim</string>
<string name="from_gallery">Galériából</string>
<string name="from_camera">Kamerából</string>
@ -721,6 +736,8 @@
<string name="N_statuses_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> tweet</string>
<string name="N_favorites_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> kedvenc</string>
<string name="N_favorites_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> kedvenc</string>
<string name="N_likes_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> kedvelés</string>
<string name="N_likes_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> kedvelés</string>
<string name="drafts_hint_messages">Ide lesznek mentve az el nem küldött tweetjeid</string>
<string name="keyboard_shortcuts">Billentyűparancsok</string>
<string name="keyboard_shortcut_hint">Nyomj le billentyűket</string>
@ -765,4 +782,13 @@
<string name="media_preload">Média előtöltés</string>
<string name="on_mobile_network">Mobil adat hálózaton</string>
<string name="set_consumer_key_secret_message">Twidere lassan eléri a token korlátozást, létre kell majd hoznod egy alkalmazást a https://apps.twitter.com/ webhelyen és be kell illeszteni a lenti felhasználó kulcsot és jelszót.\nHa folytatod az alapértelmezett kulcs használatát, lehetséges, hogy nem tudsz majd bejelentkezni.</string>
<string name="page_up">Oladl eleje</string>
<string name="page_down">Oldal vége</string>
<string name="user_mentioned_you"><xliff:g id="name">%s</xliff:g> megemlített téged</string>
<string name="current_status">Jelenlegi tweet</string>
<string name="twitter_optimized_searches">Twitter optimalizálja a keresést</string>
<string name="i_want_my_stars_back">Szeretném a csillagokat visszakapni!</string>
<string name="i_want_my_stars_back_summary">Kedvencet használj (★) a kedvelés helyett (♥︎)</string>
<string name="copy_link">Link másolása</string>
<string name="link_copied_to_clipboard">Link a vágólapra másolva</string>
</resources>

View File

@ -9,6 +9,8 @@
<string name="error_twitter_130">A Twitter átmenetileg túl van terhelve.</string>
<string name="error_twitter_131">A Twitter szervere lehet, hogy átmenetileg nem működik, próbáld meg később.</string>
<string name="error_twitter_135">Ellenőrizd a rendszer órádat.</string>
<string name="error_twitter_136">Ezt a felhasználót már letiltottad.</string>
<string name="error_twitter_139">Ezt a tweet-et már kedvencnek jelölted.</string>
<string name="error_twitter_161">Már küldtél követési kérelmet ennek a felhasználónak.</string>
<string name="error_twitter_162">Ez a felhasználó letiltott.</string>
<string name="error_twitter_172">Ezt a keresést már elmentetted.</string>

View File

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources xmlns:tools="http://schemas.android.com/tools" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_description">Aplikasi Twitter anda</string>
<string name="compose">Susun</string>
<string name="add_account">Tambah akun</string>
<string name="settings">Pengaturan</string>
@ -37,7 +38,7 @@
<string name="error_unknown_error">Kesalahan: Kesalahan tidak diketahui, ini mungkin adalah bug.</string>
<string name="error_message">Kesalahan: <xliff:g id="message">%s</xliff:g></string>
<string name="error_message_with_action">Kesalahan saat <xliff:g id="action">%1$s</xliff:g>: <xliff:g id="message">%2$s</xliff:g></string>
<string name="error_message_rate_limit">Laju kicauan melewati batasan, mohon diulangi <xliff:g id="time">%s</xliff:g></string>
<string name="error_message_rate_limit">Telah mencapai batasan twitter, mohon diulangi <xliff:g id="time">%s</xliff:g></string>
<string name="error_message_rate_limit_with_action">Laju kicauan melebihi batas saat <xliff:g id="action">%1$s</xliff:g>, silakan coba lagi setelah <xliff:g id="time">%2$s</xliff:g></string>
<string name="select_account">Pilih akun</string>
<string name="username">Nama pengguna</string>
@ -53,7 +54,7 @@
<string name="retweets">Retweets</string>
<string name="cancel_retweet">Batalkan retweet</string>
<string name="favorite">Favorit</string>
<string name="unfavorite">Batal favorit</string>
<string name="unfavorite">Batalkan favorit</string>
<string name="reply">Balas</string>
<string name="share">Bagikan</string>
<string name="view_image">Gambar</string>
@ -486,7 +487,8 @@
<string name="wizard_page_welcome_import_settings">Impor pengaturan</string>
<string name="wizard_page_theme_text">Pilih tema yang Anda suka.</string>
<string name="wizard_page_tabs_text">Tambah beberapa tab ke Twidere.\nTetap terhubung dengan orang atau sesuatu yang kamu perhatikan.</string>
<string name="wizard_page_tabs_unchanged_message">Anda dapat menambah tab di \"Pengaturan\" - \"Tab\"</string>
<string name="wizard_page_tabs_unchanged_message">Anda bisa menambahkan tab dalam &quot;Settings&quot; -
&quot;Tabs&quot;</string>
<string name="wizard_page_cards_text">Konfigurasi item kartu.</string>
<string name="wizard_page_hints_text">Disini ada berbagai petunjuk berguna.</string>
<string name="wizard_page_usage_statistics_text">Twidere mengambil bagian dalam beberapa proyek penelitian yang membutuhkan penggunaan data.</string>
@ -540,8 +542,8 @@
<string name="theme_background_transparent">Transparan</string>
<string name="theme_dark_actionbar">Bar aksi gelap</string>
<string name="wizard_hint_compose_select_account">Klik gambar profil untuk memilih akun ketika menulis tweet.</string>
<string name="wizard_hint_quote_format">Atur format kutipan anda di \"Pengaturan\" - \"Isi &amp; Penyimpanan\"</string>
<string name="wizard_hint_filters">Anda dapat menyembunyikan twit yang tidak diinginkan pada linimasa dan pemberitahuan dengan menggunakan \"Filters\".</string>
<string name="wizard_hint_filters">Anda bisa menyembunyikan twit yang tidak diinginkan dari timeline dan notifikasi dengan menggunakan
&quot;Filters&quot;.</string>
<string name="view_replies">Lihat balasan</string>
<string name="compact_cards">Kartu compact</string>
<string name="compact_cards_summary">Tampilkan kartu lebih banyak</string>
@ -616,7 +618,6 @@
<string name="delete_drafts_confirm">Hapus draft?</string>
<string name="extra_configurations">Pengaturan Ekstra</string>
<string name="click_item_to_config">Klik item untuk mengatur</string>
<string name="dark_drawer">Drawer gelap</string>
<string name="retweets_of_me">Retweet oleh saya</string>
<string name="from_gallery">Dari galeri</string>
<string name="from_camera">Dari kamera</string>
@ -765,6 +766,8 @@
<string name="dark_theme">Tema gelap</string>
<string name="wizard_hint_title_location_requirement">Ijin lokasi</string>
<string name="wizard_hint_summary_location_requirement">Twidere memerlukan izin lokasi ketika Anda mengirimkan tweet yang berisi lokasi.</string>
<string name="wizard_hint_title_storage_requirement">Izin penyimpanan</string>
<string name="wizard_hint_summary_storage_requirement">Twidere perlu izin penyimpanan saat anda mengakses dokumen.</string>
<string name="scrapyard">Scrapyard</string>
<string name="crop_image">Potong gambar</string>
<string name="usage_label_sent">Dikirim</string>
@ -780,4 +783,15 @@
<string name="bug_reports">Laporan kesalahan</string>
<string name="invalid_consumer_key">Consumer key tidak valid</string>
<string name="invalid_consumer_secret">Consumer secret tidak valid</string>
<string name="page_up">Halaman naik</string>
<string name="page_down">Halaman turun</string>
<string name="combined_notifications">Notifikasi digabungkan</string>
<string name="combined_notifications_summary_on">Notifikasi akan digrupkan</string>
<string name="combined_notifications_summary_off">Notifikasi akan ditampilkan terpisah</string>
<string name="save_media_no_storage_permission_message">Izin penyimpanan diperlukan untuk menyelesaikan media.</string>
<string name="select_file_no_storage_permission_message">Izin penyimpanan diperlukan untuk memilih file.</string>
<string name="user_mentioned_you"><xliff:g id="nama">%s</xliff:g> me-mention anda</string>
<string name="cant_load_all_replies_message">Tidak dapat memuat semua balasan. &lt;a href=\"#dialog\";&gt;Kenapa? &lt;/a&gt;</string>
<string name="cant_load_all_replies_explanation">Karena keterbatasan Twitter untuk aplikasi twitter pihak ketiga, Twidere tidak memiliki akses ke balasan untuk twit, tidak ada jaminan bahwa Twidere dapat memuat semua balasan untuk twit.</string>
<string name="current_status">Twit sekarang</string>
</resources>

View File

@ -479,7 +479,6 @@
<string name="wizard_page_welcome_import_settings">Importa impostazioni</string>
<string name="wizard_page_theme_text">Scegli un tema.</string>
<string name="wizard_page_tabs_text">Aggiunge tabs a Twidere.\nTieni sott\'occhio cose e persone interessanti.</string>
<string name="wizard_page_tabs_unchanged_message">Puoi aggiungere le tabs in \"Impostazioni\" - \"Tabs\"</string>
<string name="wizard_page_cards_text">Configura le schede.</string>
<string name="wizard_page_hints_text">Ecco alcuni suggerimenti utili.</string>
<string name="wizard_page_usage_statistics_text">Twidere prende parte a dei progetti di ricerca che hanno bisogno di alcuni dati di utilizzo.</string>
@ -533,8 +532,6 @@
<string name="theme_background_transparent">Trasparente</string>
<string name="theme_dark_actionbar">ActionBar scura</string>
<string name="wizard_hint_compose_select_account">Clicca sull\'immagine del profilo per scegliere un account quando scrivi un tweet.</string>
<string name="wizard_hint_quote_format">Imposta il tipo di citazione preferita in \"Impostazioni\" - \"Contenuti &amp; Archiviazione\"</string>
<string name="wizard_hint_filters">Puoi nascondere tweet e notifiche non desiderate utilizzando i \"Filtri\".</string>
<string name="view_replies">Visualizza Risposte</string>
<string name="compact_cards">Schede compatte</string>
<string name="compact_cards_summary">Visualizza più schede sullo schermo</string>
@ -609,7 +606,6 @@
<string name="delete_drafts_confirm">Eliminare le bozze selezionate?</string>
<string name="extra_configurations">Configurazioni extra</string>
<string name="click_item_to_config">Selezionare un elemento da configurare</string>
<string name="dark_drawer">Dark drawer</string>
<string name="retweets_of_me">I miei retweets</string>
<string name="from_gallery">Da galleria</string>
<string name="from_camera">Da Camera</string>

View File

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources xmlns:tools="http://schemas.android.com/tools" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_description">あなた自身のTwitterアプリ</string>
<string name="compose">ツイートする</string>
<string name="add_account">アカウントを追加</string>
<string name="settings">設定</string>
@ -54,6 +55,8 @@
<string name="cancel_retweet">リツイートの取り消し</string>
<string name="favorite">お気に入り</string>
<string name="unfavorite">お気に入りから削除</string>
<string name="like">いいね</string>
<string name="undo_like">いいねを戻す</string>
<string name="reply">返信</string>
<string name="share">共有</string>
<string name="view_image">画像</string>
@ -97,6 +100,7 @@
<string name="retweeted_by_count"><xliff:g id="retweet_count">%d</xliff:g> 人によってリツイート</string>
<string name="users_retweeted_this">リツイートしたユーザーを表示</string>
<string name="users_favorited_this">お気に入りに登録したユーザーを表示</string>
<string name="users_liked_this">このようなユーザー</string>
<string name="reply_to"><xliff:g id="user_name">%s</xliff:g>さんへの返信</string>
<string name="quote_user"><xliff:g id="user_name">%s</xliff:g>さんのツイートを引用</string>
<string name="time_source"><xliff:g id="time">%1$s</xliff:g> · <xliff:g id="source">%2$s</xliff:g></string>
@ -130,6 +134,7 @@
<string name="location">現在地</string>
<string name="url">URL</string>
<string name="favorites">お気に入り</string>
<string name="likes">いいね</string>
<string name="name">名前</string>
<string name="refresh">更新</string>
<string name="retry">再試行</string>
@ -272,21 +277,35 @@
<string name="activity_about_me_favorite_multi"><xliff:g id="user">%1$s</xliff:g> さんと <xliff:g id="other">%2$s</xliff:g> さんがツイートをお気に入りに追加しました。</string>
<string name="activity_about_me_favorited_retweet"><xliff:g id="user">%s</xliff:g>さんはあなたのリツイートををお気に入りに登録しました</string>
<string name="activity_about_me_favorited_retweet_multi"><xliff:g id="user">%1$s</xliff:g> さんと<xliff:g id="other">%2$s</xliff:g> があなたのリツイートをお気に入りしました。</string>
<string name="activity_about_me_like"><xliff:g id="user">%s</xliff:g>さんがあなたのツイートにいいねをしました。</string>
<string name="activity_about_me_like_multi"><xliff:g id="user">%1$s</xliff:g> さんと <xliff:g id="other">%2$s</xliff:g> さんがツイートをいいねしました。</string>
<string name="activity_about_me_liked_retweet"><xliff:g id="user">%s</xliff:g>があなたのリツイートにいいねをしました。</string>
<string name="activity_about_me_liked_retweet_multi"><xliff:g id="user">%1$s</xliff:g> さんと<xliff:g id="other">%2$s</xliff:g> があなたのリツイートをいいねしました。</string>
<string name="activity_about_me_follow"><xliff:g id="user">%s</xliff:g> があなたをフォローしました。</string>
<string name="activity_about_me_follow_multi"><xliff:g id="user">%1$s</xliff:g> さんと<xliff:g id="other">%2$s</xliff:g> さんがあなたをフォローしました。</string>
<string name="activity_about_me_retweet"><xliff:g id="user">%s</xliff:g>さんがあなたのツイートをリツイートしました。</string>
<string name="activity_about_me_retweet_multi"><xliff:g id="user">%1$s</xliff:g> さんと<xliff:g id="other">%2$s</xliff:g> さんがあなたのツイートをリツイートしました</string>
<string name="activity_about_me_retweeted_retweet"><xliff:g id="user">%s</xliff:g> さんがあなたのツイートをリツイートしました。</string>
<string name="activity_about_me_retweeted_retweet_multi"><xliff:g id="user">%1$s</xliff:g> さんと<xliff:g id="other">%2$s</xliff:g> さんがあなたのリツイートをリツイートしました。</string>
<string name="activity_about_me_retweeted_mention"><xliff:g id="user">%s</xliff:g>さんがあなた宛のツイートをリツイートしました</string>
<string name="activity_about_me_retweeted_mention_multi"><xliff:g id="user">%s</xliff:g>さんと他<xliff:g id="other">%2$s</xliff:g>人があなた宛のツイートをリツイートしました。</string>
<string name="activity_about_me_favorited_mention"><xliff:g id="user">%s</xliff:g>さんがあなた宛のツイートをお気に入り登録しました。</string>
<string name="activity_about_me_favorited_mention_multi"><xliff:g id="user">%s</xliff:g>さんと他<xliff:g id="other">%2$s</xliff:g>人があなた宛のツイートをお気に入り登録しました。</string>
<string name="activity_about_me_liked_mention"><xliff:g id="user">%s</xliff:g>さんがあなた宛のツイートにいいねをしました。</string>
<string name="activity_about_me_liked_mention_multi"><xliff:g id="user">%s</xliff:g>さんと他<xliff:g id="other">%2$s</xliff:g>人があなた宛のツイートにいいねをしました。</string>
<string name="activity_about_me_list_member_added"><xliff:g id="user">%s</xliff:g>さんがあなたをリストに追加しました。</string>
<string name="activity_about_me_list_member_added_with_name"><xliff:g id="user">%1$s</xliff:g> があなたを <xliff:g id="list">%2$s</xliff:g> のリストに追加しました。</string>
<string name="activity_about_me_list_member_added_multi"><xliff:g id="user">%1$s</xliff:g><xliff:g id="other">%2$s</xliff:g> があなたをリストに追加しました。</string>
<string name="activity_by_friends_favorite"><xliff:g id="user">%1$s</xliff:g>さんは<xliff:g id="target">%2$s</xliff:g>さんのツイートをお気に入りに登録しました。</string>
<string name="activity_by_friends_favorite_multi"><xliff:g id="user">%1$s</xliff:g> さんが <xliff:g id="target">%2$s</xliff:g> さんと他 <xliff:g id="other">%3$s</xliff:g> 人のツイートをお気に入りに追加しました。</string>
<string name="activity_by_friends_like"><xliff:g id="user">%1$s</xliff:g>さんが<xliff:g id="target">%2$s</xliff:g>さんのツイートをいいねしました。</string>
<string name="activity_by_friends_like_multi"><xliff:g id="user">%1$s</xliff:g> さんが <xliff:g id="target">%2$s</xliff:g> さんと他 <xliff:g id="other">%3$s</xliff:g> 人のツイートをいいねしました。</string>
<string name="activity_by_friends_follow"><xliff:g id="user">%1$s</xliff:g>さんは<xliff:g id="target">%2$s</xliff:g>さんをフォローしました。</string>
<string name="activity_by_friends_follow_multi"><xliff:g id="user">%1$s</xliff:g><xliff:g id="target">%2$s</xliff:g><xliff:g id="other">%3$s</xliff:g> をフォローしています。</string>
<string name="activity_by_friends_retweet"><xliff:g id="user">%1$s</xliff:g>さんは<xliff:g id="target">%2$s</xliff:g>さんのツイートをリツイートしました。</string>
<string name="activity_by_friends_retweet_multi"><xliff:g id="user">%1$s</xliff:g> さんが <xliff:g id="target">%2$s</xliff:g> さんと他 <xliff:g id="other">%3$s</xliff:g> 人のツイートをリツイートしました。</string>
<string name="activity_by_friends_list_member_added"><xliff:g id="user">%1$s</xliff:g>さんは<xliff:g id="target">%2$s</xliff:g>さんをリストに追加しました。</string>
<string name="activity_by_friends_list_member_added_multi"><xliff:g id="user">%1$s</xliff:g>さんが<xliff:g id="target">%2$s</xliff:g>さんと他<xliff:g id="other">%1$s</xliff:g>人をリストに追加しました。</string>
<string name="activity_by_friends_list_created"><xliff:g id="user">%1$s</xliff:g>さんはリスト<xliff:g id="target">%2$s</xliff:g>を作成しました。</string>
<string name="activity_by_friends_list_created_multi"><xliff:g id="user">%1$s</xliff:g><xliff:g id="target">%2$s</xliff:g><xliff:g id="other">%1$s</xliff:g> のリストを作成しました。</string>
<string name="status_not_updated">ツイートは送信されませんでした。</string>
@ -480,7 +499,7 @@
<string name="wizard_page_welcome_import_settings">設定をインポート</string>
<string name="wizard_page_theme_text">好きなテーマを選んでください。</string>
<string name="wizard_page_tabs_text">タブを追加します。\n気になるキーワードを含むツイートやユーザーの検索をするタブも追加出来ます。</string>
<string name="wizard_page_tabs_unchanged_message">設定 - タブでタブを追加出来ます</string>
<string name="wizard_page_tabs_unchanged_message">&quot;設定&quot; - &quot;タブ&quot;でタブを追加出来ます</string>
<string name="wizard_page_cards_text">カードアイテムを編集します。</string>
<string name="wizard_page_hints_text">お役立ちヒント!</string>
<string name="wizard_page_usage_statistics_text">Twidereは使用状況データを研究目的において必要とするプロジェクトに参加しています</string>
@ -534,8 +553,8 @@
<string name="theme_background_transparent">背景透過</string>
<string name="theme_dark_actionbar">黒アクションバー</string>
<string name="wizard_hint_compose_select_account">ツイートするアカウントを選択するにはプロフィール画像をクリックしてください。</string>
<string name="wizard_hint_quote_format">引用の書式は\"設定\" - \"コンテンツ &amp; ストレージ\"で設定できます。</string>
<string name="wizard_hint_filters">\"フィルタ\"を使うとみたくないツイートをTLや通知で表示しないように出来ます。</string>
<string name="wizard_hint_quote_format">&quot;設定&quot; - &quot;ツイートする&quot;でお気に入りの引用形式を設定できます</string>
<string name="wizard_hint_filters">&quot;フィルタ&quot;を使用することで、タイムラインと通知から不要なツイートを非表示にすることができます。</string>
<string name="view_replies">返信を表示</string>
<string name="compact_cards">カードのコンパクト化</string>
<string name="compact_cards_summary">画面あたりのカード表示数を増やせます。</string>
@ -610,7 +629,6 @@
<string name="delete_drafts_confirm">選択した下書きを削除しますか?</string>
<string name="extra_configurations">追加設定</string>
<string name="click_item_to_config">アイテムをタップすると設定します</string>
<string name="dark_drawer">ダークドロワー</string>
<string name="retweets_of_me">リツイートされたツイート</string>
<string name="from_gallery">ギャラリー</string>
<string name="from_camera">カメラ</string>
@ -723,6 +741,8 @@
<string name="N_statuses_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> つぶやき</string>
<string name="N_favorites_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> お気に入り</string>
<string name="N_favorites_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> お気に入り</string>
<string name="N_likes_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> いいね</string>
<string name="N_likes_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> いいね</string>
<string name="drafts_hint_messages">未送信のツイートが保存されます</string>
<string name="keyboard_shortcuts">キーボードショートカット</string>
<string name="keyboard_shortcut_hint">キーを押してください</string>
@ -759,6 +779,8 @@
<string name="dark_theme">ダークテーマ</string>
<string name="wizard_hint_title_location_requirement">位置情報へのアクセス</string>
<string name="wizard_hint_summary_location_requirement">位置情報付きツイートをするときに、Twidereは位置情報へのアクセス許可を要求します。</string>
<string name="wizard_hint_title_storage_requirement">ストレージのアクセス許可</string>
<string name="wizard_hint_summary_storage_requirement">Twidere がドキュメントにアクセスする際に、ストレージのアクセス許可が必要です。</string>
<string name="scrapyard">ゴミ置き場</string>
<string name="crop_image">トリミング</string>
<string name="usage_label_sent">送信</string>
@ -772,4 +794,27 @@
<string name="report_usage_statistics_now">現在の使用状況を報告する。</string>
<string name="cache_size_limit">キャッシュサイズ制限</string>
<string name="bug_reports">バグレポート</string>
<string name="invalid_consumer_key">無効なコンシューマーキーです</string>
<string name="invalid_consumer_secret">無効なコンシューマーシークレットです</string>
<string name="page_up">ページアップ</string>
<string name="page_down">ページダウン</string>
<string name="combined_notifications">通知の結合</string>
<string name="combined_notifications_summary_on">通知がグループ化されます</string>
<string name="combined_notifications_summary_off">通知が個別に表示されます</string>
<string name="save_media_no_storage_permission_message">ストレージアクセス許可は、メディアを保存するために必要とされます。</string>
<string name="select_file_no_storage_permission_message">ストレージアクセス許可は、ファイルを選択するために必要とされます。</string>
<string name="user_mentioned_you"><xliff:g id="name">%s</xliff:g>さんからのツイート</string>
<string name="cant_load_all_replies_message">すべての返信を読み込むことができません。&lt;a href=\"#dialog\";&gt;理由を表示&lt;/a&gt;</string>
<string name="cant_load_all_replies_explanation">Twitterは、サードパーティのTwitterクライアントに制限を設けています。そのため、Twidereはツイートへの返信にアクセスすることができず、すべての返信を読み込むことができない場合があります。</string>
<string name="current_status">現在のツイート</string>
<string name="twitter_optimized_searches">検索結果を最適化しました</string>
<string name="twitter_optimized_searches_summary">リツイートを除外するなどの検索結果を改善するために、特別な検索用語を使用します</string>
<string name="i_want_my_stars_back">お気に入りに戻って欲しい!</string>
<string name="i_want_my_stars_back_summary">いいね (♥) の代わりにお気に入り (★) を使用する</string>
<string name="copy_link">リンクをコピー</string>
<string name="link_copied_to_clipboard">リンクがクリップボードにコピーされました</string>
<string name="login_verification">ログイン認証</string>
<string name="login_verification_pin_hint">あなたの携帯電話であることを確認するためにPINコードを入力して、ログインしてください。</string>
<string name="login_verification_push_hint">要求を承認したあと、Twitterアプリからのログインを受け入れてOKをタッチしてください。</string>
<string name="login_verification_failed">ログイン認証に失敗しました。</string>
</resources>

View File

@ -9,6 +9,8 @@
<string name="error_twitter_130">Twitterは一時的に許容範囲をオーバーしました。</string>
<string name="error_twitter_131">Twitterのサーバーが一時的にダウンしました。後でお試しください。</string>
<string name="error_twitter_135">端末の時計があっているか確認してください。</string>
<string name="error_twitter_136">このユーザーにブロックされています。</string>
<string name="error_twitter_139">すでにこのツイートをお気に入りにしています。</string>
<string name="error_twitter_161">すでにフォローリクエストを送信しています。</string>
<string name="error_twitter_162">このユーザーにブロックされています。</string>
<string name="error_twitter_172">この検索はすでに保存済みです。</string>

View File

@ -479,7 +479,6 @@
<string name="wizard_page_welcome_import_settings">설정 가져오기</string>
<string name="wizard_page_theme_text">원하시는 테마를 선택하세요.</string>
<string name="wizard_page_tabs_text">Twidere는 탭을 추가하세요.\n친구를 지켜보거나 관심사를 살펴 보십시오.</string>
<string name="wizard_page_tabs_unchanged_message">탭은 \"설정\" - \"탭\"에서 추가할 수 있습니다.</string>
<string name="wizard_page_cards_text">카드 항목을 설정하세요.</string>
<string name="wizard_page_hints_text">힌트를 드리겠습니다.</string>
<string name="wizard_page_usage_statistics_text">Twidere는 사용 데이터 중 일부가 필요한 연구 프로젝트에 참여하고 있습니다.</string>
@ -533,8 +532,6 @@
<string name="theme_background_transparent">투명</string>
<string name="theme_dark_actionbar">어두운 행동바</string>
<string name="wizard_hint_compose_select_account">트윗을 쓸 때, 프로필 사진을 클릭해 계정을 선택하세요.</string>
<string name="wizard_hint_quote_format">인용 양식은 \"설정\" - \"콘텐츠 및 저장소\"에서 설정할 수 있습니다.</string>
<string name="wizard_hint_filters">타임라인과 알림의 원하지 않는 트윗은 \"필터\"를 써서 숨길 수 있습니다.</string>
<string name="view_replies">답글 보기</string>
<string name="compact_cards">작은 카드</string>
<string name="compact_cards_summary">더 많은 카드를 화면에 표시합니다.</string>
@ -615,7 +612,6 @@
<string name="delete_drafts_confirm">선택된 보관된 트윗을 지울까요?</string>
<string name="extra_configurations">추가 설정</string>
<string name="click_item_to_config">설정할 항목을 클릭하세요.</string>
<string name="dark_drawer">어두운 드로어</string>
<string name="retweets_of_me">리트윗된 내 트윗</string>
<string name="from_gallery">갤러리로부터</string>
<string name="from_camera">카메라로부터</string>

View File

@ -1,47 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources xmlns:tools="http://schemas.android.com/tools" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="compose">KAMPOZ</string>
<string name="add_account">ADD AKOUNT</string>
<string name="settings">SETINGS</string>
<string name="send">发送</string>
<string name="add_location">添加地理位置</string>
<string name="add_image">添加图像</string>
<string name="take_photo">拍照</string>
<string name="remove_location">移除地理位置</string>
<string name="remove_image">移除图片</string>
<string name="remove_photo">移除照片</string>
<string name="status_hint">发生了什么?</string>
<string name="sign_up">注册</string>
<string name="sign_in">登录</string>
<string name="rest_base_url">REST Base URL</string>
<string name="oauth_base_url">OAuth Base URL</string>
<string name="signing_oauth_base_url">登录 OAuth Base URL</string>
<string name="signing_rest_base_url">登录 REST Base URL</string>
<string name="api_url_format">API URL 格式</string>
<string name="same_oauth_signing_url">使用相同的 URL 登录 OAuth</string>
<string name="auth_type">Auth 类型</string>
<string name="oauth">OAuth</string>
<string name="xauth">xAuth</string>
<string name="basic">Basic</string>
<string name="twip_o">Twip O Mode</string>
<string name="advanced">高级</string>
<string name="save">保存</string>
<string name="edit">编辑</string>
<string name="edit_api">编辑 API</string>
<string name="home">主页</string>
<string name="mentions">提及</string>
<string name="error_occurred">发生了一个错误,请再试一次。</string>
<string name="error_already_logged_in">您已经登录了。</string>
<string name="no_account_selected">没有选择账号。</string>
<string name="error_unknown_error">错误:未知错误,这可能是一个 BUG 。</string>
<string name="error_message">错误:<xliff:g id="message">%s</xliff:g></string>
<string name="error_message_with_action">错误在 <xliff:g id="action">%1$s</xliff:g><xliff:g id="message">%2$s</xliff:g></string>
<string name="error_message_rate_limit">请求 Twitter 频率超限,请重试 <xliff:g id="time">%s</xliff:g></string>
<string name="name_and_count_retweeted"><xliff:g id="user_name">%1$s</xliff:g><xliff:g id="retweet_count">%2$d</xliff:g> 等已转推</string>
<string name="N_retweeted_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="retweet_count">%d</xliff:g> 转推</string>
<string name="N_retweeted_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="retweet_count">%d</xliff:g> 转推</string>
<string name="retweeted_by_name">已由 <xliff:g id="user_name">%s</xliff:g> 转推</string>
<string name="retweeted_by_name_with_count">已由 <xliff:g id="user_name">%1$s</xliff:g><xliff:g id="retweet_count">%2$d</xliff:g> 等转推</string>
<string name="retweeted_by_count"><xliff:g id="retweet_count">%d</xliff:g> 用户转推</string>
</resources>

View File

@ -1,19 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources>
<string name="error_twitter_32">无法认证您,您可能需要尝试重新登录。</string>
<string name="error_twitter_34">这条推文、用户或页面不存在。</string>
<string name="error_twitter_88">超出频率限制,请稍候重试。</string>
<string name="error_twitter_89">您的登录信息出现错误或已过期,请重新登录。</string>
<string name="error_twitter_64">您的账号已经被冻结,并且不被允许访问这个功能。</string>
<string name="error_twitter_130">Twitter 暂时过载了。</string>
<string name="error_twitter_131">Twitter 服务器暂时宕机了,请稍后重试。</string>
<string name="error_twitter_135">请检查您的系统时钟。</string>
<string name="error_twitter_161">您已将关注请求发送给该用户。</string>
<string name="error_twitter_162">已经已经被该用户屏蔽。</string>
<string name="error_twitter_172">您已经保存了此次搜索。</string>
<string name="error_twitter_179">您无法查看受保护的用户推文。</string>
<string name="error_twitter_187">这条推文您已经发送过了。</string>
<string name="error_twitter_193">上传的照片太大了。</string>
<string name="error_twitter_215">您可能需要尝试再次登录。</string>
</resources>

View File

@ -461,7 +461,6 @@
<string name="wizard_page_welcome_import_settings">Importeer instellingen</string>
<string name="wizard_page_theme_text">Kies een thema dat je leuk vind.</string>
<string name="wizard_page_tabs_text">Voeg een paar tabbladen toe aan Twidere.\nHoud belangrijke mensen en dingen bij.</string>
<string name="wizard_page_tabs_unchanged_message">Je kan tabbladen toevoegen in \'\'Instellingen\'\' - \'\'Tabbladen\'\'</string>
<string name="wizard_page_cards_text">Configureer kaart items.</string>
<string name="wizard_page_hints_text">Hier zijn een paar handige hints.</string>
<string name="wizard_page_finished_title">Voltooid</string>
@ -512,8 +511,6 @@
<string name="theme_background_solid">Zuiver wit/zwart</string>
<string name="theme_background_transparent">Transparant</string>
<string name="theme_dark_actionbar">Donkere ActionBar</string>
<string name="wizard_hint_quote_format">Stel je favoriete citaat formaat in via \'\'Instellingen\'\' - \'\'Inhoud &amp; Opslag\'\'</string>
<string name="wizard_hint_filters">Je kunt ongewenste tweets verbergen van de tijdlijn en meldingen via \'\'Filters\'\'.</string>
<string name="view_replies">Bekijk Reacties</string>
<string name="compact_cards">Compacte kaarten</string>
<string name="compact_cards_summary">Toon meer kaarten op het scherm</string>
@ -586,7 +583,6 @@
<string name="delete_drafts_confirm">Geselecteerde concepten verwijderen?</string>
<string name="extra_configurations">Extra instellingen</string>
<string name="click_item_to_config">Klik op een item om in te stellen</string>
<string name="dark_drawer">Donker schuifpaneel</string>
<string name="retweets_of_me">Retweets van mij</string>
<string name="from_gallery">Uit galerij</string>
<string name="from_camera">Uit camera</string>

View File

@ -1,47 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources xmlns:tools="http://schemas.android.com/tools" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_description">Din egen Twitter-app</string>
<string name="compose">Skriv</string>
<string name="add_account">Legg til konto</string>
<string name="settings">Innstillinger</string>
<string name="send">Send</string>
<string name="add_location">Legg til sted</string>
<string name="add_location">Legg til posisjon</string>
<string name="add_image">Legg til bilde</string>
<string name="take_photo">Ta bilde</string>
<string name="remove_location">Fjern sted</string>
<string name="remove_location">Fjern posisjon</string>
<string name="remove_image">Fjern bilde</string>
<string name="remove_photo">Fjern foto</string>
<string name="remove_photo">Fjern bilde</string>
<string name="status_hint">Hva skjer?</string>
<string name="sign_up">Registrer deg</string>
<string name="sign_in">Logg inn</string>
<string name="rest_base_url">REST Bare URL</string>
<string name="oauth_base_url">OAuth Bare URL</string>
<string name="auth_type">Autorisasjons Type</string>
<string name="rest_base_url">REST Base-URL</string>
<string name="oauth_base_url">OAuth Base-URL</string>
<string name="signing_oauth_base_url">Signerer OAuth Base-URL</string>
<string name="signing_rest_base_url">Signerer REST Base-URL</string>
<string name="api_url_format">API-URL-format</string>
<string name="same_oauth_signing_url">Bruk samme URL til OAuth-signering</string>
<string name="auth_type">Autentiseringstype</string>
<string name="oauth">OAuth</string>
<string name="xauth">xAuth</string>
<string name="basic">Basic</string>
<string name="twip_o">twip O-modus</string>
<string name="advanced">Avansert</string>
<string name="save">Lagre</string>
<string name="edit">Endre</string>
<string name="edit">Rediger</string>
<string name="edit_api">Endre API</string>
<string name="home">Hjem</string>
<string name="mentions">Koblinger</string>
<string name="mentions">Omtalelser</string>
<string name="error_occurred">Det oppstod en feil, prøv igjen.</string>
<string name="error_already_logged_in">Du er allerede logget inn.</string>
<string name="no_account_selected">Ingen konto valgt.</string>
<string name="error_unknown_error">Feil: Ukjent feil, dette er sannsynligvis en bug.</string>
<string name="error_message">Feil: <xliff:g id="message">%s</xliff:g></string>
<string name="error_message_with_action">Feil mens <xliff:g id="action">%1$s</xliff:g>: <xliff:g id="message">%2$s</xliff:g></string>
<string name="error_message_rate_limit">Twitters oppdaterings rate overskredet, venligst prøv på nytt <xliff:g id="time">%s</xliff:g></string>
<string name="error_message_rate_limit">Twitters oppdateringsrate overskredet, prøv igjen <xliff:g id="time">%s</xliff:g></string>
<string name="error_message_rate_limit_with_action">Twitters oppdateringsrate overskredet mens <xliff:g id="action">%1$s</xliff:g>, prøv igjen <xliff:g id="time">%2$s</xliff:g></string>
<string name="select_account">Velg konto</string>
<string name="username">Brukernavn</string>
<string name="password">Passord</string>
<string name="label_refresh_service">Oppdaterings service</string>
<string name="label_data_provider">Twidere databaseleverandør</string>
<string name="label_refresh_service">Oppdateringstjeneste</string>
<string name="label_streaming_service">Strømmetjeneste</string>
<string name="label_background_operation_service">Bakgrunnstjeneste</string>
<string name="open_in_browser">Åpne i nettleser</string>
<string name="tap_to_load_more">Trykk for å laste inn mer</string>
<string name="delete">Slett</string>
<string name="retweet">Retweet</string>
<string name="retweets">Retweets</string>
<string name="cancel_retweet">Avbryt retweet</string>
<string name="favorite">Favoritt</string>
<string name="unfavorite">Ikke favoritt</string>
<string name="favorite">Favorittmarker</string>
<string name="unfavorite">Fjern favorittmarkering</string>
<string name="like">Liker</string>
<string name="undo_like">Liker ikke</string>
<string name="reply">Svar</string>
<string name="share">Del</string>
<string name="view_image">Bilde</string>
@ -49,35 +64,47 @@
<string name="view_status">Vis tweet</string>
<string name="view_user_profile">Brukerprofil</string>
<string name="browser">Nettleser</string>
<string name="pick_from_gallery">Velg fra galeri</string>
<string name="statuses">Tweeter</string>
<string name="pick_from_gallery">Velg fra galleri</string>
<string name="statuses">Tweets</string>
<string name="followers">Følgere</string>
<string name="following">Følger</string>
<string name="about">Om</string>
<string name="open_source_license">Åpen kildekode lisens</string>
<string name="open_source_license">Åpen kildekode-lisens</string>
<string name="api">API</string>
<string name="default_api_settings">Standard API instillinger</string>
<string name="default_api_settings">Standard API-innstillinger</string>
<string name="default_api_settings_summary">Disse innstillingene gjelder kun for nyinnloggede kontoer</string>
<string name="consumer_key">Bruker nøkkel</string>
<string name="consumer_secret">Bruker hemmelighet</string>
<string name="ignore_ssl_error">Ignorer SSL feil</string>
<string name="ignore_ssl_error_summary">Ignorer SSL feil, bruk dette hvis du har problemer med tredjeparts API server.</string>
<string name="gzip_compressing">GZip komprimering</string>
<string name="gzip_compressing_summary">Komprimer alle API spørringer, dette kan redusere data forbruk, men fungerer kanskje ikke på alle tjenere.</string>
<string name="consumer_key">Brukernøkkel</string>
<string name="consumer_secret">Brukerpassord</string>
<string name="ignore_ssl_error">Ignorer SSL-feil</string>
<string name="ignore_ssl_error_summary">Ignorer SSL-feil, bruk dette hvis du har problemer med tredjeparts API-server.</string>
<string name="gzip_compressing">GZip-komprimering</string>
<string name="gzip_compressing_summary">Komprimer alle API-spørringer. Dette kan redusere databruken, men fungerer kanskje ikke på alle tjenere.</string>
<string name="storage">Lagring</string>
<string name="database_item_limit">Database størrelsesgrense</string>
<string name="database_item_limit_summary">Øvre grense for gjenstander som lagres i databaser for hver konto, velg en lavere verdi for å spare plass og øke lastingshastighet.</string>
<string name="clear_cache">Tøm mellomlager</string>
<string name="clear_cache_summary">Tøm lagret profilbildemellomlager.</string>
<string name="database_item_limit_summary">Øvre grense for elementer som lagres i databaser for hver konto. Velg en lavere verdi for å spare plass og øke lastingshastigheten.</string>
<string name="clear_cache">Tøm hurtiglager</string>
<string name="clear_cache_summary">Tøm hurtiglageret for profilbilder.</string>
<string name="clear_databases">Tøm databaser</string>
<string name="clear_databases_summary">Fjern alle tweets, profiler, meldinger. Dine innloggingsdetaljer vil ikke gå tapt.</string>
<string name="clear_databases_summary">Fjern alle tweets, profiler og meldinger. Innloggingsdetaljer tas vare på.</string>
<string name="look_and_feel">Utseende</string>
<string name="display_profile_image">Vis profilbilde</string>
<string name="image_load_summary">Deaktivering av dette vil øke scrollehastigheten og redusere databruken.</string>
<string name="image_load_summary">Deaktivering av dette øker rullehastigheten og reduserer databruken.</string>
<string name="in_reply_to_name">Som svar til <xliff:g id="user_name">%s</xliff:g></string>
<string name="name_retweeted"><xliff:g id="user_name">%s</xliff:g> retweetet</string>
<string name="name_and_another_retweeted"><xliff:g id="user_name">%1$s</xliff:g> og en annen retweetet</string>
<string name="name_and_count_retweeted"><xliff:g id="user_name">%1$s</xliff:g> og <xliff:g id="retweet_count">%2$d</xliff:g> andre retweetet</string>
<string name="N_retweeted_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="retweet_count">%d</xliff:g> retweetet</string>
<string name="N_retweeted_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="retweet_count">%d</xliff:g> retweets</string>
<string name="retweeted_by_name">Retweetet av <xliff:g id="user_name">%s</xliff:g></string>
<string name="retweeted_by_name_with_count">Retweetet av <xliff:g id="user_name">%1$s</xliff:g> og <xliff:g id="retweet_count">%2$d</xliff:g> andre</string>
<string name="retweeted_by_count">Retweetet av <xliff:g id="retweet_count">%d</xliff:g> brukere</string>
<string name="users_retweeted_this">Brukere retweetet dette</string>
<string name="users_favorited_this">Brukere favorittmarkerte dette</string>
<string name="users_liked_this">Brukere likte dette</string>
<string name="reply_to">Svar til <xliff:g id="user_name">%s</xliff:g></string>
<string name="quote_user">Sitat <xliff:g id="user_name">%s</xliff:g></string>
<string name="time_source"><xliff:g id="time">%1$s</xliff:g>, via <xliff:g id="source">%2$s</xliff:g></string>
<string name="source"><xliff:g id="source">%s</xliff:g></string>
<string name="filters">Filtre</string>
<string name="users">Brukere</string>
<string name="user">Bruker</string>
@ -91,20 +118,23 @@
<string name="pick_color">Velg farge</string>
<string name="follow">Følg</string>
<string name="unfollow">Avfølg</string>
<string name="leftside_compose_button">Ny-tweet knappen på venstre side</string>
<string name="leftside_compose_button_summary">Plasser ny-tweet knappen til venstre.</string>
<string name="load_item_limit">Last element grensen</string>
<string name="leftside_compose_button">Ny-tweet-knappen på venstre side</string>
<string name="leftside_compose_button_summary">Plasser ny-tweet-knappen til venstre.</string>
<string name="load_item_limit">Lastegrense</string>
<string name="load_item_limit_summary">Sett elementgrensen per innlasting.</string>
<string name="load_more_automatically">Last mer innhold automatisk</string>
<string name="load_more_automatically_summary">Last mer innhold (f.eks. bilder, kart, tweets) automatisk</string>
<string name="quote">Siter</string>
<string name="add_rule">Legg til regel</string>
<string name="text_size">Tekststørrelse</string>
<string name="cannot_get_location">Kan ikke skaffe din posisjon.</string>
<string name="drafts">Kladder</string>
<string name="text_size_summary">Tekststørrelse for tweets.</string>
<string name="cannot_get_location">Kan ikke finne din posisjon.</string>
<string name="drafts">Utkast</string>
<string name="description">Beskrivelse</string>
<string name="location">Posisjon</string>
<string name="url">URL</string>
<string name="url">Nettadresse</string>
<string name="favorites">Favoritter</string>
<string name="likes">Liker</string>
<string name="name">Navn</string>
<string name="refresh">Oppdater</string>
<string name="retry">Prøv igjen</string>
@ -113,53 +143,60 @@
<string name="quote_format_summary">\"[TEXT]\" = Tweet-tekst\n\"[NAME]\" = Twitter-brukernavn</string>
<string name="direct_messages">Meldinger</string>
<string name="blocked_users">Blokkerte brukere</string>
<string name="set_as_default">Sett som standard</string>
<string name="set_as_default">Bruk som standard</string>
<string name="search_users">Søk brukere</string>
<string name="search_statuses">Søk tweets</string>
<string name="created_at">Opprettet</string>
<string name="search_hint">Søk tweets eller brukere</string>
<string name="remember_position">Husk plasseringen</string>
<string name="remember_position_summary">Husk liste/fane plasseringen før lukking av Twidere</string>
<string name="user_blocked">Blokkert denne brukeren.</string>
<string name="users_blocked">Blokkert disse brukerne.</string>
<string name="user_unblocked">Fjernet blokkering av denne brukeren.</string>
<string name="reported_user_for_spam">Rapportert denne brukeren for spam.</string>
<string name="reported_users_for_spam">Rapportert disse brukerne for spam.</string>
<string name="remember_position">Husk posisjon</string>
<string name="remember_position_summary">Husk liste- og faneplasseringen før Twidere lukkes</string>
<string name="user_blocked">Blokkerte denne brukeren.</string>
<string name="users_blocked">Blokkerte disse brukerne.</string>
<string name="user_unblocked">Opphevet blokkering av denne brukeren.</string>
<string name="reported_user_for_spam">Rapporterte denne brukeren for spam.</string>
<string name="reported_users_for_spam">Rapporterte disse brukerne for spam.</string>
<string name="filename_hint">Filnavn</string>
<string name="please_wait">Vennligst vent.</string>
<string name="saved_to_gallery">Lagret i galleriet.</string>
<string name="proxy">Proxy</string>
<string name="http_proxy">HTTP Proxy</string>
<string name="http_proxy_summary">Bruk HTTP Proxy for alle nettverksforespørsler.</string>
<string name="proxy_host">Proxy tjener</string>
<string name="proxy_port">Proxy Port</string>
<string name="proxy_host">Proxy-tjener</string>
<string name="proxy_port">Proxy-port</string>
<string name="block">Blokker</string>
<string name="unblock">Fjern blokkering</string>
<string name="unblock">Opphev blokkering</string>
<string name="report_for_spam">Rapporter spam</string>
<string name="message_user_muted">La til denne brukeren i filtreringslista. Du vil ikke se tweers fra denne brukeren på tidslinjen eller som omtalelser.</string>
<string name="message_users_muted">La til brukere til filtreringslista. Du vil ikke se tweets fra disse brukerne på tidslinja eller som omtalelser.</string>
<string name="twitter_mute_user">Skjul bruker</string>
<string name="twitter_muted_users">Skjulte brukere</string>
<string name="message_user_muted">La brukeren til filtreringslisten. Du vil ikke se tweets fra denne brukeren på tidslinjen eller som omtalelser.</string>
<string name="message_users_muted">La brukerne til filtreringslisten. Du vil ikke se tweets fra disse brukerne på tidslinjen eller som omtalelser.</string>
<string name="message_user_unmuted">Fjernet brukeren fra filterlisten.</string>
<string name="inbox">Innboks</string>
<string name="load_images">Last bilder</string>
<string name="other_settings">Andre innstillinger</string>
<string name="auto_refresh">Oppdater automatisk</string>
<string name="refresh_interval">Oppfriskningsintervall</string>
<string name="content_to_refresh">Innhold å oppfriske</string>
<string name="notifications_type">Notifikasjonstype</string>
<string name="refresh_interval">Oppdateringsintervall</string>
<string name="content_to_refresh">Innhold å oppdatere</string>
<string name="content_to_notify">Varselinnhold</string>
<string name="notifications_type">Varslingstyper</string>
<string name="sound">Lyd</string>
<string name="ringtone">Ringetone</string>
<string name="vibration">Vibrasjon</string>
<string name="light">Lys</string>
<string name="light">Varsel-LED</string>
<string name="notifications">Varsler</string>
<string name="screen_name">Brukernavn</string>
<string name="refresh_on_start">Oppdater ved oppstart</string>
<string name="refresh_on_start_summary">Oppfrisk tidslinje og omtalelser ved start.</string>
<string name="refresh_after_status_updated">Oppfrisk etter sending av tweet</string>
<string name="refresh_after_status_updated_summary">Oppfrisk tidslinje og omtalelser etter sending av tweets.</string>
<string name="refresh_on_start_summary">Oppdater tidslinje og omtalelser ved oppstart.</string>
<string name="refresh_after_status_updated">Oppdater etter sending av tweet</string>
<string name="refresh_after_status_updated_summary">Oppdater tidslinje og omtalelser etter sending av tweets.</string>
<string name="list_timeline">List tidslinje</string>
<string name="list_members">List medlemmer</string>
<string name="list_subscribers">List abonnenter</string>
<string name="type_to_compose">Skriv for å komponere</string>
<string name="users_lists">Brukers liste</string>
<string name="lists">Lister</string>
<string name="users_lists">Brukers lister</string>
<string name="lists_following_user">Lister som følger denne brukeren</string>
<string name="lists_following_you">Lister som følger deg</string>
<string name="item_3_minutes">3 minutter</string>
<string name="item_5_minutes">5 minutter</string>
<string name="item_10_minutes">10 minutter</string>
@ -168,21 +205,23 @@
<string name="item_1_hour">1 time</string>
<string name="item_2_hours">2 timer</string>
<string name="item_4_hours">4 timer</string>
<string name="display_image_preview">Vis forhåndsvisning av bilde</string>
<string name="display_image_preview">Forhåndsvis bilde</string>
<string name="following_you">Følger deg</string>
<string name="user_list">Liste</string>
<string name="user_lists">Lister</string>
<string name="trends_location">Posisjon for trender</string>
<string name="trends_location_summary">Velg posisjon for lokale trender.</string>
<string name="trends">Trender</string>
<string name="accounts">Kontoer</string>
<string name="account">Konto</string>
<string name="mention_this_user">Nevn denne brukeren</string>
<string name="mention_this_user">Omtal denne brukeren</string>
<string name="mention_user_name">Omtal <xliff:g id="name">%1$s</xliff:g></string>
<string name="signing_in_please_wait">Logger inn, vennligst vent eller trykk Tilbake for å avslutte.</string>
<string name="connectivity">Tilkobling</string>
<string name="add_member">Legg til medlem</string>
<string name="new_user_list">Ny liste</string>
<string name="is_public">Offentlig</string>
<string name="send_direct_message">Send DM</string>
<string name="send_direct_message">Send direktemelding</string>
<string name="extensions">Utvidelser</string>
<string name="uninstall">Avinstaller</string>
<string name="saved_searches">Lagrede søk</string>
@ -200,26 +239,577 @@
<string name="content_and_storage">Innhold &amp; lagring</string>
<string name="image_uploader">Bildeopplaster</string>
<string name="media_uploader">Mediaopplaster</string>
<string name="image_uploader_default">Standard(Twitter)</string>
<string name="home_refresh">Oppfrisk på tidslinje</string>
<string name="image_uploader_default">Standard (Twitter)</string>
<string name="home_refresh">Oppdater på tidslinje</string>
<string name="error_message_image_upload_failed">Bildeopplasting feilet.</string>
<string name="error_message_image_uploader_not_found">Fant ikke bildeopplaster. Sjekk at den er installert.</string>
<string name="image_upload_format">Tweetformat med bilde</string>
<string name="image_upload_format_summary">\"[LINK]\" = Bildelenke\n\"[TEXT]\" = Tweet-innhold\n(Kun utvidelse)</string>
<string name="status_shortener">Tweetforkorter</string>
<string name="status_shortener_default">Ingen (avbryt sending)</string>
<string name="error_message_status_too_long">Tweet for lang.</string>
<string name="error_message_message_too_long">Melding for lang.</string>
<string name="error_message_no_content">Ingen innhold</string>
<string name="error_message_tweet_shorten_failed">Tweetforkortelse feilet.</string>
<string name="error_message_tweet_shortener_not_found">Tweetforkorter ikke funnet, sjekk at den er installert.</string>
<string name="multimedia_contents">Multimediainnhold</string>
<string name="show_absolute_time">Vis absolutt tid</string>
<string name="show_absolute_time_summary">Vis absolutt tid i tweets</string>
<string name="quick_send">Trykk \"Enter\" for å sende</string>
<string name="quick_send_summary">Send tweet når du trykker \"Enter\".</string>
<string name="user_mentions">Brukeromtalelser</string>
<string name="dual_pane_layout">Dobbeltrutet layout</string>
<string name="quick_send">Trykk «Enter» for å sende</string>
<string name="quick_send_summary">Send tweet når du trykker «Enter».</string>
<string name="discard">Forkast</string>
<string name="Nitems_selected_quantity_one" tools:ignore="PluralsCandidate">1 element valgt</string>
<string name="Nitems_selected_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="items">%d</xliff:g> elementer valgt</string>
<string name="custom_host_mapping">Tilpasset vertskobling</string>
<string name="custom_host_mapping_summary">Vertskobling som /etc/hosts, men krever ingen ekstra tillatelser.</string>
<string name="host_mapping_host">Vert</string>
<string name="host_mapping_address">Adresse (kan være annen vert)</string>
<string name="add_host_mapping">Legg til vertskobling</string>
<string name="tcp_dns_query">TCP DNS-spørring</string>
<string name="tcp_dns_query_summary">Bruk TCP-protokollen til å sende DNS-forespørsler, for å unngå hurtiglager-forgiftning.</string>
<string name="dns_server">DNS-server</string>
<string name="dns_server_summary">Velg DNS-server for API-forespørsler.</string>
<string name="activity_by_friends_list_member_added"><xliff:g id="user">%1$s</xliff:g> lagt til<xliff:g id="target">%2$s</xliff:g> til liste.</string>
<string name="activity_by_friends_list_created"><xliff:g id="user">%1$s</xliff:g> opprettet liste <xliff:g id="target">%2$s</xliff:g>.</string>
<string name="activities_about_me">Aktivitet om meg</string>
<string name="activities_by_friends">Venners aktivitet</string>
<string name="activity_about_me_favorite"><xliff:g id="user">%s</xliff:g> favorittmarkerte din tweet.</string>
<string name="activity_about_me_favorite_multi"><xliff:g id="user">%1$s</xliff:g> og <xliff:g id="other">%2$s</xliff:g> favorittmarkerte din tweet.</string>
<string name="activity_about_me_favorited_retweet"><xliff:g id="user">%s</xliff:g> favorittmarkerte din retweet.</string>
<string name="activity_about_me_favorited_retweet_multi"><xliff:g id="user">%1$s</xliff:g> og <xliff:g id="other">%2$s</xliff:g> favorittmarkerte din retweet.</string>
<string name="activity_about_me_like"><xliff:g id="user">%s</xliff:g> likte tweeten din.</string>
<string name="activity_about_me_like_multi"><xliff:g id="user">%1$s</xliff:g> og <xliff:g id="other">%2$s</xliff:g> likte tweeten din.</string>
<string name="activity_about_me_liked_retweet"><xliff:g id="user">%s</xliff:g> likte retweeten din.</string>
<string name="activity_about_me_liked_retweet_multi"><xliff:g id="user">%1$s</xliff:g> og <xliff:g id="other">%2$s</xliff:g> likte retweeten din.</string>
<string name="activity_about_me_follow"><xliff:g id="user">%s</xliff:g> følger deg.</string>
<string name="activity_about_me_follow_multi"><xliff:g id="user">%1$s</xliff:g> og <xliff:g id="other">%2$s</xliff:g> følger deg.</string>
<string name="activity_about_me_retweet"><xliff:g id="user">%s</xliff:g> retweetet din tweet.</string>
<string name="activity_about_me_retweet_multi"><xliff:g id="user">%1$s</xliff:g> og <xliff:g id="other">%2$s</xliff:g> retweetet din tweet.</string>
<string name="activity_about_me_retweeted_retweet"><xliff:g id="user">%s</xliff:g> retweetet din retweet.</string>
<string name="activity_about_me_retweeted_retweet_multi"><xliff:g id="user">%1$s</xliff:g> og <xliff:g id="other">%2$s</xliff:g> retweetet din retweet.</string>
<string name="activity_about_me_retweeted_mention"><xliff:g id="user">%s</xliff:g> retweetet en tweet som omtalte deg.</string>
<string name="activity_about_me_retweeted_mention_multi"><xliff:g id="user">%s</xliff:g> og <xliff:g id="other">%2$s</xliff:g> retweetet en tweet som omtalte deg.</string>
<string name="activity_about_me_favorited_mention"><xliff:g id="user">%s</xliff:g> favorittmarkerte en tweet som omtalte deg.</string>
<string name="activity_about_me_favorited_mention_multi"><xliff:g id="user">%s</xliff:g> og <xliff:g id="other">%2$s</xliff:g> favorittmarkerte en tweet som omtalte deg.</string>
<string name="activity_about_me_liked_mention"><xliff:g id="user">%s</xliff:g> likte en tweet som omtalte deg.</string>
<string name="activity_about_me_liked_mention_multi"><xliff:g id="user">%s</xliff:g> og <xliff:g id="other">%2$s</xliff:g> likte en tweet som omtalte deg.</string>
<string name="activity_about_me_list_member_added"><xliff:g id="user">%s</xliff:g> la deg til en liste.</string>
<string name="activity_about_me_list_member_added_with_name"><xliff:g id="user">%1$s</xliff:g> la deg til listen <xliff:g id="list">%2$s</xliff:g>\".</string>
<string name="activity_about_me_list_member_added_multi"><xliff:g id="user">%1$s</xliff:g> og <xliff:g id="other">%2$s</xliff:g> la deg til deres liste.</string>
<string name="activity_by_friends_favorite"><xliff:g id="user">%1$s</xliff:g> favorittmarkerte tweeten til <xliff:g id="target">%2$s</xliff:g>.</string>
<string name="activity_by_friends_favorite_multi"><xliff:g id="user">%1$s</xliff:g> favorittmarkerte tweeten til <xliff:g id="target">%2$s</xliff:g> og <xliff:g id="other">%3$s</xliff:g>.</string>
<string name="activity_by_friends_like"><xliff:g id="user">%1$s</xliff:g> likte tweeten til <xliff:g id="target">%2$s</xliff:g>.</string>
<string name="activity_by_friends_like_multi"><xliff:g id="user">%1$s</xliff:g> likte tweeten til <xliff:g id="target">%2$s</xliff:g> og <xliff:g id="other">%3$s</xliff:g>.</string>
<string name="activity_by_friends_follow"><xliff:g id="user">%1$s</xliff:g> følger <xliff:g id="target">%2$s</xliff:g>.</string>
<string name="activity_by_friends_follow_multi"><xliff:g id="user">%1$s</xliff:g> følger <xliff:g id="target">%2$s</xliff:g> og <xliff:g id="other">%3$s</xliff:g>.</string>
<string name="activity_by_friends_retweet"><xliff:g id="user">%1$s</xliff:g> retweetet tweeten til <xliff:g id="target">%2$s</xliff:g>.</string>
<string name="activity_by_friends_retweet_multi"><xliff:g id="user">%1$s</xliff:g> retweetet tweeten til<xliff:g id="target">%2$s</xliff:g> and <xliff:g id="other">%3$s</xliff:g>.</string>
<string name="activity_by_friends_list_member_added"><xliff:g id="user">%1$s</xliff:g> lagt til<xliff:g id="target">%2$s</xliff:g> til en liste.</string>
<string name="activity_by_friends_list_member_added_multi"><xliff:g id="user">%1$s</xliff:g> la <xliff:g id="target">%2$s</xliff:g> og <xliff:g id="other">%1$s</xliff:g> til en liste.</string>
<string name="activity_by_friends_list_created"><xliff:g id="user">%1$s</xliff:g> opprettet listen <xliff:g id="target">%2$s</xliff:g>.</string>
<string name="activity_by_friends_list_created_multi"><xliff:g id="user">%1$s</xliff:g> opprettet listen <xliff:g id="target">%2$s</xliff:g> og <xliff:g id="other">%1$s</xliff:g>.</string>
<string name="status_not_updated">Tweet ikke sendt.</string>
<string name="status_not_updated_summary">Tweet ikke sendt, og lagret i utkast.</string>
<string name="incoming_friendships">Avventer følgerforespørsel</string>
<string name="send_follow_request">Send følgerforespørsel</string>
<string name="follow_request_sent">Følgerforespørsel sendt</string>
<string name="incoming_friendships">Avventer følgeforespørsel</string>
<string name="send_follow_request">Send følgeforespørsel</string>
<string name="follow_request_sent">Følgeforespørsel sendt</string>
<string name="status">Tweet</string>
<string name="preview">Forhåndsvisning</string>
<string name="connection_timeout">Tilkobling ble tidsavbrutt</string>
<string name="both">Begge</string>
<string name="browser_sign_in">Pålogging via nettleser</string>
<string name="stop_auto_refresh_when_battery_low">Stopp automatisk oppdatering når batterinivået er lavt</string>
<string name="notification_status">Ny tweet av <xliff:g id="user">%s</xliff:g></string>
<string name="notification_status_multiple">Ny tweet av <xliff:g id="user">%1$s</xliff:g> og <xliff:g id="count">%2$d</xliff:g> andre</string>
<string name="notification_mention"><xliff:g id="user">%s</xliff:g> omtalte deg.</string>
<string name="notification_mention_multiple"><xliff:g id="user">%1$s</xliff:g> og <xliff:g id="count">%2$d</xliff:g> andre omtalte deg.</string>
<string name="notification_direct_message"><xliff:g id="user">%s</xliff:g> sendte deg en direktemelding.</string>
<string name="notification_direct_message_multiple_messages"><xliff:g id="user">%1$s</xliff:g> sendte deg <xliff:g id="messages_count">%2$d</xliff:g> direktemeldinger.</string>
<string name="notification_direct_message_multiple_users"><xliff:g id="user">%1$s</xliff:g> og <xliff:g id="users_count">%2$d</xliff:g> andre sendte deg <xliff:g id="messages_count">%3$d</xliff:g> direktemeldinger.</string>
<string name="action_getting_status">henter tweet</string>
<string name="action_updating_status">sender tweet</string>
<string name="action_sending_direct_message">sender direktemelding</string>
<string name="action_refreshing_home_timeline">oppdaterer tidslinjen</string>
<string name="action_refreshing_mentions">oppdaterer omtalelser</string>
<string name="action_refreshing_direct_messages">oppdaterer direktemeldinger</string>
<string name="action_favoriting">favorittmarkerer</string>
<string name="action_unfavoriting">fjerner favorittmarkering</string>
<string name="action_deleting">sletter</string>
<string name="action_updating_profile">oppdaterer profil</string>
<string name="action_updating_profile_image">oppdaterer profilbildet</string>
<string name="action_updating_profile_banner_image">oppdaterer toppbildet</string>
<string name="action_removing_profile_banner_image">fjerner toppbildet</string>
<string name="action_updating_details">oppdaterer detaljer</string>
<string name="action_blocking">blokkerer</string>
<string name="action_unblocking">opphever blokkering</string>
<string name="action_following">følger</string>
<string name="action_unfollowing">avfølger</string>
<string name="action_creating_list">oppretter liste</string>
<string name="action_adding_member">legger til medlem</string>
<string name="action_signing_in">logger inn</string>
<string name="action_retweeting">retweeter</string>
<string name="action_reporting_for_spam">rapporterer for spam</string>
<string name="action_subscribing_to_list">abonnerer på liste</string>
<string name="action_unsubscribing_from_list">avsluttet abonnement på liste</string>
<string name="action_saving_search">lagrer søk</string>
<string name="action_deleting_search">sletter søk</string>
<string name="action_accepting_follow_request">godtar følgeforespørsel</string>
<string name="action_denying_follow_request">avslår følgeforespørsel</string>
<string name="status_is_duplicate">Tweeten din er et duplikat.</string>
<string name="silent_notifications">Lydløs varsling</string>
<string name="silent_notifications_summary">Slå av ringetone/vibrasjon for varsler</string>
<string name="disable_background_service">Slå av bakgrunnstjenesten</string>
<string name="disable_background_service_summary">Twidere har ingen bakgrunnstjeneste hvis du deaktiverer automatisk oppdatering og dataprofilering, ikke vær tåpelig!</string>
<string name="text_copied">Tekst kopiert til utklippstavlen.</string>
<string name="hashtag">Hashtag</string>
<string name="links">Lenker</string>
<string name="edit_profile">Rediger profil</string>
<string name="edit_details">Rediger detaljer</string>
<string name="display_sensitive_contents">Vis sensitivt innhold</string>
<string name="display_sensitive_contents_summary">Vis sensitivt innhold i tidslinjen uten forvarsel</string>
<string name="sensitive_content_warning">Denne tweeten kan ha sensitivt innhold. Fortsette?</string>
<string name="mark_as_sensitive">Marker som sensitiv</string>
<string name="remove_sensitive_mark">Fjern sensitivmarkering</string>
<string name="none">Ingen</string>
<string name="large">Stor</string>
<string name="small">Liten</string>
<string name="and_more">og <xliff:g id="count">%d</xliff:g> flere</string>
<string name="clear_search_history">Tøm søkehistorikken</string>
<string name="permission_description_none">Ingen tillatelser trengs</string>
<string name="permission_description_refresh">Oppdater tidslinje (inkludert direktemeldinger)</string>
<string name="permission_description_read">Les tweets and noe hurtiglagret innhold</string>
<string name="permission_description_write">Skrive til database, oppdatere status</string>
<string name="permission_description_direct_messages">Les, skriv eller send direktemeldinger</string>
<string name="permission_description_accounts">Les kontoinformasjon</string>
<string name="permission_description_preferences">Les innstillinger</string>
<string name="permissions_request">Tilgangsforespørsel</string>
<string name="permissions_request_message">Applikasjonen ber om følgende tillatelser</string>
<string name="accept_permission_request">Godta</string>
<string name="no_thanks">Nei, takk</string>
<string name="revoke_permissions">Tilbakekall tillatelser</string>
<string name="fast_scroll_thumb">Hurtig rulleindikator</string>
<string name="indicate_your_status">Indiker tweeten din</string>
<string name="default_ringtone">Standardringetone</string>
<string name="phishing_link_warning">Advarsel om nettfiske</string>
<string name="phishing_link_warning_summary">Advarer deg om lenker i direktemeldinger som kan være forsøk på nettfisking.</string>
<string name="phishing_link_warning_message_1">Du åpner en lenke fra en direktemelding, som kan være et forsøk på nettfisking.\n\nSjekk sidens adresse før du gir fra deg personlige opplysninger.</string>
<string name="phishing_link_warning_message_2">Er du sikker på at du vil fortsette?</string>
<string name="image_preload_options">Forhåndslasting av bilder</string>
<string name="profile_images">Profilbilder</string>
<string name="preview_images">Forhåndsvis bilder</string>
<string name="preload_wifi_only">Forhåndslast bare med Wi-Fi</string>
<string name="sign_in_method_introduction_title">Hvordan virker det?</string>
<string name="sign_in_method_introduction">De fleste Twitter-apper åpner en nettside for å godkjenne til Twitter. Dette kan være upraktisk ved bruk av tilpasset API eller trege nettverk. Twidere simulerer en vanlig nettleser for å hjelpe til med innloggingen. Slapp av, passordet ditt blir ikke lagret.</string>
<string name="quote_protected_status_notice">Det anbefales å ikke sitere beskyttede tweets.</string>
<string name="edit_draft">Rediger utkast</string>
<string name="profile_image">Profilbilde</string>
<string name="your_profile_image">Ditt profilbilde</string>
<string name="mention_user">Omtal <xliff:g id="user">%s</xliff:g></string>
<string name="theme_color">Temafarge</string>
<string name="wrong_url_format">Feil URL-format.</string>
<string name="wrong_username_password">Feil brukernavn eller passord.</string>
<string name="network_error">Nettverksfeil.</string>
<string name="api_data_corrupted">API-data er skadet.</string>
<string name="ssl_error">SSL-feil, du må kanskje aktivere \"Ignorer SSL-feil\"-valget.</string>
<string name="wrong_api_key">Feil API-URL eller brukernøkkel/passord. Sjekk at de er riktig skrevet.</string>
<string name="status_updated">Tweet sendt.</string>
<string name="status_deleted">Tweet slettet.</string>
<string name="status_favorited">Tweet favorittmarkert.</string>
<string name="status_unfavorited">Fjernet tweetens favorittmarkering.</string>
<string name="status_retweeted">Retweetet.</string>
<string name="retweet_cancelled">Retweet avbrutt.</string>
<string name="direct_message_sent">Direktemelding sendt.</string>
<string name="direct_message_deleted">Direktemelding slettet.</string>
<string name="search_saved">Søk lagret.</string>
<string name="search_name_saved">Søket «<xliff:g id="name">%s</xliff:g>» er lagret.</string>
<string name="search_deleted">Søk slettet.</string>
<string name="search_name_deleted">Søket «<xliff:g id="name">%s</xliff:g>» er slettet.</string>
<string name="import_from">Importer fra&#8230;</string>
<string name="link_to_quoted_status">Lenke til sitert tweet</string>
<string name="quote_original_status">Siter opprinnelig tweet</string>
<string name="followed_user">Følger <xliff:g id="user">%s</xliff:g>.</string>
<string name="sent_follow_request_to_user">Sendte følgeforespørsel til <xliff:g id="user">%s</xliff:g>.</string>
<string name="unfollowed_user">Avfulgte <xliff:g id="user">%s</xliff:g>.</string>
<string name="blocked_user">Blokkerte <xliff:g id="user">%s</xliff:g>.</string>
<string name="unblocked_user">Opphevet blokkering av <xliff:g id="user">%s</xliff:g>.</string>
<string name="profile_updated">Profil oppdatert.</string>
<string name="profile_banner_image_updated">Toppbilde oppdatert.</string>
<string name="profile_image_updated">Profilbilde oppdatert.</string>
<string name="created_list">Opprettet listen «<xliff:g id="list">%s</xliff:g>».</string>
<string name="deleted_list">Slettet listen «<xliff:g id="list">%s</xliff:g>».</string>
<string name="updated_list_details">Oppdaterte detaljer for listen «<xliff:g id="list">%s</xliff:g>».</string>
<string name="subscribed_to_list">Abonnerer på listen «<xliff:g id="list">%s</xliff:g>».</string>
<string name="unsubscribed_from_list">Avsluttet abonnement fra listen «<xliff:g id="list">%s</xliff:g>».</string>
<string name="added_N_users_to_list_quantity_one" tools:ignore="PluralsCandidate">La <xliff:g id="items">%1$d</xliff:g> bruker til listen «<xliff:g id="list">%2$s</xliff:g>».</string>
<string name="added_N_users_to_list_quantity_other" tools:ignore="PluralsCandidate">La <xliff:g id="items">%1$d</xliff:g> brukere til listen «<xliff:g id="list">%2$s</xliff:g>».</string>
<string name="added_user_to_list">La <xliff:g id="user">%1$s</xliff:g> til listen «<xliff:g id="list">%2$s</xliff:g>».</string>
<string name="deleted_user_from_list">Slettet <xliff:g id="user">%1$s</xliff:g> fra listen «<xliff:g id="list">%2$s</xliff:g>».</string>
<string name="deleted_N_users_from_list_quantity_one" tools:ignore="PluralsCandidate">Slettet <xliff:g id="items">%1$d</xliff:g> bruker fra listen «<xliff:g id="list">%2$s</xliff:g>».</string>
<string name="deleted_N_users_from_list_quantity_other" tools:ignore="PluralsCandidate">Slettet <xliff:g id="items">%1$d</xliff:g> brukere fra listen «<xliff:g id="list">%2$s</xliff:g>».</string>
<string name="delete_user_from_list_confirm">Slette <xliff:g id="user">%1$s</xliff:g> fra listen «<xliff:g id="list">%2$s</xliff:g>»?</string>
<string name="delete_N_users_from_list_confirm_quantity_one" tools:ignore="PluralsCandidate">Slette <xliff:g id="items">%1$d</xliff:g> bruker fra listen «<xliff:g id="list">%2$s</xliff:g>»?</string>
<string name="delete_N_users_from_list_confirm_quantity_other" tools:ignore="PluralsCandidate">Slette <xliff:g id="items">%1$d</xliff:g> brukere fra listen «<xliff:g id="list">%2$s</xliff:g>»?</string>
<string name="subscribe">Abonner</string>
<string name="unsubscribe">Avslutt abonnement</string>
<string name="background_toast_notification">Varsler i bakgrunnen</string>
<string name="background_toast_notification_summary">Vis popup-varsler når appen kjører i bakgrunnen</string>
<string name="original_status">Opprinnelig tweet</string>
<string name="ask">Spør</string>
<string name="no_close_after_status_updated">Behold «Skriv»-vinduet etter sendte tweets</string>
<string name="no_close_after_status_updated_summary">En liten gave for Chatterbox</string>
<string name="status_saved_to_draft">Tweet lagret til utkast.</string>
<string name="default_account">Standardkonto</string>
<string name="created_at_with_N_tweets_per_day_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="created_at">%1$s</xliff:g> (<xliff:g id="daily_tweet">%2$d</xliff:g> tweet per dag)</string>
<string name="created_at_with_N_tweets_per_day_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="created_at">%1$s</xliff:g> (<xliff:g id="daily_tweet">%2$d</xliff:g> tweets per dag)</string>
<string name="empty_content">Tomt innhold</string>
<string name="fast_image_loading">Hurtig bildelasting</string>
<string name="fast_image_loading_summary">Aktiver for å laste bilder raskere, deaktiver hvis noen bilder ikke vises.</string>
<string name="select_user_list">Velg brukerliste</string>
<string name="select_user">Velg bruker</string>
<string name="created_by">Opprettet av <xliff:g id="created_by">%s</xliff:g></string>
<string name="add_to_list">Legg til listen</string>
<string name="account_delete_confirm_title">Fjern konto</string>
<string name="account_delete_confirm_message">Denne kontoen vil bli fjernet fra Twidere.</string>
<string name="theme">Tema</string>
<string name="theme_dark">Mørkt</string>
<string name="theme_light">Lyst</string>
<string name="settings_interface">Grensesnitt</string>
<string name="no_rule">Ingen regler</string>
<string name="safety">Sikkerhet</string>
<string name="updating_status_notification">Sender tweet&#8230;</string>
<string name="name_with_nickname"><xliff:g id="name">%1$s</xliff:g> (<xliff:g id="nickname">%2$s</xliff:g>)</string>
<string name="query">Spørring</string>
<string name="input_text">Skriv inn tekst</string>
<string name="users_lists_with_name"><xliff:g id="name">%s</xliff:g> sine lister</string>
<string name="lists_following_user_with_name">Lister som følger <xliff:g id="name">%s</xliff:g></string>
<string name="highlight">Markering</string>
<string name="underline">Understrek</string>
<string name="link_highlight_option">Lenkemarkering</string>
<string name="users_statuses">Brukerens tweets</string>
<string name="card_animation">Kortanimasjon</string>
<string name="name_first">Vis navnet først</string>
<string name="next_step">Neste</string>
<string name="previous_item">Forrige</string>
<string name="next_item">Neste</string>
<string name="settings_wizard">Innstillingsveiviser</string>
<string name="wizard_page_welcome_title">Velkommen</string>
<string name="wizard_page_welcome_text">Takk for at du valgte Twidere.\nVil du sette den opp nå?</string>
<string name="wizard_page_welcome_yes">Ja</string>
<string name="wizard_page_welcome_not_now">Ikke nå</string>
<string name="wizard_page_welcome_import_settings">Importer innstillinger</string>
<string name="wizard_page_theme_text">Velg et tema du liker.</string>
<string name="wizard_page_tabs_text">Legg til faner i Twidere.\nFølg med på folk eller ting du bryr deg om.</string>
<string name="wizard_page_tabs_unchanged_message">Du kan legge til faner fra &laquo;Innstillinger&raquo;
- &laquo;Faner&raquo;</string>
<string name="wizard_page_cards_text">Sett opp kortelementer.</string>
<string name="wizard_page_hints_text">Her er noen nyttige tips.</string>
<string name="wizard_page_usage_statistics_text">Twidere tok del i flere forskningsprosjekt som trenger bruksdata.</string>
<string name="wizard_page_finished_title">Ferdig</string>
<string name="wizard_page_finished_text">Nå er Twidere klar til bruk.</string>
<string name="invalid_tab">Ugyldig fane</string>
<string name="send_crash_report">Send feilrapport til Twidere</string>
<string name="add_to_filter">Legg til filter</string>
<string name="user_filter_name">Bruker: <xliff:g id="name">%s</xliff:g></string>
<string name="keyword_filter_name">Stikkord: <xliff:g id="name">%s</xliff:g></string>
<string name="source_filter_name">Kilde: <xliff:g id="name">%s</xliff:g></string>
<string name="block_user">Blokker <xliff:g id="name">%s</xliff:g></string>
<string name="block_user_confirm_message">Blokkere <xliff:g id="name">%s</xliff:g>? Denne brukeren vil ikke kunne følge deg, omtale deg eller sende deg direktemeldinger.</string>
<string name="unfollow_user">Avfølg <xliff:g id="name">%s</xliff:g></string>
<string name="unfollow_user_confirm_message">Avfølge <xliff:g id="name">%s</xliff:g>? Du vil ikke lenger se tweets fra denne brukeren.</string>
<string name="delete_user_list">Slette listen <xliff:g id="name">%s</xliff:g></string>
<string name="delete_user_list_confirm_message">Slette listen <xliff:g id="name">%s</xliff:g>? Dette kan ikke angres.</string>
<string name="unsubscribe_from_user_list">Avslutt abonnement på listen <xliff:g id="name">%s</xliff:g></string>
<string name="unsubscribe_from_user_list_confirm_message">Avslutt abonnement på listen <xliff:g id="name">%s</xliff:g>? Du kan gjenoppta abonnementet senere.</string>
<string name="destroy_status">Slett tweet</string>
<string name="destroy_status_confirm_message">Slette denne tweeten?</string>
<string name="destroy_saved_search">Slett lagret søk «<xliff:g id="name">%s</xliff:g>»</string>
<string name="destroy_saved_search_confirm_message">Slette lagret søk «<xliff:g id="name">%s</xliff:g>»? Du kan lagre søket på nytt senere.</string>
<string name="signing_in_error_browser_sign_in_hint">Feil ved innlogging. Du må kanskje bruke nettleseren. (Dette tar ikke hensyn til tilpassede API-innstillinger under innlogging)</string>
<string name="report_user">Rapporter <xliff:g id="name">%s</xliff:g></string>
<string name="report_user_confirm_message">Rapportere <xliff:g id="name">%s</xliff:g> for spam? Brukeren vil også bli blokkert.</string>
<string name="twidere_test">Twidere-test</string>
<string name="staggered_home_timeline">Forskjøvet tidslinje</string>
<string name="unread_count">Ulest-teller</string>
<string name="developed_by">Utviklet av</string>
<string name="project_account">Prosjektkonto</string>
<string name="translators">Oversettere</string>
<string name="translate">Oversett</string>
<string name="sponsored_by">Sponset av</string>
<string name="special_thanks_to">Spesielt takk til</string>
<string name="contributors_list_summary">Hvis du ikke finner navnet ditt, si fra til prosjektkontoen vår.</string>
<string name="account_options">Kontoinnstillinger</string>
<string name="show_in_timeline">Vis på tidslinjen</string>
<string name="cards">Kort</string>
<string name="no_tab_hint">Ingen faner</string>
<string name="delete_user">Slett bruker <xliff:g id="name">%s</xliff:g></string>
<string name="delete_users">Slett brukere</string>
<string name="delete_user_confirm_message">Slette <xliff:g id="name">%s</xliff:g>? Dette kan ikke angres.</string>
<string name="toggle">Veksle</string>
<string name="general">Generelt</string>
<string name="hints">Tips</string>
<string name="finish">Ferdig</string>
<string name="background">Bakgrunn</string>
<string name="theme_background_default">Standard</string>
<string name="theme_background_solid">Ren hvit eller svart</string>
<string name="theme_background_transparent">Gjennomsiktig</string>
<string name="theme_dark_actionbar">Mørk ActionBar</string>
<string name="wizard_hint_compose_select_account">Trykk på profilbildet for å velge konto mens du skriver en tweet.</string>
<string name="wizard_hint_quote_format">Velg siteringsformat under &laquo;Innstillinger&raquo;
- &laquo;Skriv&laquo;</string>
<string name="wizard_hint_filters">Du kan skjule uønskede tweets fra tidslinjen og varsler ved å bruke &laquo;Filtre&raquo;.</string>
<string name="view_replies">Vis svar</string>
<string name="compact_cards">Kompakte kort</string>
<string name="compact_cards_summary">Vis flere kort på skjermen</string>
<string name="N_new_statuses_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="items">%d</xliff:g> ny tweet</string>
<string name="N_new_statuses_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="items">%d</xliff:g> nye tweets</string>
<string name="N_new_mentions_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="items">%d</xliff:g> ny omtalelse</string>
<string name="N_new_mentions_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="items">%d</xliff:g> nye omtalelser</string>
<string name="N_new_messages_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="items">%d</xliff:g> ny samtale</string>
<string name="N_new_messages_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="items">%d</xliff:g> nye samtaler</string>
<string name="status_share_subject_format_with_time">Tweet fra <xliff:g id="name">%1$s</xliff:g> (@<xliff:g id="screen_name">%2$s</xliff:g>), <xliff:g id="time">%3$s</xliff:g></string>
<string name="status_share_text_format_with_link"><xliff:g id="text">%1$s</xliff:g>\n\n<xliff:g id="link">%2$s</xliff:g></string>
<string name="rate_limit">Oppdateringsrate</string>
<string name="wizard_hint_rate_limit">Hvis du får problemer med Twitters oppdateringsrate, ikke skyld på oss, det er Twitters retningslinjer.</string>
<string name="preparing_database">Forbereder database</string>
<string name="preparing_database_toast">Forbereder database, vent litt.</string>
<string name="action_name_saved_at_time"><xliff:g id="action">%1$s</xliff:g>, lagret <xliff:g id="time">%2$s</xliff:g></string>
<string name="update_status">Send tweet</string>
<string name="sending_direct_message">Sender direktemelding</string>
<string name="tab_display_option">Fanevisningsvalg</string>
<string name="livewp_daydream_enabled_message">Her er en liten gave til deg, finn den i systeminnstillingene :)</string>
<string name="center">Senter</string>
<string name="multi_select">Flervalg</string>
<string name="long_click_to_open_menu">Langt trykk åpner menyen</string>
<string name="tab_display_option_icon">Ikon</string>
<string name="tab_display_option_label">Etikett</string>
<string name="tab_display_option_icon_and_label">Ikon og etikett</string>
<string name="highlight_and_underline">Markering og understrek</string>
<string name="back">Tilbake</string>
<string name="theme_font_family">Temaets skrifftype</string>
<string name="translation_destination">Språk</string>
<string name="accept">Godta</string>
<string name="deny">Avslå</string>
<string name="accepted_users_follow_request">Godtok følgeforespørselen til <xliff:g id="user">%s</xliff:g>.</string>
<string name="denied_users_follow_request">Avslo følgeforespørselen til <xliff:g id="user">%s</xliff:g>.</string>
<string name="import_settings">Importer innstillinger</string>
<string name="export_settings">Eksporter innstillinger</string>
<string name="export_settings_type_dialog_title">Eksporter innstillinger&#8230;</string>
<string name="import_settings_type_dialog_title">Importer innstillinger&#8230;</string>
<string name="nicknames">Kallenavn</string>
<string name="user_colors">Brukerfarger</string>
<string name="import_export">Import/Eksport</string>
<string name="theme_background_alpha">Temabakgrunnens gjennomsiktighet</string>
<string name="progress">Fremdrift</string>
<string name="hidden_settings">Skjulte innstillinger</string>
<string name="hidden_settings_warning_title">ADVARSEL: Disse innstillingene kan være skadelige!</string>
<string name="hidden_settings_warning_message">ALDRI forandre disse innstillingene hvis du ikke vet hva du gjør, ellers vil de:\n* Ta livet av katten din\n* Sende atomvåpen mot Nord-Korea\n* Øke skattene og avgiftene ytterligere\n* Ødelegge universet</string>
<string name="force_using_private_apis">Tving bruk av private API-er</string>
<string name="status_text_limit">Tegnbegrensning på tweet</string>
<string name="load_more_from_top">Last inn mer fra toppen</string>
<string name="load_more_from_top_summary">Nyttig hvis du foretrekker å lese fra bunn til topp</string>
<string name="compose_now">Skriv Nå</string>
<string name="compose_now_summary">Erstatter «Google Nå»-snarvei med «Skriv»-skjermen</string>
<string name="compose_now_action">«Skriv Nå»-handling</string>
<string name="open_with_account">Åpne med konto</string>
<string name="card_highlight_option_highlight">Markering</string>
<string name="card_highlight_option_line">Linje</string>
<string name="timeline_sync_service">Synkroniseringstjeneste for tidslinjen</string>
<string name="image_preview_scale_type">Skalering for bildeforhåndsvisning</string>
<string name="image_preview_scale_type_crop">Beskjær</string>
<string name="image_preview_scale_type_fit_center">Sentrert</string>
<string name="quote_protected_status_warning_message">Denne tweeten er beskyttet.\n\nBeskyttede brukere vil vanligvis ikke at tweetene deres skal deles offentlig.</string>
<string name="send_anyway">Send likevel</string>
<string name="following_only">Bare mine følgere</string>
<string name="following_only_summary">Vis varsler bare fra brukere du følger.</string>
<string name="new_direct_message">Ny direktemelding</string>
<string name="plain_list_style">Enkel listestil</string>
<string name="want_old_icon_back">Vil du ha tilbake det gamle ikonet?</string>
<string name="icon_restored_message">Ikon gjenopprettet!</string>
<string name="add">Legg til</string>
<string name="N_media_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="items">%d</xliff:g> media</string>
<string name="N_media_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="items">%d</xliff:g> media</string>
<string name="delete_drafts_confirm">Slette valgte utkast?</string>
<string name="extra_configurations">Ekstra innstillinger</string>
<string name="click_item_to_config">Trykk på et element for å sette opp</string>
<string name="retweets_of_me">Retweets av meg</string>
<string name="from_gallery">Fra galleri</string>
<string name="from_camera">Fra kamera</string>
<string name="excluded">Ekskludert</string>
<string name="exclude_this_host">Ekskluder denne verten</string>
<string name="api_url_format_help">[DOMAIN]: Twitter API-domene.\nEksempel: https://[DOMAIN].twitter.com/ erstattes med https://api.twitter.com/.</string>
<string name="no_version_suffix">Ingen versjonssuffiks</string>
<string name="inverse_selection">Omvendt valg</string>
<string name="edit_media">Rediger media</string>
<string name="media">Media</string>
<string name="mute_user">Skjul <xliff:g id="name">%s</xliff:g></string>
<string name="muted_user">Skjuler <xliff:g id="name">%s</xliff:g></string>
<string name="unmute_user">Vis <xliff:g id="name">%s</xliff:g></string>
<string name="unmuted_user">Viser <xliff:g id="name">%s</xliff:g></string>
<string name="mute">Skjul</string>
<string name="unmute">Vis</string>
<string name="action_muting">skjuler</string>
<string name="action_unmuting">viser</string>
<string name="mute_user_confirm_message">Skjule <xliff:g id="name">%s</xliff:g>? Du vil ikke lenger se tweets fra denne brukeren men du fortsetter å følge den.</string>
<string name="remove_from_filter">Fjern fra filter</string>
<string name="sort_timeline_by_id">Sorter tidslinje etter ID</string>
<string name="style">Stil</string>
<string name="color">Farge</string>
<string name="font_family">Skrifttype</string>
<string name="appearance">Utseende</string>
<string name="function">Funksjon</string>
<string name="replies">Svar</string>
<string name="profile_banner">Toppbilde</string>
<string name="profile">Profil</string>
<string name="listed">Listet</string>
<string name="state_blocking">Blokkerer</string>
<string name="load_more">Last inn mer</string>
<string name="photo">Bilde</string>
<string name="camera">Kamera</string>
<string name="gallery">Galleri</string>
<string name="source_camera">Kamera</string>
<string name="source_gallery">Galleri</string>
<string name="source_clipboard">Utklippstavle</string>
<string name="remove">Fjern</string>
<string name="load_media">Last inn media</string>
<string name="profile_text_color">Tekstfarge</string>
<string name="profile_background_color">Bakgrunnsfarge</string>
<string name="profile_link_color_main_color">Lenkefarge (hovedfarge)</string>
<string name="retweet_quote_confirm_title">Retweet til følgerne dine?</string>
<string name="font">Skrift</string>
<string name="size">Størrelse</string>
<string name="just_now">Akkurat nå</string>
<string name="requested">Forespurt</string>
<string name="round">Rund</string>
<string name="square">Firkantet</string>
<string name="profile_image_style">Profilbildestil</string>
<string name="media_preview_style">Forhåndsvisning av media</string>
<string name="draft_saved">Utkast lagret</string>
<string name="open_twitter_links">Åpne Twitter-lenker</string>
<string name="N_others_quantity_one" tools:ignore="PluralsCandidate">en annen</string>
<string name="N_others_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> andre</string>
<string name="type_name_to_search">Skriv inn navn for å søke</string>
<string name="no_user_found">Fant ingen bruker</string>
<string name="members">Medlemmer</string>
<string name="subscribers">Abonnenter</string>
<string name="read_from_bottom">Les fra bunnen</string>
<string name="read_from_bottom_summary_off">Gå til nyeste tweet etter oppdatering</string>
<string name="read_from_bottom_summary_on">Behold leseposisjonen etter oppdatering</string>
<string name="register">Registrer</string>
<string name="follows">Følger</string>
<string name="belongs_to">Hører til</string>
<string name="blocked_by_user_summary">Du ble blokkert av <xliff:g id="name">%s</xliff:g></string>
<string name="select_accounts">Velg kontoer</string>
<string name="media_preview">Forhåndsvisning av media</string>
<string name="edit_tabs">Rediger faner</string>
<string name="no_location">Ingen posisjon</string>
<string name="getting_location">Henter posisjon</string>
<string name="save_to_gallery">Lagre til galleri</string>
<string name="usage_statistics">Bruksstatistikk</string>
<string name="research_hot_mobile">Datadrevet mobilnett-forskning</string>
<string name="unknown_location">Ukjent posisjon</string>
<string name="ellipsis">&#8230;</string>
<string name="import_export_settings">Importer/eksporter innstillinger</string>
<string name="usage_statistics_header_summary">Twidere tok del i noen forskningsprosjekter. Ved å bidra til disse prosjektene gjør du Twidere og fremtidige apper bedre.</string>
<string name="no_tab">Ingen faner</string>
<string name="user_protected_summary">Du må sende en følgeforespørsel til denne beskyttede brukeren for å se tweets</string>
<string name="no_account">Ingen konto</string>
<string name="permission_description_shorten_status">Applikasjonen kan forkorte tweets for Twidere, så den har tilgang til tweets du sender.</string>
<string name="permission_description_upload_media">Applikasjonen kan laste opp media for Twidere, så den har tilgang til media i tweets du sender.</string>
<string name="permission_description_sync_timeline">Applikasjonen kan synkronisere leseposisjonen for Twidere, så den har tilgang til leseposisjonen din.</string>
<string name="usage_statistics_notification_summary">Hjelp oss å forbedre Twidere!</string>
<string name="from_name">Fra <xliff:g id="name">%1$s</xliff:g></string>
<string name="from_name_and_name">Fra <xliff:g id="name">%1$s</xliff:g> og <xliff:g id="name">%2$s</xliff:g></string>
<string name="from_name_and_N_others">Fra <xliff:g id="name">%1$s</xliff:g> og <xliff:g id="name">%2$d</xliff:g> andre</string>
<string name="projects_we_took_part">Prosjekter vi tok del i</string>
<string name="activated_accounts">Aktiverte kontoer</string>
<string name="search">Søk</string>
<string name="crop">Beskjær</string>
<string name="scale">Skaler</string>
<string name="user_type_verified">Bekreftet</string>
<string name="user_type_protected">Beskyttet</string>
<string name="tweet_hashtag">Tweet #<xliff:g id="text">%1$s</xliff:g></string>
<string name="share_status">Del tweet</string>
<string name="pebble_notifications">Pebble-varsler</string>
<string name="pebble_notifications_summary">Send varsler til din Pebble</string>
<string name="tweet_from_name">Tweet fra <xliff:g id="text">%1$s</xliff:g></string>
<string name="permission_label_shorten_status">Forkort tweet</string>
<string name="permission_label_upload_media">Last opp media</string>
<string name="permission_label_sync_timeline">Synkroniser tidslinjen</string>
<string name="thumbor_integration">Thumbor-integrasjon</string>
<string name="server_address">Tjeneradresse</string>
<string name="security_key">Sikkerhetsnøkkel</string>
<string name="hide_card_actions">Skjul korthandlinger</string>
<string name="N_statuses_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> tweet</string>
<string name="N_statuses_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> tweets</string>
<string name="N_favorites_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> favoritt</string>
<string name="N_favorites_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> favoritter</string>
<string name="N_likes_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> likte</string>
<string name="N_likes_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> likte</string>
<string name="drafts_hint_messages">Dine usendte tweets lagres her</string>
<string name="keyboard_shortcuts">Hurtigtaster</string>
<string name="keyboard_shortcut_hint">Trykk på tastene</string>
<string name="conflicts_with_name">Konflikter med <xliff:g id="name">%s</xliff:g></string>
<string name="overwrite">Overskriv</string>
<string name="navigation">Navigasjon</string>
<string name="reset_to_default">Tilbakestill til standard</string>
<string name="reset_keyboard_shortcuts_confirm">Tilbakestill hurtigtaster til standard?</string>
<string name="open_accounts_dashboard">Åpne kontooversikt</string>
<string name="previous_tab">Forrige fane</string>
<string name="next_tab">Neste fane</string>
<string name="keyboard_shortcut_back">Tilbake</string>
<string name="press_again_to_close">Trykk igjen for å lukke</string>
<string name="name_not_set"><xliff:g id="name">%s</xliff:g> ikke valgt</string>
<string name="swipe_down_to_refresh">Sveip ned for å oppdatere</string>
<string name="app_restart_confirm">Twidere må starte på nytt for å bruke innstillingene.</string>
<string name="dont_restart">Ikke start på nytt</string>
<string name="user_list_details">Listedetaljer</string>
<string name="invalid_list_name">Må begynne på en bokstav og kan bare inneholde bokstaver, tall, «-» (bindestrek) eller «_» (understrek).</string>
<string name="delete_conversation">Slett samtale</string>
<string name="delete_conversation_confirm_message">Slette alle meldinger i denne samtalen?</string>
<string name="name_first_summary_on">Viser navnet først</string>
<string name="name_first_summary_off">Viser \@brukernavn først</string>
<string name="comment_hint">Kommenter&#8230;</string>
<string name="comment">Kommenter</string>
<string name="enable_retweets">Aktiver retweets</string>
<string name="disable_retweets">Deaktiver retweets</string>
<string name="play">Spill av</string>
<string name="pause">Pause</string>
<string name="jump_to_top">Gå til toppen</string>
<string name="timeline_streaming_running">Tidslinjen vises i sanntid</string>
<string name="streaming">Strømming</string>
<string name="enable_streaming">Aktiver strømming</string>
<string name="dark_theme">Mørkt tema</string>
<string name="wizard_hint_title_location_requirement">Posisjonstilgang</string>
<string name="wizard_hint_summary_location_requirement">Twidere trenger posisjonstillatelse for å inkludere posisjonen din i en tweet.</string>
<string name="wizard_hint_title_storage_requirement">Lagringstillatelse</string>
<string name="wizard_hint_summary_storage_requirement">Twidere trenger lagringstillatelse når du åpner dokumenter.</string>
<string name="scrapyard">Diverse</string>
<string name="crop_image">Beskjær bilde</string>
<string name="usage_label_sent">Sendt</string>
<string name="usage_label_received">Mottatt</string>
<string name="this_month">Denne måneden</string>
<string name="media_preload">Forhåndslasting av media</string>
<string name="on_mobile_network">På mobilt nettverk</string>
<string name="set_consumer_key_secret_message">Twidere er i ferd med å nå token-grensen. Opprett en app på https://apps.twitter.com/ and lime inn nøkkelen and passordet under.\nHvis du fortsetter å bruke standardnøkkelen, kan det hende du ikke får logget inn.</string>
<string name="send_at">Send den</string>
<string name="scheduled_statuses">Planlagte tweets</string>
<string name="report_usage_statistics_now">Rapporter bruksstatistikk nå</string>
<string name="cache_size_limit">Hurtiglager størrelsesgrense</string>
<string name="bug_reports">Feilrapporter</string>
<string name="invalid_consumer_key">Ugyldig forbrukernøkkel</string>
<string name="invalid_consumer_secret">Ugyldig brukerpassord</string>
<string name="page_up">Side opp</string>
<string name="page_down">Side ned</string>
<string name="combined_notifications">Kombinerte varsler</string>
<string name="combined_notifications_summary_on">Varsler grupperes</string>
<string name="combined_notifications_summary_off">Varsler vises separat</string>
<string name="save_media_no_storage_permission_message">Lagringstillatelse er nødvendig for å lagre media.</string>
<string name="select_file_no_storage_permission_message">Lagringstillatelse er nødvendig for å velge fil.</string>
<string name="user_mentioned_you"><xliff:g id="name">%s</xliff:g> omtalte deg</string>
<string name="cant_load_all_replies_message">Kan ikke laste inn alle svar. &lt;a href=\"#dialog\";&gt;Hvorfor?&lt;/a&gt;</string>
<string name="cant_load_all_replies_explanation">Grunnet Twitters begrensninger for tredjeparts-apper, har ikke Twidere adgang til svarene til en tweet. Det derfor ikke sikkert at Twidere kan laste inn disse.</string>
<string name="current_status">Gjeldende tweet</string>
<string name="twitter_optimized_searches">Twitter-optimaliserte søk</string>
<string name="twitter_optimized_searches_summary">Bruk operatorer for å forbedre søkeresultatene, f.eks. exclude:retweets</string>
<string name="copy_link">Kopier lenke</string>
</resources>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources>
<string name="error_http_407">需要代理认证</string>
<string name="error_http_407">Proxy-autentisering påkrevd</string>
</resources>

View File

@ -3,13 +3,19 @@
<resources>
<string name="error_twitter_32">Kunne ikke autentisere deg, prøv å logge inn igjen.</string>
<string name="error_twitter_34">Denne tweeten, brukeren eller siden finnes ikke.</string>
<string name="error_twitter_88">For mange forespørsler, prøv igjen senere.</string>
<string name="error_twitter_89">Din innloggingsinformasjon er feil eller har utløpt. Vennligst logg inn igjen.</string>
<string name="error_twitter_64">Kontoen din er suspendert og har ikke tilgang til denne funksjonen.</string>
<string name="error_twitter_130">Twitter er midlertidig utilgjengelig.</string>
<string name="error_twitter_131">Twitter er midlertidig utilgjengelig, prøv igjen om en stund.</string>
<string name="error_twitter_135">Vennligst sjekk om enhetens klokke er korrekt.</string>
<string name="error_twitter_136">Du har blitt blokkert av denne brukeren.</string>
<string name="error_twitter_139">Du har allerede favorittmarkert denne tweeten.</string>
<string name="error_twitter_161">Du har allerede bedt om å følge denne brukeren.</string>
<string name="error_twitter_162">Du har blitt blokkert av denne brukeren.</string>
<string name="error_twitter_172">Du har allerede lagret dette søket.</string>
<string name="error_twitter_179">Du kan ikke se denne beskyttede brukerens tweet.</string>
<string name="error_twitter_187">Du har allerede sendt denne tweeten.</string>
<string name="error_twitter_193">Bildet du laster opp er for stort.</string>
<string name="error_twitter_215">Du må gjerne logge inn igjen.</string>
<string name="error_twitter_215">Du må kanskje logge inn igjen.</string>
</resources>

View File

@ -455,7 +455,6 @@
<string name="wizard_page_welcome_import_settings">Zaimportuj ustawienia</string>
<string name="wizard_page_theme_text">Wybierz swój motyw.</string>
<string name="wizard_page_tabs_text">Dodaj karty do Twidere.\nŚledź ludzi bądź rzeczy na których Ci zależy.</string>
<string name="wizard_page_tabs_unchanged_message">Możesz dodać karty w \"Ustawienia\" - \"Karty\"</string>
<string name="wizard_page_cards_text">Ustaw wygląd tweeta.</string>
<string name="wizard_page_hints_text">Oto kilka użytecznych porad.</string>
<string name="wizard_page_finished_title">Zakończono</string>
@ -506,8 +505,6 @@
<string name="theme_background_solid">Czyste biało-czarne</string>
<string name="theme_background_transparent">Przezroczyste</string>
<string name="theme_dark_actionbar">Ciemny ActionBar</string>
<string name="wizard_hint_quote_format">Ustaw ulubiony format cytatu w \"Ustawienia\" - \"Zawartość i przechowywanie\"</string>
<string name="wizard_hint_filters">Możesz ukryć niechciane tweety w strumieniu i powiadomieniach za pomocą opcji \"Filtry\".</string>
<string name="view_replies">Zobacz odpowiedzi</string>
<string name="compact_cards">Zwarty widok tweetów</string>
<string name="compact_cards_summary">Wyświetla więcej tweetów na ekranie</string>
@ -578,7 +575,6 @@
<string name="delete_drafts_confirm">Usunąć wybrane szkice?</string>
<string name="extra_configurations">Konfiguracje dodatkowe</string>
<string name="click_item_to_config">Dotknij element aby skonfigurować</string>
<string name="dark_drawer">Ciemne menu</string>
<string name="retweets_of_me">Moje posty podane dalej</string>
<string name="from_gallery">Z galerii</string>
<string name="from_camera">Z aparatu</string>

View File

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources xmlns:tools="http://schemas.android.com/tools" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_description">Seu próprio app de Twitter</string>
<string name="compose">Escrever</string>
<string name="add_account">Adicionar uma conta</string>
<string name="settings">Configurações</string>
@ -11,7 +12,7 @@
<string name="remove_location">Remover local</string>
<string name="remove_image">Remover imagem</string>
<string name="remove_photo">Remover foto</string>
<string name="status_hint">O que está a acontecer?</string>
<string name="status_hint">O que está acontecendo?</string>
<string name="sign_up">Registrar</string>
<string name="sign_in">Fazer Login</string>
<string name="rest_base_url">REST Base URL</string>
@ -42,7 +43,9 @@
<string name="select_account">Selecione a conta</string>
<string name="username">Nome de Usuário</string>
<string name="password">Senha</string>
<string name="label_data_provider">Provedor de banco de dados do Twidere</string>
<string name="label_refresh_service">Atualizar serviço</string>
<string name="label_streaming_service">Serviço de streaming</string>
<string name="label_background_operation_service">Serviço de operação em segundo plano</string>
<string name="open_in_browser">Abrir no navegador</string>
<string name="tap_to_load_more">Toque para carregar mais</string>
@ -52,6 +55,8 @@
<string name="cancel_retweet">Cancelar retweet</string>
<string name="favorite">Favoritar</string>
<string name="unfavorite">Desfavoritar</string>
<string name="like">Curtir</string>
<string name="undo_like">Não curtir</string>
<string name="reply">Responder</string>
<string name="share">Compartilhar</string>
<string name="view_image">Imagem</string>
@ -84,20 +89,21 @@
<string name="look_and_feel">Aparência</string>
<string name="display_profile_image">Exibir a imagem de perfil</string>
<string name="image_load_summary">Desativar isso irá aumentar a velocidade de carregamento da lista e reduzir o uso de dados.</string>
<string name="in_reply_to_name">Em resposta para <xliff:g id="user_name">%s</xliff:g></string>
<string name="name_retweeted"><xliff:g id="user_name">%s</xliff:g> retweetou</string>
<string name="name_and_another_retweeted"><xliff:g id="user_name">%1$s</xliff:g> e outros retweetaram</string>
<string name="name_and_count_retweeted"><xliff:g id="user_name">%1$s</xliff:g> e <xliff:g id="retweet_count">%2$d</xliff:g> outros retweetaram</string>
<string name="in_reply_to_name">Em resposta a <xliff:g id="user_name">%s</xliff:g></string>
<string name="name_retweeted"><xliff:g id="user_name">%s</xliff:g> retweetou isso</string>
<string name="name_and_another_retweeted"><xliff:g id="user_name">%1$s</xliff:g> e outros retweetaram isso</string>
<string name="name_and_count_retweeted"><xliff:g id="user_name">%1$s</xliff:g> e outros <xliff:g id="retweet_count">%2$d</xliff:g> retweetaram isso</string>
<string name="N_retweeted_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="retweet_count">%d</xliff:g> retweet</string>
<string name="N_retweeted_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="retweet_count">%d</xliff:g> retweeta</string>
<string name="N_retweeted_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="retweet_count">%d</xliff:g> retweetou isso</string>
<string name="retweeted_by_name">Retweetado por <xliff:g id="user_name">%s</xliff:g></string>
<string name="retweeted_by_name_with_count">Retweetado por <xliff:g id="user_name">%1$s</xliff:g> e <xliff:g id="retweet_count">%2$d</xliff:g> outros</string>
<string name="retweeted_by_count">Retweetado por <xliff:g id="retweet_count">%d</xliff:g> usuários</string>
<string name="users_retweeted_this">Usuários retweetaram isso</string>
<string name="users_favorited_this">Usuários gostaram disso</string>
<string name="users_favorited_this">Usuários favoritaram isso</string>
<string name="users_liked_this">Usuários curtiram isso</string>
<string name="reply_to">Responder para <xliff:g id="user_name">%s</xliff:g></string>
<string name="quote_user">Citar <xliff:g id="user_name">%s</xliff:g></string>
<string name="time_source"><xliff:g id="time">%1$s</xliff:g> · <xliff:g id="source">%2$s</xliff:g></string>
<string name="time_source"><xliff:g id="time">%1$s</xliff:g>, via <xliff:g id="source">%2$s</xliff:g></string>
<string name="source"><xliff:g id="source">%s</xliff:g></string>
<string name="filters">Filtros</string>
<string name="users">Usuários</string>
@ -117,7 +123,7 @@
<string name="load_item_limit">Limite de itens para carregar</string>
<string name="load_item_limit_summary">Definir limite de itens por carregamento.</string>
<string name="load_more_automatically">Carregar conteúdo adicional automaticamente</string>
<string name="load_more_automatically_summary">Carregando mais conteúdo(ex. fotos, mapas, tweets) automaticamente</string>
<string name="load_more_automatically_summary">Carregar mais conteúdo (Ex.: fotos, mapas, status) automaticamente</string>
<string name="quote">Citar</string>
<string name="add_rule">Adicionar regra</string>
<string name="text_size">Tamanho do texto</string>
@ -128,6 +134,7 @@
<string name="location">Localização</string>
<string name="url">URL</string>
<string name="favorites">Favoritos</string>
<string name="likes">Curtidas</string>
<string name="name">Nome</string>
<string name="refresh">Atualizar</string>
<string name="retry">Tentar novamente</string>
@ -150,7 +157,7 @@
<string name="reported_users_for_spam">Usuários denunciados como spam.</string>
<string name="filename_hint">Nome do arquivo</string>
<string name="please_wait">Por favor, espere.</string>
<string name="saved_to_gallery">Guardado na galeria.</string>
<string name="saved_to_gallery">Salvar na galeria.</string>
<string name="proxy">Proxy</string>
<string name="http_proxy">HTTP Proxy</string>
<string name="http_proxy_summary">Usar HTTP Proxy para todas as solicitações de rede.</string>
@ -161,8 +168,8 @@
<string name="report_for_spam">Denunciar como spam</string>
<string name="twitter_mute_user">Silenciar usuário</string>
<string name="twitter_muted_users">Usuários silenciados</string>
<string name="message_user_muted">O usuário foi adicionado à lista de filtros. Você não verá tweets deste usuário em suas timelines de Home e Menções.</string>
<string name="message_users_muted">Os usuários foram adicionados à lista de filtros. Você não verá tweets destes usuários em suas timelines de Home e Menções.</string>
<string name="message_user_muted">Usuário adicionado aos filtros. Você não verá tweets deste usuário em sua timeline e lista de menções.</string>
<string name="message_users_muted">Usuários adicionados aos filtros. Você não verá tweets destes usuários em sua timeline e lista de menções.</string>
<string name="message_user_unmuted">Usuário removido da lista de filtros.</string>
<string name="inbox">Caixa de entrada</string>
<string name="load_images">Carregar imagens</string>
@ -189,7 +196,7 @@
<string name="lists">Listas</string>
<string name="users_lists">Listas do usuário</string>
<string name="lists_following_user">Listas seguindo este usuário</string>
<string name="lists_following_you">Listas a seguir-te</string>
<string name="lists_following_you">Listas te seguindo</string>
<string name="item_3_minutes">3 minutos</string>
<string name="item_5_minutes">5 minutos</string>
<string name="item_10_minutes">10 minutos</string>
@ -238,10 +245,10 @@
<string name="error_message_image_uploader_not_found">App de envio de imagem não encontrado, talvez ele tenha sido desinstalado.</string>
<string name="image_upload_format">Formato de tweet com imagem</string>
<string name="image_upload_format_summary">\"[LINK]\" = Link da imagem\n\"[TEXT]\" = Conteúdo\n(Extensão apenas)</string>
<string name="status_shortener">Tweet encurtado</string>
<string name="status_shortener_default">Nada (cancelar Envio)</string>
<string name="status_shortener">Encurtador de Tweet</string>
<string name="status_shortener_default">Nada (cancelar envio)</string>
<string name="error_message_status_too_long">Tweet muito longo.</string>
<string name="error_message_message_too_long">Mensagem demasiado longa.</string>
<string name="error_message_message_too_long">Mensagem muito longa.</string>
<string name="error_message_no_content">Nenhum conteúdo</string>
<string name="error_message_tweet_shorten_failed">Falha ao encurtar URL.</string>
<string name="error_message_tweet_shortener_not_found">Encurtador de URL não encontrado, talvez tenha sido desinstalado.</string>
@ -267,24 +274,32 @@
<string name="activities_about_me">Atividades sobre mim</string>
<string name="activities_by_friends">Atividades de amigos</string>
<string name="activity_about_me_favorite"><xliff:g id="user">%s</xliff:g> favoritou seu tweet.</string>
<string name="activity_about_me_favorite_multi"><xliff:g id="user">%1$s</xliff:g> e <xliff:g id="other">%2$s</xliff:g> favoritaram o teu tweet.</string>
<string name="activity_about_me_favorited_retweet"><xliff:g id="user">%s</xliff:g> favoritou o teu retweet.</string>
<string name="activity_about_me_favorited_retweet_multi"><xliff:g id="user">%1$s</xliff:g> e <xliff:g id="other">%2$s</xliff:g> favoritaram o teu retweet.</string>
<string name="activity_about_me_favorite_multi"><xliff:g id="user">%1$s</xliff:g> e <xliff:g id="other">%2$s</xliff:g> favoritaram o seu tweet.</string>
<string name="activity_about_me_favorited_retweet"><xliff:g id="user">%s</xliff:g> favoritou o seu retweet.</string>
<string name="activity_about_me_favorited_retweet_multi"><xliff:g id="user">%1$s</xliff:g> e <xliff:g id="other">%2$s</xliff:g> favoritaram o seu retweet.</string>
<string name="activity_about_me_follow"><xliff:g id="user">%s</xliff:g> está seguindo você.</string>
<string name="activity_about_me_follow_multi"><xliff:g id="user">%1$s</xliff:g> e <xliff:g id="other">%2$s</xliff:g> estão agora a seguir-te.</string>
<string name="activity_about_me_follow_multi"><xliff:g id="user">%1$s</xliff:g> e <xliff:g id="other">%2$s</xliff:g> estão agora te seguindo.</string>
<string name="activity_about_me_retweet"><xliff:g id="user">%s</xliff:g> retweetou seu tweet.</string>
<string name="activity_about_me_retweet_multi"><xliff:g id="user">%1$s</xliff:g> e <xliff:g id="other">%2$s</xliff:g> retweetaram o teu tweet.</string>
<string name="activity_about_me_retweeted_retweet"><xliff:g id="user">%s</xliff:g> retweetou o teu tweet.</string>
<string name="activity_about_me_retweeted_retweet_multi"><xliff:g id="user">%1$s</xliff:g> e <xliff:g id="other">%2$s</xliff:g> retweetaram o teu retweet.</string>
<string name="activity_about_me_retweet_multi"><xliff:g id="user">%1$s</xliff:g> e <xliff:g id="other">%2$s</xliff:g> retweetaram o seu tweet.</string>
<string name="activity_about_me_retweeted_retweet"><xliff:g id="user">%s</xliff:g> retweetou o seu tweet.</string>
<string name="activity_about_me_retweeted_retweet_multi"><xliff:g id="user">%1$s</xliff:g> e <xliff:g id="other">%2$s</xliff:g> retweetaram o seu retweet.</string>
<string name="activity_about_me_retweeted_mention"><xliff:g id="user">%s</xliff:g> retweetou um tweet que menciona você.</string>
<string name="activity_about_me_retweeted_mention_multi"><xliff:g id="user">%s</xliff:g> e <xliff:g id="other">%2$s</xliff:g> retweetaram um tweet que menciona você.</string>
<string name="activity_about_me_favorited_mention"><xliff:g id="user">%s</xliff:g> curtiu um tweet que menciona você.</string>
<string name="activity_about_me_favorited_mention_multi"><xliff:g id="user">%s</xliff:g> e <xliff:g id="other">%2$s</xliff:g> curtiram um tweet que menciona você.</string>
<string name="activity_about_me_liked_mention"><xliff:g id="user">%s</xliff:g> curtiu um tweet que menciona você.</string>
<string name="activity_about_me_liked_mention_multi"><xliff:g id="user">%s</xliff:g> e <xliff:g id="other">%2$s</xliff:g> curtiram um tweet que menciona você.</string>
<string name="activity_about_me_list_member_added"><xliff:g id="user">%s</xliff:g> adicionou você à lista.</string>
<string name="activity_about_me_list_member_added_with_name"><xliff:g id="user">%1$s</xliff:g> adicionou-te à lista <xliff:g id="list">%2$s</xliff:g>\".</string>
<string name="activity_about_me_list_member_added_multi"><xliff:g id="user">%1$s</xliff:g> e <xliff:g id="other">%2$s</xliff:g> adicionaram-te à lista deles.</string>
<string name="activity_about_me_list_member_added_with_name"><xliff:g id="user">%1$s</xliff:g> adicionou você à lista <xliff:g id="list">%2$s</xliff:g>\".</string>
<string name="activity_about_me_list_member_added_multi"><xliff:g id="user">%1$s</xliff:g> e <xliff:g id="other">%2$s</xliff:g> adicionaram você à lista deles.</string>
<string name="activity_by_friends_favorite"><xliff:g id="user">%1$s</xliff:g> favoritou o tweet de <xliff:g id="target">%2$s</xliff:g>.</string>
<string name="activity_by_friends_favorite_multi"><xliff:g id="user">%1$s</xliff:g> favoritou <xliff:g id="target">%2$s</xliff:g> e <xliff:g id="other">%3$s</xliff:g>\'s tweet.</string>
<string name="activity_by_friends_favorite_multi"><xliff:g id="user">%1$s</xliff:g> curtiu um tweet de <xliff:g id="target">%2$s</xliff:g> e <xliff:g id="other">%3$s</xliff:g>.</string>
<string name="activity_by_friends_follow"><xliff:g id="user">%1$s</xliff:g> agora segue <xliff:g id="target">%2$s</xliff:g>.</string>
<string name="activity_by_friends_follow_multi"><xliff:g id="user">%1$s</xliff:g> está a seguir <xliff:g id="target">%2$s</xliff:g> e <xliff:g id="other">%3$s</xliff:g>.</string>
<string name="activity_by_friends_retweet"><xliff:g id="user">%1$s</xliff:g> retweetou <xliff:g id="target">%2$s</xliff:g>.</string>
<string name="activity_by_friends_retweet_multi"><xliff:g id="user">%1$s</xliff:g> retweetou um tweets de <xliff:g id="target">%2$s</xliff:g> e <xliff:g id="other">%3$s</xliff:g>.</string>
<string name="activity_by_friends_list_member_added"><xliff:g id="user">%1$s</xliff:g> adicionou <xliff:g id="target">%2$s</xliff:g> em uma lista.</string>
<string name="activity_by_friends_list_member_added_multi"><xliff:g id="user">%1$s</xliff:g> aicionou <xliff:g id="target">%2$s</xliff:g> e <xliff:g id="other">%1$s</xliff:g> à uma lista.</string>
<string name="activity_by_friends_list_created"><xliff:g id="user">%1$s</xliff:g> criou a lista <xliff:g id="target">%2$s</xliff:g>.</string>
<string name="activity_by_friends_list_created_multi"><xliff:g id="user">%1$s</xliff:g> criou a lista <xliff:g id="target">%2$s</xliff:g> e <xliff:g id="other">%1$s</xliff:g>.</string>
<string name="status_not_updated">Tweet não enviado.</string>
@ -344,6 +359,7 @@
<string name="hashtag">Hashtag</string>
<string name="links">Links</string>
<string name="edit_profile">Editar perfil</string>
<string name="edit_details">Editar detalhes</string>
<string name="display_sensitive_contents">Exibir conteúdos sensíveis</string>
<string name="display_sensitive_contents_summary">Exibir conteúdo sensível sem avisar</string>
<string name="sensitive_content_warning">Este tweet pode ter conteúdo sensível, continuar?</string>
@ -367,7 +383,7 @@
<string name="no_thanks">Não, obrigado</string>
<string name="revoke_permissions">Remover permissões</string>
<string name="fast_scroll_thumb">Rolagem rápida</string>
<string name="indicate_your_status">Indica o teu tweet</string>
<string name="indicate_your_status">Indica o seu tweet</string>
<string name="default_ringtone">Toque padrão</string>
<string name="phishing_link_warning">Aviso de phishing</string>
<string name="phishing_link_warning_summary">Avisar quando um link numa MD possa ser uma tentativa de phishing.</string>
@ -378,10 +394,11 @@
<string name="preview_images">Visualização de imagens</string>
<string name="preload_wifi_only">Pré-Carregar apenas em Wi-Fi</string>
<string name="sign_in_method_introduction_title">Como isso funciona?</string>
<string name="sign_in_method_introduction">A maioria dos aplicativos do Twitter abrem uma página web para se logar no Twitter, isso pode se tornar inconveniente ao utilizar uma API customizada ou em redes lentas. Twidere simula um navegador comum para ajudar nesse processo. Não se preocupe, sua senha nunca será armazenada ou compartilhada.</string>
<string name="quote_protected_status_notice">Não é recomendado citar tweets de perfis protegidos.</string>
<string name="edit_draft">Editar rascunho</string>
<string name="profile_image">Imagem do perfil</string>
<string name="your_profile_image">A tua imagem de perfil</string>
<string name="your_profile_image">Sua imagem de perfil</string>
<string name="mention_user">Citar <xliff:g id="user">%s</xliff:g></string>
<string name="theme_color">Cor do tema</string>
<string name="wrong_url_format">Formato de URL incorreto.</string>
@ -404,6 +421,7 @@
<string name="search_name_deleted">Pesquisa \"<xliff:g id="name">%s</xliff:g>\" excluída.</string>
<string name="import_from">Importar de...</string>
<string name="link_to_quoted_status">Link para o tweet mencionado</string>
<string name="quote_original_status">Citar tweet original</string>
<string name="followed_user">Seguindo <xliff:g id="user">%s</xliff:g>.</string>
<string name="sent_follow_request_to_user">Solicitação de seguidor enviada para <xliff:g id="user">%s</xliff:g>.</string>
<string name="unfollowed_user">Não segue mais <xliff:g id="user">%s</xliff:g>.</string>
@ -465,9 +483,9 @@
<string name="users_statuses">Tweets do usuário</string>
<string name="card_animation">Cartão animado</string>
<string name="name_first">Exibir o nome primeiro</string>
<string name="next_step">Seguinte</string>
<string name="next_step">Próximo</string>
<string name="previous_item">Anterior</string>
<string name="next_item">Seguinte</string>
<string name="next_item">Próximo</string>
<string name="settings_wizard">Assistente de configuração</string>
<string name="wizard_page_welcome_title">Bem-vindo</string>
<string name="wizard_page_welcome_text">Obrigado por escolher o Twidere.\nO que você quer configurar agora?</string>
@ -476,9 +494,10 @@
<string name="wizard_page_welcome_import_settings">Importar configurações</string>
<string name="wizard_page_theme_text">Escolha seu tema preferido.</string>
<string name="wizard_page_tabs_text">Adicione algumas abas ao Twidere.\nMantenha o controle de perfis ou assuntos que você gosta.</string>
<string name="wizard_page_tabs_unchanged_message">Você pode adicionar abas em \"Configurações\" - \"Abas\"</string>
<string name="wizard_page_tabs_unchanged_message">Você pode adicionar abas em &quot;Configurações&quot; - &quot;Abas&quot;</string>
<string name="wizard_page_cards_text">Configurar itens do cartão.</string>
<string name="wizard_page_hints_text">Aqui estão algumas dicas úteis.</string>
<string name="wizard_page_usage_statistics_text">Twidere participa de alguns projetos de pesquisa que precisam de alguns dados de uso.</string>
<string name="wizard_page_finished_title">Concluído</string>
<string name="wizard_page_finished_text">Agora o Twidere está pronto para o uso.</string>
<string name="invalid_tab">Aba invalida</string>
@ -523,13 +542,14 @@
<string name="general">Geral</string>
<string name="hints">Dicas</string>
<string name="finish">Terminar</string>
<string name="background">Plano de fundo</string>
<string name="background">Fundo</string>
<string name="theme_background_default">Padrão</string>
<string name="theme_background_solid">Branco/Preto puro</string>
<string name="theme_background_transparent">Transparente</string>
<string name="theme_dark_actionbar">ActionBar Escura</string>
<string name="wizard_hint_quote_format">Defina seu formato de citação favorito nas \"Configurações\" - \"Conteúdo e Armazenamento\"</string>
<string name="wizard_hint_filters">Você pode ocultar tweets indesejados da linha do tempo e notificações usando \"Filtros\".</string>
<string name="wizard_hint_compose_select_account">Clique na imagem de perfil para selecionar uma conta ao escrever um tweet.</string>
<string name="wizard_hint_quote_format">Definir o seu formato preferido de citação em &quot;Configurações&quot; - &quot;Escrever&quot;</string>
<string name="wizard_hint_filters">Você pode esconder tweets indesejados da linha do tempo e notificações usando &quot;Filtros&quot;.</string>
<string name="view_replies">Ver Respostas</string>
<string name="compact_cards">Compactar cartões</string>
<string name="compact_cards_summary">Exibir mais cartões na tela</string>
@ -589,9 +609,9 @@
<string name="timeline_sync_service">Serviço de sincronização da Timeline</string>
<string name="image_preview_scale_type">Tipo de escala pré-visualização da Imagem</string>
<string name="image_preview_scale_type_crop">Cortar</string>
<string name="image_preview_scale_type_fit_center">Ajustar ao Centro</string>
<string name="quote_protected_status_warning_message">Este tweet é protegido.\n\n Protegido. Usuários normalmente não querem que os seus tweets Sejam compartilhados publicamente.</string>
<string name="send_anyway">Enviar para Todos</string>
<string name="image_preview_scale_type_fit_center">Ajustar ao centro</string>
<string name="quote_protected_status_warning_message">Este tweet é protegido.\n\n Protegido. Usuários protegidos normalmente não querem que seus tweets sejam compartilhados publicamente.</string>
<string name="send_anyway">Enviar assim mesmo</string>
<string name="following_only">Apenas quem você segue</string>
<string name="following_only_summary">Exibir notificações apenas de usuários que você segue.</string>
<string name="new_direct_message">Nova mensagem direta</string>
@ -600,11 +620,10 @@
<string name="icon_restored_message">Ícone restaurado!</string>
<string name="add">Adicionar</string>
<string name="N_media_quantity_one" tools:ignore="PluralsCandidate">Mídia de <xliff:g id="items">%d</xliff:g></string>
<string name="N_media_quantity_other" tools:ignore="PluralsCandidate">Mídia de <xliff:g id="items">%d</xliff:g></string>
<string name="N_media_quantity_other" tools:ignore="PluralsCandidate">Mídias de <xliff:g id="items">%d</xliff:g></string>
<string name="delete_drafts_confirm">Excluir rascunhos selecionados?</string>
<string name="extra_configurations">Configurações extras</string>
<string name="click_item_to_config">Clique em um item para configurar</string>
<string name="dark_drawer">Gaveta escura</string>
<string name="retweets_of_me">Retweets meus</string>
<string name="from_gallery">Da galeria</string>
<string name="from_camera">Da câmera</string>
@ -636,74 +655,89 @@
<string name="profile">Perfil</string>
<string name="listed">Listado</string>
<string name="state_blocking">Bloqueando</string>
<string name="load_more">A carregar mais</string>
<string name="load_more">Exibir mais</string>
<string name="photo">Foto</string>
<string name="camera">Câmera</string>
<string name="gallery">Galeria</string>
<string name="source_camera">Câmera</string>
<string name="source_gallery">Galeria</string>
<string name="remove">Eliminar</string>
<string name="load_media">Carregar multimédia</string>
<string name="source_clipboard">Área de transferência</string>
<string name="remove">Apagar</string>
<string name="load_media">Carregar mídia</string>
<string name="profile_text_color">Cor de texto</string>
<string name="profile_background_color">Cor de fundo</string>
<string name="profile_link_color_main_color">Cor do link (cor principal)</string>
<string name="retweet_quote_confirm_title">Retweetar para os teus seguidores?</string>
<string name="retweet_quote_confirm_title">Retweetar para os seus seguidores?</string>
<string name="font">Fonte</string>
<string name="size">Tamanho</string>
<string name="just_now">Mesmo agora</string>
<string name="just_now">Agora</string>
<string name="requested">Solicitado</string>
<string name="round">Arredondado</string>
<string name="square">Quadrado</string>
<string name="profile_image_style">Estilo da imagem de perfil</string>
<string name="media_preview_style">Estilo de previsão multimédia</string>
<string name="draft_saved">Rascunho guardado</string>
<string name="media_preview_style">Estilo de previsão de mídia</string>
<string name="draft_saved">Rascunho salvo</string>
<string name="open_twitter_links">Abrir links do Twitter</string>
<string name="N_others_quantity_one" tools:ignore="PluralsCandidate">outro</string>
<string name="N_others_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> outros</string>
<string name="type_name_to_search">Escreve nome para procurar</string>
<string name="no_user_found">Usuário não encontrado</string>
<string name="type_name_to_search">Escreva um nome para procurar</string>
<string name="no_user_found">Nenhum usuário encontrado</string>
<string name="members">Membros</string>
<string name="subscribers">Subscritor</string>
<string name="subscribers">Inscrito</string>
<string name="read_from_bottom">Ler do final</string>
<string name="read_from_bottom_summary_off">Saltar para o último tweet após atualizar</string>
<string name="register">Registar</string>
<string name="read_from_bottom_summary_on">Manter posição de leitura após atualizar</string>
<string name="register">Registrar</string>
<string name="follows">Segue</string>
<string name="belongs_to">Pertence a</string>
<string name="blocked_by_user_summary">Foste bloqueado por <xliff:g id="name">%s</xliff:g></string>
<string name="select_accounts">Seleciona a conta</string>
<string name="media_preview">Previsão multimédia</string>
<string name="edit_tabs">Editar separadores</string>
<string name="blocked_by_user_summary">Você foi bloqueado por <xliff:g id="name">%s</xliff:g></string>
<string name="select_accounts">Selecione as contas</string>
<string name="media_preview">Previsão de mídia</string>
<string name="edit_tabs">Editar abas</string>
<string name="no_location">Sem localização</string>
<string name="getting_location">Recebendo localização</string>
<string name="save_to_gallery">Guardado na galeria</string>
<string name="save_to_gallery">Salvar na galeria</string>
<string name="usage_statistics">Estatísticas de uso</string>
<string name="research_hot_mobile">Pesquisa de rede móvel por dados</string>
<string name="unknown_location">Localização desconhecida</string>
<string name="ellipsis">&#8230;</string>
<string name="import_export_settings">Importar/Exportar configurações</string>
<string name="no_tab">Sem separador</string>
<string name="user_protected_summary">Necessitas de seguir esta conta privada para ver os tweets</string>
<string name="usage_statistics_header_summary">Twidere participa de alguns projetos de pesquisa, participar desses projetos irá aperfeiçoar o Twidere e outros aplicativos.</string>
<string name="no_tab">Sem aba</string>
<string name="user_protected_summary">Você precisa enviar uma solicitação para seguir esta conta privada para ver os tweets</string>
<string name="no_account">Sem conta</string>
<string name="permission_description_shorten_status">Uma aplicação que pode encurtar tweets para o Twidere, de forma que ele possa obter o tweet à enviar.</string>
<string name="permission_description_upload_media">Uma aplicação que pode fazer upload de mídia para o Twidere, de forma que ele possa compor o tweet à enviar.</string>
<string name="permission_description_sync_timeline">Uma aplicação que pode sincronizar sua posição de leitura para o Twidere, de forma que ele possa obter a posição atual.</string>
<string name="usage_statistics_notification_summary">Ajude-nos a melhorar o Twidere!</string>
<string name="from_name">De <xliff:g id="name">%1$s</xliff:g></string>
<string name="from_name_and_name">De <xliff:g id="name">%1$s</xliff:g> y <xliff:g id="name">%2$s</xliff:g></string>
<string name="from_name_and_N_others">De <xliff:g id="name">%1$s</xliff:g> y <xliff:g id="name">%2$d</xliff:g> otros</string>
<string name="from_name_and_name">De <xliff:g id="name">%1$s</xliff:g> e <xliff:g id="name">%2$s</xliff:g></string>
<string name="from_name_and_N_others">De <xliff:g id="name">%1$s</xliff:g> e <xliff:g id="name">%2$d</xliff:g> outros</string>
<string name="projects_we_took_part">Projetos que participamos</string>
<string name="activated_accounts">Contas ativadas</string>
<string name="search">Procurar</string>
<string name="crop">Recortar</string>
<string name="scale">Escala</string>
<string name="user_type_verified">Verificado</string>
<string name="user_type_protected">Protegido</string>
<string name="tweet_hashtag">Tweet #<xliff:g id="text">%1$s</xliff:g></string>
<string name="share_status">Partilhar tweet</string>
<string name="share_status">Compartilhar tweet</string>
<string name="pebble_notifications">Notificações Pebble</string>
<string name="pebble_notifications_summary">Mandar notificações para o teu Pebble</string>
<string name="pebble_notifications_summary">Mandar notificações para o seu Pebble</string>
<string name="tweet_from_name">Tweet de <xliff:g id="text">%1$s</xliff:g></string>
<string name="permission_label_shorten_status">Encurtar tweet</string>
<string name="permission_label_upload_media">Carregar multimédia</string>
<string name="permission_label_upload_media">Carregar mídia</string>
<string name="permission_label_sync_timeline">Sincronizar timeline</string>
<string name="thumbor_integration">Integração de Thumbor</string>
<string name="server_address">Endereço do servidor</string>
<string name="security_key">Chave de segurança</string>
<string name="hide_card_actions">Esconder botões de ação</string>
<string name="N_statuses_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> tweet</string>
<string name="N_statuses_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> tweets</string>
<string name="N_favorites_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> favoritou</string>
<string name="N_favorites_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> favoritou</string>
<string name="N_likes_quantity_one" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> curtida</string>
<string name="N_likes_quantity_other" tools:ignore="PluralsCandidate"><xliff:g id="count">%d</xliff:g> curtidas</string>
<string name="drafts_hint_messages">Os teus tweets não enviados vão ser guardados aqui</string>
<string name="keyboard_shortcuts">Atalhos de teclado</string>
<string name="keyboard_shortcut_hint">Pressionar teclas</string>
@ -712,11 +746,62 @@
<string name="navigation">Navegação</string>
<string name="reset_to_default">Resetado para predefinição</string>
<string name="reset_keyboard_shortcuts_confirm">Restabelecer os atalhos do teclado para a predefinição?</string>
<string name="open_accounts_dashboard">Abrir o painel de configuração de contas</string>
<string name="previous_tab">Separador anterior</string>
<string name="next_tab">Separador seguinte</string>
<string name="keyboard_shortcut_back">Atrás</string>
<string name="press_again_to_close">Carregar outra vez para fechar</string>
<string name="name_not_set"><xliff:g id="name">%s</xliff:g> não definido</string>
<string name="swipe_down_to_refresh">Deslize para baixo para atualizar</string>
<string name="app_restart_confirm">Twidere será reiniciado para aplicar as configurações.</string>
<string name="dont_restart">Não reiniciar</string>
<string name="user_list_details">Lista de detalhes</string>
<string name="invalid_list_name">Precisa começar com uma letra e consistir em apenas letras, números, \"-\", ou \"_\".</string>
<string name="delete_conversation">Deletar conversa</string>
<string name="delete_conversation_confirm_message">Deletar todas as mensagens dessa conversa?</string>
<string name="name_first_summary_on">Exibir o nome primeiro</string>
<string name="name_first_summary_off">Exibir o \@screenname primeiro</string>
<string name="comment_hint">Comentar&#8230;</string>
<string name="comment">Comentar</string>
<string name="enable_retweets">Ativar retweets</string>
<string name="disable_retweets">Desativar retweets</string>
<string name="play">Play</string>
<string name="pause">Pause</string>
<string name="jump_to_top">Voltar ao topo</string>
<string name="timeline_streaming_running">Atualização em tempo real ativada</string>
<string name="streaming">Streaming</string>
<string name="enable_streaming">Habilitar atualização em tempo real</string>
<string name="dark_theme">Tema escuro</string>
<string name="wizard_hint_title_location_requirement">Permissão de acesso a localização</string>
<string name="wizard_hint_summary_location_requirement">Twidere necessita de acesso a sua localização ao enviar um tweet contendo a localização.</string>
<string name="wizard_hint_title_storage_requirement">Permissão de acesso ao armazenamento</string>
<string name="wizard_hint_summary_storage_requirement">Twidere precisa de acesso ao armazenamento quando você acessa documentos.</string>
<string name="scrapyard">Lixeira</string>
<string name="crop_image">Cortar imagem</string>
<string name="usage_label_sent">Enviado</string>
<string name="usage_label_received">Recebido</string>
<string name="this_month">Este mês</string>
<string name="media_preload">Pré-carregamento de mídia</string>
<string name="on_mobile_network">Na rede móvel</string>
<string name="set_consumer_key_secret_message">Os tokens de autorização gerados pelo Twidere estão se esgotando, pode ser necessário que vocẽ crie um aplicativo em https://apps.twitter.com/ e cole seu \"consumer key\" e senha abaixo.\nSe, ao invés disso, você usar a \"key default\" do Twidere, você pode não conseguir entrar.</string>
<string name="send_at">Enviado em</string>
<string name="scheduled_statuses">Tweets agendados</string>
<string name="report_usage_statistics_now">Reportar estatísticas de uso agora</string>
<string name="cache_size_limit">Limite do tamanho do cache</string>
<string name="bug_reports">Relatórios de bugs</string>
<string name="invalid_consumer_key">\"Consumer key\" inválida</string>
<string name="invalid_consumer_secret">Senha inválida da \"consumer key\"</string>
<string name="page_up">Subir</string>
<string name="page_down">Descer</string>
<string name="combined_notifications">Notificações agrupadas</string>
<string name="combined_notifications_summary_on">Notificações serão agrupadas</string>
<string name="combined_notifications_summary_off">Notificações serão apresentadas separadamente</string>
<string name="save_media_no_storage_permission_message">A permissão de acesso ao armazenamento é necessária para salvar mídia.</string>
<string name="select_file_no_storage_permission_message">A permissão de acesso ao armazenamento é necessária para selecionar um arquivo.</string>
<string name="user_mentioned_you"><xliff:g id="name">%s</xliff:g> mencionou você</string>
<string name="cant_load_all_replies_message">Não é possível carregar todas as respostas. &lt;a href=\"#dialog\";&gt;Por quê?&lt;/a&gt;</string>
<string name="cant_load_all_replies_explanation">Devido a limitação do Twitter com aplicativos de terceiros, Twidere não tem acesso às respostas a um tweet, não há nenhuma garantia de que o Twidere possa carregar todas as respostas a um tweet.</string>
<string name="current_status">Tweet atual</string>
<string name="twitter_optimized_searches">Buscas otimizadas do Twitter</string>
<string name="twitter_optimized_searches_summary">Use termos de pesquisa especiais para melhorar o resultado da busca, como excluir retweets</string>
</resources>

Some files were not shown because too many files have changed in this diff Show More