選択してコピーの画面にテーマを適用しわすれていた。発言中に記載されたステータスURLをアプリ内で開く。他アプリからIntentFilterで受け取ったステータスURLをアプリ内で開く。カラムデータのリストをArrayListより変更コストの低いものに変更

This commit is contained in:
tateisu 2017-05-10 03:21:50 +09:00
parent e756bf1c87
commit 144c42d6ed
13 changed files with 1065 additions and 389 deletions

View File

@ -153,6 +153,12 @@
<meta-data
android:name="android.max_aspect"
android:value="ratio_float"/>
<activity android:name="com.yasesprox.android.transcommusdk.TransCommuActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenSize"></activity>
<activity android:name="com.yasesprox.android.transcommusdk.LoginActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenSize"></activity>
<activity android:name="com.yasesprox.android.transcommusdk.CreateAccountActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenSize"></activity>
<activity android:name="com.yasesprox.android.transcommusdk.TranslateActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenSize"></activity>
</application>
</manifest>

View File

@ -31,6 +31,8 @@ import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import com.yasesprox.android.transcommusdk.TransCommuActivity;
import org.json.JSONException;
import org.json.JSONObject;
@ -311,7 +313,7 @@ public class ActMain extends AppCompatActivity
if( requestCode == REQUEST_APP_SETTING ){
showFooterColor();
}
super.onActivityResult( requestCode, resultCode, data );
}
@ -469,6 +471,11 @@ public class ActMain extends AppCompatActivity
}else if( id == R.id.nav_muted_word ){
startActivity( new Intent( this, ActMutedWord.class ) );
// }else if( id == R.id.nav_translation ){
// Intent intent = new Intent(this, TransCommuActivity.class);
// intent.putExtra(TransCommuActivity.APPLICATION_CODE_EXTRA, "FJlDoBKitg");
// this.startActivity(intent);
//
// Handle the camera action
// }else if( id == R.id.nav_gallery ){
//
@ -751,21 +758,71 @@ public class ActMain extends AppCompatActivity
// プロフURL
if( "https".equals( uri.getScheme() ) ){
if( uri.getPath().startsWith( "/@" ) ){
// ステータスをアプリ内で開く
Matcher m = reStatusPage.matcher( uri.toString() );
if( m.find() ){
try{
// https://mastodon.juggler.jp/@SubwayTooter/(status_id)
final String host = m.group( 1 );
final long status_id = Long.parseLong( m.group( 3 ), 10 );
ArrayList< SavedAccount > account_list_same_host = new ArrayList<>();
for( SavedAccount a : SavedAccount.loadAccountList( log ) ){
if( host.equalsIgnoreCase( a.host ) ){
account_list_same_host.add( a );
}
}
// ソートする
Collections.sort( account_list_same_host, new Comparator< SavedAccount >() {
@Override public int compare( SavedAccount a, SavedAccount b ){
return String.CASE_INSENSITIVE_ORDER.compare( AcctColor.getNickname( a.acct ), AcctColor.getNickname( b.acct ) );
}
} );
if( account_list_same_host.isEmpty() ){
account_list_same_host.add( addPseudoAccount( host ) );
}
AccountPicker.pick( this, true, true
, getString( R.string.open_status_from )
, account_list_same_host
, new AccountPicker.AccountPickerCallback() {
@Override public void onAccountPicked( final SavedAccount ai ){
openStatus( ai, status_id );
}
} );
}catch( Throwable ex ){
Utils.showToast( this, ex, "can't parse status id." );
}
return;
}
// ユーザページをアプリ内で開く
Matcher m = reUserPage.matcher( uri.toString() );
m = reUserPage.matcher( uri.toString() );
if( m.find() ){
// https://mastodon.juggler.jp/@SubwayTooter
final String host = m.group( 1 );
final String user = Uri.decode( m.group( 2 ) );
ArrayList< SavedAccount > account_list = SavedAccount.loadAccountList( log );
ArrayList< SavedAccount > account_list_same_host = new ArrayList<>();
for( SavedAccount a : account_list ){
for( SavedAccount a : SavedAccount.loadAccountList( log ) ){
if( host.equalsIgnoreCase( a.host ) ){
account_list_same_host.add( a );
}
}
// ソートする
Collections.sort( account_list_same_host, new Comparator< SavedAccount >() {
@Override public int compare( SavedAccount a, SavedAccount b ){
return String.CASE_INSENSITIVE_ORDER.compare( AcctColor.getNickname( a.acct ), AcctColor.getNickname( b.acct ) );
}
} );
if( account_list_same_host.isEmpty() ){
account_list_same_host.add( addPseudoAccount( host ) );
}
@ -1058,10 +1115,6 @@ public class ActMain extends AppCompatActivity
} );
}
public void performConversation( SavedAccount access_info, TootStatus status ){
addColumn( access_info, Column.TYPE_CONVERSATION, status.id );
}
private void performAddTimeline( boolean bAllowPseudo, final int type, final Object... args ){
AccountPicker.pick( this, bAllowPseudo, true
, getString( R.string.account_picker_add_timeline_of, Column.getColumnTypeName( this, type ) )
@ -1080,10 +1133,6 @@ public class ActMain extends AppCompatActivity
} );
}
public void openHashTag( SavedAccount access_info, String tag ){
addColumn( access_info, Column.TYPE_HASHTAG, tag );
}
public void performMuteApp( @NonNull TootApplication application ){
MutedApp.save( application.name );
for( Column column : pager_adapter.column_list ){
@ -1170,7 +1219,8 @@ public class ActMain extends AppCompatActivity
}
static final Pattern reHashTag = Pattern.compile( "\\Ahttps://([^/]+)/tags/([^?#]+)\\z" );
static final Pattern reUserPage = Pattern.compile( "\\Ahttps://([^/]+)/@([^?#]+)\\z" );
static final Pattern reUserPage = Pattern.compile( "\\Ahttps://([^/]+)/@([^?#/]+)\\z" );
static final Pattern reStatusPage = Pattern.compile( "\\Ahttps://([^/]+)/@([^?#/]+)/(\\d+)\\z" );
public void openChromeTab( final SavedAccount access_info, final String url, boolean noIntercept ){
try{
@ -1192,6 +1242,26 @@ public class ActMain extends AppCompatActivity
}
}
// ステータスページをアプリから開く
m = reStatusPage.matcher( url );
if( m.find() ){
try{
// https://mastodon.juggler.jp/@SubwayTooter/(status_id)
final String host = m.group( 1 );
final long status_id = Long.parseLong( m.group( 3 ), 10 );
if( host.equalsIgnoreCase( access_info.host ) ){
openStatus( access_info, status_id );
return;
}else{
openStatusOtherInstance( access_info, url, host, status_id );
return;
}
}catch( Throwable ex ){
Utils.showToast( this, ex, "can't parse status id." );
}
return;
}
// ユーザページをアプリ内で開く
m = reUserPage.matcher( url );
if( m.find() ){
@ -1210,6 +1280,8 @@ public class ActMain extends AppCompatActivity
} );
return;
}
}
try{
@ -1236,6 +1308,67 @@ public class ActMain extends AppCompatActivity
}
}
public void openStatus( @NonNull SavedAccount access_info, @NonNull TootStatus status ){
openStatus( access_info, status.id );
}
public void openStatus( @NonNull SavedAccount access_info, long status_id ){
addColumn( access_info, Column.TYPE_CONVERSATION, status_id );
}
private void openStatusOtherInstance( final SavedAccount access_info, final String url, final String host, final long status_id ){
ActionsDialog dialog = new ActionsDialog();
// ブラウザで表示する
dialog.addAction( getString( R.string.open_web_on_host, host ), new Runnable() {
@Override public void run(){
openChromeTab( access_info, url, true );
}
} );
// 同タンスのアカウント
ArrayList< SavedAccount > account_list = new ArrayList<>( );
for( SavedAccount a: SavedAccount.loadAccountList( log ) ){
if( host.equalsIgnoreCase( a.host ) ){
account_list.add(a);
}
}
// ソートする
Collections.sort( account_list, new Comparator< SavedAccount >() {
@Override public int compare( SavedAccount a, SavedAccount b ){
return String.CASE_INSENSITIVE_ORDER.compare( AcctColor.getNickname( a.acct ), AcctColor.getNickname( b.acct ) );
}
} );
for( SavedAccount a : account_list ){
final SavedAccount _a = a;
dialog.addAction( getString( R.string.open_in_account, a.acct ), new Runnable() {
@Override public void run(){
openStatus( _a, status_id );
}
} );
}
// アカウントがないなら疑似ホストを作る選択肢
if( account_list .isEmpty() ){
dialog.addAction( getString( R.string.open_in_pseudo_account, "?@" + host ), new Runnable() {
@Override public void run(){
SavedAccount sa = addPseudoAccount( host );
if( sa != null ){
openStatus( sa, status_id );
}
}
} );
}
dialog.show( this, getString( R.string.open_status_from ) );
}
public void openHashTag( SavedAccount access_info, String tag ){
addColumn( access_info, Column.TYPE_HASHTAG, tag );
}
// 他インスタンスのハッシュタグの表示
private void openHashTagOtherInstance( final SavedAccount access_info, final String url, final String host, final String tag ){

View File

@ -63,6 +63,7 @@ public class ActText extends AppCompatActivity implements View.OnClickListener {
@Override protected void onCreate( @Nullable Bundle savedInstanceState ){
super.onCreate( savedInstanceState );
App1.setActivityTheme( this, false );
initUI();

View File

@ -36,6 +36,7 @@ import jp.juggler.subwaytooter.table.MutedApp;
import jp.juggler.subwaytooter.table.MutedWord;
import jp.juggler.subwaytooter.table.SavedAccount;
import jp.juggler.subwaytooter.table.UserRelation;
import jp.juggler.subwaytooter.util.BucketList;
import jp.juggler.subwaytooter.util.LogCategory;
import jp.juggler.subwaytooter.util.MyListView;
import jp.juggler.subwaytooter.util.ScrollPosition;
@ -706,7 +707,7 @@ class Column {
String task_progress;
final ArrayList< Object > list_data = new ArrayList<>();
final BucketList< Object > list_data = new BucketList<>();
private static boolean hasMedia( TootStatus status ){
if( status == null ) return false;
@ -1815,9 +1816,7 @@ class Column {
}
int added = list_new.size();
list_new.addAll( list_data );
list_data.clear();
list_data.addAll( list_new );
list_data.addAll( 0, list_new );
fireShowContent();
if( status_index >= 0 && refresh_after_toot == Pref.RAT_REFRESH_SCROLL ){

View File

@ -5,14 +5,14 @@ import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import java.util.ArrayList;
import java.util.List;
import jp.juggler.subwaytooter.util.MyListView;
class ItemListAdapter extends BaseAdapter implements AdapterView.OnItemClickListener {
private final Column column;
private final ActMain activity;
private final ArrayList< Object > list;
private final List< Object > list;
ItemListAdapter( ActMain activity,Column column ){
this.activity = activity;

View File

@ -106,7 +106,7 @@ class StatusButtons implements View.OnClickListener {
if( close_window != null ) close_window.dismiss();
switch( v.getId() ){
case R.id.btnConversation:
activity.performConversation( access_info, status );
activity.openStatus( access_info, status );
break;
case R.id.btnReply:
if( access_info.isPseudo() ){

View File

@ -0,0 +1,224 @@
package jp.juggler.subwaytooter.util;
import android.support.annotation.NonNull;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.RandomAccess;
public class BucketList < E >
extends AbstractList< E >
implements Iterable< E >, RandomAccess
{
private static final int DEFAULT_BUCKET_CAPACITY = 1024;
@SuppressWarnings("WeakerAccess")
public BucketList( int initialStep ){
mStep = initialStep;
}
@SuppressWarnings("WeakerAccess")
public BucketList(){
this( DEFAULT_BUCKET_CAPACITY );
}
private static class Bucket < E > extends ArrayList< E > {
int total_start;
int total_end;
Bucket( int capacity ){
super( capacity );
}
}
private final ArrayList< Bucket< E > > groups = new ArrayList<>();
private int mSize;
private int mStep;
private void updateIndex(){
int n = 0;
for( Bucket< E > bucket : groups ){
bucket.total_start = n;
bucket.total_end = n = n + bucket.size();
}
mSize = n;
}
private static class BucketPos {
int group_index;
int bucket_index;
BucketPos(){
}
BucketPos( int gi, int bi ){
this.group_index = gi;
this.bucket_index = bi;
}
}
private static final ThreadLocal< BucketPos > pos_internal = new ThreadLocal< BucketPos >() {
@Override protected BucketPos initialValue(){
return new BucketPos();
}
};
private BucketPos findPos( BucketPos dst, int total_index ){
if( total_index < 0 || total_index >= mSize ){
throw new ArrayIndexOutOfBoundsException( "findPos: bad index=" + total_index + ", size=" + mSize );
}
// binary search
int gs = 0;
int ge = groups.size();
for( ; ; ){
int gi = ( gs + ge ) >> 1;
Bucket< E > group = groups.get( gi );
if( total_index < group.total_start ){
ge = gi;
}else if( total_index >= group.total_end ){
gs = gi + 1;
}else{
if( dst == null ) dst = new BucketPos();
dst.group_index = gi;
dst.bucket_index = total_index - group.total_start;
return dst;
}
}
}
@Override
public void clear(){
groups.clear();
mSize = 0;
}
// 末尾への追加
@Override
public boolean addAll( @NonNull Collection< ? extends E > c ){
int c_size = c.size();
if( c_size == 0 ) return false;
// 最後のバケツに収まるなら最後のバケツの中に追加する
if( groups.size() > 0 ){
Bucket< E > bucket = groups.get( groups.size() - 1 );
if( bucket.size() + c_size <= mStep ){
bucket.addAll( c );
bucket.total_end += c_size;
mSize += c_size;
return true;
}
}
// 新しいバケツを作ってそこに追加する
Bucket< E > bucket = new Bucket<>( mStep );
bucket.addAll( c );
bucket.total_start = mSize;
bucket.total_end = mSize + c_size;
mSize += c_size;
groups.add( bucket );
return true;
}
@Override
public boolean addAll( int index, @NonNull Collection< ? extends E > c ){
// indexが終端なら終端に追加する
// バケツがカラの場合もここ
if( index == mSize ){
return addAll( c );
}
int c_size = c.size();
if( c_size == 0 ) return false;
BucketPos pos = findPos( pos_internal.get(), index );
Bucket< E > bucket = groups.get( pos.group_index );
// 挿入位置がバケツの先頭ではないかバケツのサイズに問題がないなら
if( pos.bucket_index > 0 || bucket.size() + c_size <= mStep ){
// バケツの中に挿入する
bucket.addAll( pos.bucket_index, c );
}else{
// 新しいバケツを作ってそこに追加する
bucket = new Bucket<>( mStep );
bucket.addAll( c );
groups.add( pos.group_index, bucket );
}
updateIndex();
return true;
}
public E remove( int index ){
BucketPos pos = findPos( pos_internal.get(), index );
Bucket< E > bucket = groups.get( pos.group_index );
E data = bucket.remove( pos.bucket_index );
updateIndex();
return data;
}
public int size(){
return mSize;
}
public boolean isEmpty(){
return 0 == mSize;
}
public E get( int idx ){
BucketPos pos = findPos( pos_internal.get(), idx );
return groups.get( pos.group_index ).get( pos.bucket_index );
}
private class MyIterator implements Iterator< E > {
private final BucketPos pos; // indicates next read point
MyIterator(){
pos = new BucketPos( 0, 0 );
}
@Override public boolean hasNext(){
for( ; ; ){
if( pos.group_index >= groups.size() ){
return false;
}
Bucket< E > bucket = groups.get( pos.group_index );
if( pos.bucket_index >= bucket.size() ){
pos.bucket_index = 0;
++ pos.group_index;
continue;
}
return true;
}
}
@Override public E next(){
for( ; ; ){
if( pos.group_index >= groups.size() ){
throw new NoSuchElementException();
}
Bucket< E > bucket = groups.get( pos.group_index );
if( pos.bucket_index >= bucket.size() ){
pos.bucket_index = 0;
++ pos.group_index;
continue;
}
return bucket.get( pos.bucket_index++ );
}
}
@Override public void remove(){
throw new UnsupportedOperationException();
}
}
@NonNull @Override public Iterator< E > iterator(){
return new MyIterator();
}
}

View File

@ -26,6 +26,7 @@
android:layout_height="32dp"
android:layout_marginEnd="4dp"
android:scaleType="fitEnd"
android:importantForAccessibility="no"
/>
<LinearLayout
@ -156,11 +157,11 @@
</LinearLayout>
<RelativeLayout
<LinearLayout
android:id="@+id/llStatus"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:orientation="vertical"
>
<LinearLayout
@ -197,274 +198,279 @@
</LinearLayout>
<jp.juggler.subwaytooter.util.MyNetworkImageView
android:id="@+id/ivThumbnail"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_below="@id/llTime"
android:layout_marginEnd="4dp"
android:layout_marginTop="4dp"
android:background="@drawable/btn_bg_transparent"
android:contentDescription="@string/thumbnail"
android:scaleType="centerCrop"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/llTime"
android:layout_toEndOf="@id/ivThumbnail"
android:orientation="vertical"
android:orientation="horizontal"
>
<TextView
android:id="@+id/tvName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textStyle="bold"
tools:text="Displayname @username"
<jp.juggler.subwaytooter.util.MyNetworkImageView
android:id="@+id/ivThumbnail"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginEnd="4dp"
android:layout_marginTop="4dp"
android:background="@drawable/btn_bg_transparent"
android:contentDescription="@string/thumbnail"
android:scaleType="centerCrop"
/>
<LinearLayout
android:id="@+id/llContentWarning"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:baselineAligned="false"
android:gravity="center_vertical"
android:orientation="horizontal"
android:orientation="vertical"
>
<Button
android:id="@+id/btnContentWarning"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_marginEnd="8dp"
android:background="@drawable/btn_bg_ddd"
android:minWidth="40dp"
android:padding="4dp"
tools:text="見る"
<TextView
android:id="@+id/tvName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textStyle="bold"
tools:text="Displayname @username"
/>
<LinearLayout
android:layout_width="0dp"
android:id="@+id/llContentWarning"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:baselineAligned="false"
android:gravity="center_vertical"
android:orientation="horizontal"
>
<Button
android:id="@+id/btnContentWarning"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_marginEnd="8dp"
android:background="@drawable/btn_bg_ddd"
android:minWidth="40dp"
android:padding="4dp"
tools:text="見る"
/>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
>
<jp.juggler.subwaytooter.util.MyTextView
android:id="@+id/tvMentions"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<jp.juggler.subwaytooter.util.MyTextView
android:id="@+id/tvContentWarning"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/llContents"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
>
<jp.juggler.subwaytooter.util.MyTextView
android:id="@+id/tvMentions"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<jp.juggler.subwaytooter.util.MyTextView
android:id="@+id/tvContentWarning"
android:id="@+id/tvContent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:lineSpacingMultiplier="1.1"
tools:text="Contents\nContents"
/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/llContents"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<jp.juggler.subwaytooter.util.MyTextView
android:id="@+id/tvContent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:lineSpacingMultiplier="1.1"
tools:text="Contents\nContents"
/>
<FrameLayout
android:id="@+id/flMedia"
android:layout_width="match_parent"
android:layout_height="64dp"
android:layout_marginTop="3dp"
>
<LinearLayout
<FrameLayout
android:id="@+id/flMedia"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:layout_height="64dp"
android:layout_marginTop="3dp"
>
<jp.juggler.subwaytooter.util.MyNetworkImageView
android:id="@+id/ivMedia1"
android:layout_width="0dp"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/btn_bg_ddd"
android:contentDescription="@string/thumbnail"
android:scaleType="centerCrop"
/>
android:orientation="horizontal"
>
<jp.juggler.subwaytooter.util.MyNetworkImageView
android:id="@+id/ivMedia2"
android:layout_width="0dp"
<jp.juggler.subwaytooter.util.MyNetworkImageView
android:id="@+id/ivMedia1"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/btn_bg_ddd"
android:contentDescription="@string/thumbnail"
android:scaleType="centerCrop"
/>
<jp.juggler.subwaytooter.util.MyNetworkImageView
android:id="@+id/ivMedia2"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="8dp"
android:layout_weight="1"
android:background="@drawable/btn_bg_ddd"
android:contentDescription="@string/thumbnail"
android:scaleType="centerCrop"
/>
<jp.juggler.subwaytooter.util.MyNetworkImageView
android:id="@+id/ivMedia3"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="8dp"
android:layout_weight="1"
android:background="@drawable/btn_bg_ddd"
android:contentDescription="@string/thumbnail"
android:scaleType="centerCrop"
/>
<jp.juggler.subwaytooter.util.MyNetworkImageView
android:id="@+id/ivMedia4"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="8dp"
android:layout_weight="1"
android:background="@drawable/btn_bg_ddd"
android:contentDescription="@string/thumbnail"
android:scaleType="centerCrop"
/>
<ImageButton
android:id="@+id/btnHideMedia"
android:layout_width="32dp"
android:layout_height="match_parent"
android:layout_marginStart="8dp"
android:background="@drawable/btn_bg_transparent"
android:contentDescription="@string/hide"
android:src="?attr/btn_close"
/>
</LinearLayout>
<TextView
android:id="@+id/btnShowMedia"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="8dp"
android:layout_weight="1"
android:background="@drawable/btn_bg_ddd"
android:contentDescription="@string/thumbnail"
android:scaleType="centerCrop"
android:background="?attr/colorShowMediaBackground"
android:gravity="center"
android:text="@string/tap_to_show"
android:textColor="?attr/colorShowMediaText"
/>
</FrameLayout>
</LinearLayout>
<jp.juggler.subwaytooter.util.MyNetworkImageView
android:id="@+id/ivMedia3"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="8dp"
android:layout_weight="1"
android:background="@drawable/btn_bg_ddd"
android:contentDescription="@string/thumbnail"
android:scaleType="centerCrop"
/>
<jp.juggler.subwaytooter.util.MyNetworkImageView
android:id="@+id/ivMedia4"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="8dp"
android:layout_weight="1"
android:background="@drawable/btn_bg_ddd"
android:contentDescription="@string/thumbnail"
android:scaleType="centerCrop"
/>
<ImageButton
android:id="@+id/btnHideMedia"
android:layout_width="32dp"
android:layout_height="match_parent"
android:layout_marginStart="8dp"
android:background="@drawable/btn_bg_transparent"
android:contentDescription="@string/hide"
android:src="?attr/btn_close"
/>
</LinearLayout>
<TextView
android:id="@+id/btnShowMedia"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/colorShowMediaBackground"
android:gravity="center"
android:text="@string/tap_to_show"
android:textColor="?attr/colorShowMediaText"
/>
</FrameLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="3dp"
android:orientation="horizontal"
>
<ImageButton
android:id="@+id/btnConversation"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="@drawable/btn_bg_transparent"
android:contentDescription="@string/conversation_view"
android:minWidth="40dp"
android:src="?attr/ic_conversation"
/>
<ImageButton
android:id="@+id/btnReply"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="2dp"
android:background="@drawable/btn_bg_transparent"
android:contentDescription="@string/reply"
android:minWidth="40dp"
android:src="?attr/btn_reply"
/>
<Button
android:id="@+id/btnBoost"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="2dp"
android:background="@drawable/btn_bg_transparent"
android:drawablePadding="4dp"
android:minWidth="48dp"
android:paddingEnd="4dp"
android:paddingStart="4dp"
/>
<Button
android:id="@+id/btnFavourite"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="2dp"
android:background="@drawable/btn_bg_transparent"
android:drawablePadding="4dp"
android:minWidth="48dp"
android:paddingEnd="4dp"
android:paddingStart="4dp"
/>
<FrameLayout
android:id="@+id/llFollow2"
android:layout_width="40dp"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginStart="2dp"
android:layout_marginTop="3dp"
android:orientation="horizontal"
>
<ImageButton
android:id="@+id/btnFollow2"
android:layout_width="match_parent"
android:id="@+id/btnConversation"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="@drawable/btn_bg_transparent"
android:contentDescription="@string/follow"
android:scaleType="center"
tools:src="?attr/ic_follow_plus"
android:contentDescription="@string/conversation_view"
android:minWidth="40dp"
android:src="?attr/ic_conversation"
/>
<ImageView
android:id="@+id/ivFollowedBy2"
android:layout_width="match_parent"
<ImageButton
android:id="@+id/btnReply"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:scaleType="center"
android:src="?attr/ic_followed_by"
tools:ignore="ContentDescription"
android:layout_marginStart="2dp"
android:background="@drawable/btn_bg_transparent"
android:contentDescription="@string/reply"
android:minWidth="40dp"
android:src="?attr/btn_reply"
/>
</FrameLayout>
<ImageButton
android:id="@+id/btnMore"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="2dp"
android:background="@drawable/btn_bg_transparent"
android:contentDescription="@string/more"
android:minWidth="40dp"
android:src="?attr/btn_more"
<Button
android:id="@+id/btnBoost"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="2dp"
android:background="@drawable/btn_bg_transparent"
android:drawablePadding="4dp"
android:minWidth="48dp"
android:paddingEnd="4dp"
android:paddingStart="4dp"
/>
<Button
android:id="@+id/btnFavourite"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="2dp"
android:background="@drawable/btn_bg_transparent"
android:drawablePadding="4dp"
android:minWidth="48dp"
android:paddingEnd="4dp"
android:paddingStart="4dp"
/>
<FrameLayout
android:id="@+id/llFollow2"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginStart="2dp"
>
<ImageButton
android:id="@+id/btnFollow2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/btn_bg_transparent"
android:contentDescription="@string/follow"
android:scaleType="center"
tools:src="?attr/ic_follow_plus"
/>
<ImageView
android:id="@+id/ivFollowedBy2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="center"
android:src="?attr/ic_followed_by"
tools:ignore="ContentDescription"
/>
</FrameLayout>
<ImageButton
android:id="@+id/btnMore"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="2dp"
android:background="@drawable/btn_bg_transparent"
android:contentDescription="@string/more"
android:minWidth="40dp"
android:src="?attr/btn_more"
/>
</LinearLayout>
<TextView
android:id="@+id/tvApplication"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end"
/>
</LinearLayout>
<TextView
android:id="@+id/tvApplication"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end"
/>
</LinearLayout>
</RelativeLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/llSearchTag"

View File

@ -24,6 +24,7 @@
android:layout_height="32dp"
android:layout_marginEnd="4dp"
android:scaleType="fitEnd"
android:importantForAccessibility="no"
/>
<LinearLayout
@ -153,11 +154,11 @@
</LinearLayout>
<RelativeLayout
<LinearLayout
android:id="@+id/llStatus"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:orientation="vertical"
android:layout_marginBottom="3dp"
>
@ -194,175 +195,180 @@
</LinearLayout>
<jp.juggler.subwaytooter.util.MyNetworkImageView
android:id="@+id/ivThumbnail"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_below="@id/llTime"
android:layout_marginEnd="4dp"
android:layout_marginTop="4dp"
android:background="@drawable/btn_bg_transparent"
android:contentDescription="@string/thumbnail"
android:scaleType="centerCrop"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/llTime"
android:layout_toEndOf="@id/ivThumbnail"
android:orientation="vertical"
android:orientation="horizontal"
>
<TextView
android:id="@+id/tvName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textStyle="bold"
tools:text="Displayname @username"
<jp.juggler.subwaytooter.util.MyNetworkImageView
android:id="@+id/ivThumbnail"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginEnd="4dp"
android:layout_marginTop="4dp"
android:background="@drawable/btn_bg_transparent"
android:contentDescription="@string/thumbnail"
android:scaleType="centerCrop"
/>
<LinearLayout
android:id="@+id/llContentWarning"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:baselineAligned="false"
android:gravity="center_vertical"
android:orientation="horizontal"
>
<Button
android:id="@+id/btnContentWarning"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_marginEnd="8dp"
android:background="@drawable/btn_bg_ddd"
android:minWidth="40dp"
android:padding="4dp"
tools:text="見る"
/>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
>
<jp.juggler.subwaytooter.util.MyTextView
android:id="@+id/tvMentions"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<jp.juggler.subwaytooter.util.MyTextView
android:id="@+id/tvContentWarning"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/llContents"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<jp.juggler.subwaytooter.util.MyTextView
android:id="@+id/tvContent"
<TextView
android:id="@+id/tvName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textStyle="bold"
tools:text="Displayname @username"
/>
<LinearLayout
android:id="@+id/llContentWarning"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:lineSpacingMultiplier="1.1"
tools:text="Contents\nContents"
/>
<FrameLayout
android:id="@+id/flMedia"
android:layout_width="match_parent"
android:layout_height="64dp"
android:layout_marginTop="3dp"
android:baselineAligned="false"
android:gravity="center_vertical"
android:orientation="horizontal"
>
<Button
android:id="@+id/btnContentWarning"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_marginEnd="8dp"
android:background="@drawable/btn_bg_ddd"
android:minWidth="40dp"
android:padding="4dp"
tools:text="見る"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
>
<jp.juggler.subwaytooter.util.MyNetworkImageView
android:id="@+id/ivMedia1"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/btn_bg_ddd"
android:contentDescription="@string/thumbnail"
android:scaleType="centerCrop"
<jp.juggler.subwaytooter.util.MyTextView
android:id="@+id/tvMentions"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<jp.juggler.subwaytooter.util.MyNetworkImageView
android:id="@+id/ivMedia2"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="8dp"
android:layout_weight="1"
android:background="@drawable/btn_bg_ddd"
android:contentDescription="@string/thumbnail"
android:scaleType="centerCrop"
/>
<jp.juggler.subwaytooter.util.MyNetworkImageView
android:id="@+id/ivMedia3"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="8dp"
android:layout_weight="1"
android:background="@drawable/btn_bg_ddd"
android:contentDescription="@string/thumbnail"
android:scaleType="centerCrop"
/>
<jp.juggler.subwaytooter.util.MyNetworkImageView
android:id="@+id/ivMedia4"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="8dp"
android:layout_weight="1"
android:background="@drawable/btn_bg_ddd"
android:contentDescription="@string/thumbnail"
android:scaleType="centerCrop"
/>
<ImageButton
android:id="@+id/btnHideMedia"
android:layout_width="32dp"
android:layout_height="match_parent"
android:layout_marginStart="8dp"
android:background="@drawable/btn_bg_transparent"
android:contentDescription="@string/hide"
android:src="?attr/btn_close"
<jp.juggler.subwaytooter.util.MyTextView
android:id="@+id/tvContentWarning"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
/>
</LinearLayout>
<TextView
android:id="@+id/btnShowMedia"
</LinearLayout>
<LinearLayout
android:id="@+id/llContents"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<jp.juggler.subwaytooter.util.MyTextView
android:id="@+id/tvContent"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/colorShowMediaBackground"
android:gravity="center"
android:text="@string/tap_to_show"
android:textColor="?attr/colorShowMediaText"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:lineSpacingMultiplier="1.1"
tools:text="Contents\nContents"
/>
</FrameLayout>
<FrameLayout
android:id="@+id/flMedia"
android:layout_width="match_parent"
android:layout_height="64dp"
android:layout_marginTop="3dp"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
>
<jp.juggler.subwaytooter.util.MyNetworkImageView
android:id="@+id/ivMedia1"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/btn_bg_ddd"
android:contentDescription="@string/thumbnail"
android:scaleType="centerCrop"
/>
<jp.juggler.subwaytooter.util.MyNetworkImageView
android:id="@+id/ivMedia2"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="8dp"
android:layout_weight="1"
android:background="@drawable/btn_bg_ddd"
android:contentDescription="@string/thumbnail"
android:scaleType="centerCrop"
/>
<jp.juggler.subwaytooter.util.MyNetworkImageView
android:id="@+id/ivMedia3"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="8dp"
android:layout_weight="1"
android:background="@drawable/btn_bg_ddd"
android:contentDescription="@string/thumbnail"
android:scaleType="centerCrop"
/>
<jp.juggler.subwaytooter.util.MyNetworkImageView
android:id="@+id/ivMedia4"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="8dp"
android:layout_weight="1"
android:background="@drawable/btn_bg_ddd"
android:contentDescription="@string/thumbnail"
android:scaleType="centerCrop"
/>
<ImageButton
android:id="@+id/btnHideMedia"
android:layout_width="32dp"
android:layout_height="match_parent"
android:layout_marginStart="8dp"
android:background="@drawable/btn_bg_transparent"
android:contentDescription="@string/hide"
android:src="?attr/btn_close"
/>
</LinearLayout>
<TextView
android:id="@+id/btnShowMedia"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/colorShowMediaBackground"
android:gravity="center"
android:text="@string/tap_to_show"
android:textColor="?attr/colorShowMediaText"
/>
</FrameLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</RelativeLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/llSearchTag"

View File

@ -107,6 +107,11 @@
android:icon="?attr/ic_info"
android:title="@string/app_about"/>
<!--<item-->
<!--android:id="@+id/nav_translation"-->
<!--android:icon="?attr/ic_info"-->
<!--android:title="@string/help_translation"/>-->
<item
android:id="@+id/nav_oss_license"
android:icon="?attr/ic_info"

View File

@ -300,5 +300,7 @@
<string name="footer_color">Footer color</string>
<string name="tab_background_color">Tab background color</string>
<string name="tab_divider_color">Tab divider color</string>
<string name="help_translation">Help translation</string>
<string name="open_status_from">Open status from</string>
</resources>

View File

@ -1,299 +1,591 @@
<resources>
<!---->
<string name="app_name">Subway Tooter</string>
<!---->
<string name="action_settings">設定</string>
<!---->
<string name="account_add">アカウントの追加</string>
<!---->
<string name="instance">インスタンス</string>
<!---->
<string name="user_mail_address">メールアドレス</string>
<!---->
<string name="user_password">パスワード</string>
<!---->
<string name="ok">OK</string>
<!---->
<string name="cancel">キャンセル</string>
<!---->
<string name="instance_not_specified">インスタンスを指定してください</string>
<!---->
<string name="mail_not_specified">メールを指定してください</string>
<!---->
<string name="password_not_specified">パスワードを指定してください</string>
<!---->
<string name="network_error">通信エラー</string>
<!---->
<string name="network_error_arg">応答エラー %1$s</string>
<!---->
<string name="api_error">APIエラー %1$s</string>
<!---->
<string name="register_app_to_server">%1$sにこのアプリを登録しています…</string>
<!---->
<string name="request_access_token">アクセストークンの取得中…</string>
<!---->
<string name="request_api">取得中… %1$s</string>
<!---->
<string name="column_empty">左下のメニューボタンを押してアカウントまたはカラムを追加してください</string>
<!---->
<string name="home">ホーム</string>
<!---->
<string name="local_timeline">ローカルタイムライン</string>
<!---->
<string name="federate_timeline">連合タイムライン</string>
<!---->
<string name="login_required">アカウントの設定からアクセストークンの更新を行ってください</string>
<!---->
<string name="cancelled">キャンセルされました</string>
<!---->
<string name="account_pick">アカウントの選択</string>
<!---->
<string name="account_confirmed">アカウントを確認できました</string>
<!---->
<string name="reply">返信</string>
<!---->
<string name="more">その他</string>
<!---->
<string name="close_column">カラムを閉じる</string>
<!---->
<string name="thumbnail">サムネイル</string>
<!---->
<string name="reload">再読み込み</string>
<!---->
<string name="favourites">お気に入り</string>
<!---->
<string name="notifications">通知</string>
<!---->
<string name="reports">通報</string>
<!---->
<string name="your_statuses">あなたの発言</string>
<!---->
<string name="statuses_of">%1$s の発言</string>
<!---->
<string name="follow">フォロー</string>
<!---->
<string name="following">フォロー中</string>
<!---->
<string name="followers">フォロワー</string>
<!---->
<string name="statuses">発言</string>
<!---->
<string name="hide">隠す</string>
<!---->
<string name="nsfw">NSFW</string>
<!---->
<string name="tap_to_show">タップで表示</string>
<!---->
<string name="show">見る</string>
<!---->
<string name="act_post">Tootの送信</string>
<!---->
<string name="content_warning">コンテントワーニング</string>
<!---->
<string name="please_add_account">アカウントがありません。事前にアカウントの追加を行ってください</string>
<!---->
<string name="not_selected">(未選択)</string>
<!---->
<string name="content_warning_hint">コンテントワーニングをここに入力</string>
<!---->
<string name="content_hint">発言の本文をここに入力</string>
<!---->
<string name="status">ステータス</string>
<!---->
<string name="list_empty">リストは空です</string>
<!---->
<string name="post_from">発言者</string>
<!---->
<string name="choose_account">アカウントの選択</string>
<!---->
<string name="response_not_json">APIの応答がJSONではありません</string>
<!---->
<string name="attachment_too_many">最大4個までです</string>
<!---->
<string name="account_select_please">アカウントを選択してください</string>
<!---->
<string name="login_failed">ログインに失敗</string>
<!---->
<string name="file_size_too_big">最大8MBまでです</string>
<!---->
<string name="visibility_public">公開</string>
<!---->
<string name="visibility_unlisted">未収載</string>
<!---->
<string name="visibility_private">非公開</string>
<!---->
<string name="visibility_direct">ダイレクト</string>
<!---->
<string name="choose_visibility">公開範囲の選択</string>
<!---->
<string name="confirm_delete_attachment">この添付データを除去しますか?</string>
<!---->
<string name="post_error_contents_empty">発言の本文を入力してください</string>
<!---->
<string name="post_error_contents_warning_empty">コンテントワーニングを入力してください</string>
<!---->
<string name="wait_previous_operation">直前の操作が完了するまでお待ちください</string>
<!---->
<string name="cant_remove_boost_while_favourited">お気に入りを外さないとブーストを外せません?</string>
<!---->
<string name="confirm">確認</string>
<!---->
<string name="confirm_boost_from">この発言を %1$s からブーストしますか? 全てのフォロワーとあなたのプロフィールページに公開されます</string>
<!---->
<string name="display_name_favourited_by">%1$sがお気に入りに追加しました</string>
<!---->
<string name="display_name_boosted_by">%1$sがブーストしました</string>
<!---->
<string name="display_name_replied_by">%1$sからの返信</string>
<!---->
<string name="display_name_followed_by">%1$sにフォローされました</string>
<!---->
<string name="account">アカウント</string>
<!---->
<string name="account_setting">アカウントの設定</string>
<!---->
<string name="setting">設定</string>
<!---->
<string name="app_setting">アプリの設定</string>
<!---->
<string name="column_list">カラム一覧</string>
<!---->
<string name="update_access_token">アクセストークンの更新</string>
<!---->
<string name="account_remove">アカウントの削除</string>
<!---->
<string name="actions">操作</string>
<!---->
<string name="default_status_visibility">発言の公開範囲の既定値</string>
<!---->
<string name="confirm_before_boost">ブースト前に確認</string>
<!---->
<string name="sensitive_content_default_open">NSFWな添付データを隠さない</string>
<!---->
<string name="user">ユーザ</string>
<!---->
<string name="confirm_account_remove">アカウントをこのアプリから除去しますか?関連するカラムはすべて除去されます</string>
<!---->
<string name="user_name_not_match">ユーザ名が一致しません</string>
<!---->
<string name="access_token_updated_for">%1$sのアクセストークンを更新しました</string>
<!---->
<string name="back_to_column_list">戻るボタンでカラム一覧を開く</string>
<!---->
<string name="account_empty">先にアカウントの追加を行ってください</string>
<!---->
<string name="dont_confirm_before_close_column">確認なしでカラムを閉じる</string>
<!---->
<string name="drag_handle">並べ替え用のつまみ</string>
<!---->
<string name="delete">削除</string>
<!---->
<string name="column_list_desc">スワイプで削除します。並べ替えと削除は戻るまたは選択した時に反映されます</string>
<!---->
<string name="last_selection">最後に選択した</string>
<!---->
<string name="column_index">%1$d/%2$d</string>
<!---->
<string name="reply_to_this_status">この発言への返信:</string>
<!---->
<string name="cant_change_account_when_attachment_specified">添付ファイルがある状態ではアカウントを変更できません</string>
<!---->
<string name="column">カラム</string>
<!---->
<string name="conversation_view">会話ビュー</string>
<!---->
<string name="conversation_around">会話の流れ(id:%1$d)</string>
<!---->
<string name="instance_not_need_slash">インスタンスには\'/\'を含めずに、ホスト名だけを指定してください</string>
<!---->
<string name="mail_address_not_contains_at_mark">メールアドレスが不十分です。\'@\'や\'.\'がありません</string>
<!---->
<string name="instance_hint">例: mastodon.social</string>
<!---->
<string name="mail_hint">例: your@e-mail.address</string>
<!---->
<string name="unfollow">フォロー解除</string>
<!---->
<string name="follow_succeeded">フォローできました</string>
<!---->
<string name="unfollow_succeeded">フォロー解除できました</string>
<!---->
<string name="mute">ミュート</string>
<!---->
<string name="unmute">ミュート解除</string>
<!---->
<string name="block">ブロック</string>
<!---->
<string name="unblock">ブロック解除</string>
<!---->
<string name="report">通報</string>
<!---->
<string name="cant_follow_locked_user">鍵つきユーザをフォローできません</string>
<!---->
<string name="unmute_succeeded">ミュート解除できました</string>
<!---->
<string name="mute_succeeded">ミュートできました</string>
<!---->
<string name="unblock_succeeded">ブロック解除できました</string>
<!---->
<string name="block_succeeded">ブロックできました</string>
<!---->
<string name="report_reason">通報する理由を書いてください</string>
<!---->
<string name="comment_empty">通報する理由を書いてください</string>
<!---->
<string name="report_completed">通報できました</string>
<!---->
<string name="mention">この人への発言</string>
<!---->
<string name="hashtag_of">ハッシュタグ #%1$s</string>
<!---->
<string name="open_in_account">%1$sから開く</string>
<!---->
<string name="open_web_page">Webページを開く</string>
<!---->
<string name="open_web_on_host">%1$sのWebページを開く</string>
<!---->
<string name="search_of">検索:%1$s</string>
<!---->
<string name="search">検索</string>
<!---->
<string name="resolve_non_local_account">他タンスのアカウントも探す</string>
<!---->
<string name="question">\?</string>
<!---->
<string name="confirm_close_column">このカラムを閉じますか?</string>
<!---->
<string name="follow_from_another_account">別のアカウントでフォロー</string>
<!---->
<string name="favourite_from_another_account"> (同タンスの)別アカウントでお気に入り</string>
<!---->
<string name="boost_from_another_account">(同タンスの)別アカウントでブースト</string>
<!---->
<string name="app_about">このアプリについて</string>
<!---->
<string name="please_rate">ストアで評価やレビューをお願いします!</string>
<!---->
<string name="rate_on_store">ストアで評価</string>
<!---->
<string name="please_donate">開発継続のために寄付をお願いします!</string>
<!---->
<string name="version_is">バージョン %1$s</string>
<!---->
<string name="oss_license">OSSライセンス</string>
<!---->
<string name="open_instance_website">https://%1$s/ を開く</string>
<!---->
<string name="mention2">返信</string>
<!---->
<string name="notification_count">%1$d件の通知</string>
<!---->
<string name="boost">ブースト</string>
<!---->
<string name="favourite">お気に入り</string>
<!---->
<string name="app_exit">アプリを終了</string>
<!---->
<string name="ask_always">毎回尋ねる</string>
<!---->
<string name="open_column_list">カラム一覧を開く</string>
<!---->
<string name="back_button_action">戻るボタンの動作</string>
<!---->
<string name="prior_local_url_when_open_attachment">添付画像を開く時に自タンスURLを重視</string>
<!---->
<string name="disable_fast_scroller">FastScrollerを無効にする(アプリ再起動が必要)</string>
<!---->
<string name="delete_succeeded">削除できました</string>
<!---->
<string name="developer">開発者</string>
<!---->
<string name="with_attachment">添付データあり</string>
<!---->
<string name="read_gap">ギャップを読む</string>
<!---->
<string name="column_is_busy">別の処理を行っています</string>
<!---->
<string name="blocked_users">ブロックしたユーザ</string>
<!---->
<string name="end_of_list">リストの終端</string>
<!---->
<string name="muted_users">ミュートしたユーザ</string>
<!---->
<string name="send_text">テキストをアプリに送る</string>
<!---->
<string name="send_header_date">Date</string>
<!---->
<string name="send_header_from_acct">From-Acct</string>
<!---->
<string name="send_header_from_name">From-Name</string>
<!---->
<string name="send_header_content_warning">Content-Warning</string>
<!---->
<string name="send_header_url">Status-URL</string>
<!---->
<string name="column_has_dont_close_option">保護されたカラムは閉じられません</string>
<!---->
<string name="dont_close_column">保護(カラムを閉じない)</string>
<!---->
<string name="theme_dark">暗い</string>
<!---->
<string name="theme_light">明るい</string>
<!---->
<string name="ui_theme">UIテーマ(アプリ再起動が必要)</string>
<!---->
<string name="dont_show_boost">ブーストを表示しない</string>
<!---->
<string name="dont_show_reply">返信を表示しない</string>
<!---->
<string name="regex_error">正規表現エラー</string>
<!---->
<string name="regex_filter">正規表現フィルタ(上級者向け)</string>
<!---->
<string name="confirm_delete_notification">ユーザへの通知データがタンスのサーバから削除されます。よろしいですか?</string>
<!---->
<string name="notification_delete">通知の削除</string>
<!---->
<string name="search_for">%1$s を検索</string>
<!---->
<string name="spoil_visibility_for_account">公開範囲をアカウントの既定値に狭めました</string>
<!---->
<string name="contributor">contributor</string>
<!---->
<string name="thanks_for">Thanks for %1$s</string>
<!---->
<string name="simple_list">簡略表示(アプリ再起動が必要)</string>
<!---->
<string name="app_was_muted">アプリはミュートされます</string>
<!---->
<string name="application_is">アプリ: %1$s</string>
<!---->
<string name="boost_succeeded">ブーストできました</string>
<!---->
<string name="favourite_succeeded">お気に入りにしました</string>
<!---->
<string name="mute_app_desc">スワイプで解除。解除した後はカラムをリロードすると再表示されます</string>
<!---->
<string name="mute_app_of">\"%1$s\" アプリをミュート</string>
<!---->
<string name="muted_app">ミュートしたアプリ</string>
<!---->
<string name="follow_request_authorized">%1$s からのフォローリクエストを許可しました</string>
<!---->
<string name="follow_request_ng">フォローリクエストの却下</string>
<!---->
<string name="follow_request_ok">フォローリクエストの許可</string>
<!---->
<string name="follow_request_rejected">%1$s からのフォローリクエストを却下しました</string>
<!---->
<string name="follow_requests">フォローリクエスト一覧</string>
<!---->
<string name="led">LED</string>
<!---->
<string name="notification_option">通知オプション</string>
<!---->
<string name="sound"></string>
<!---->
<string name="vibration">振動</string>
<!---->
<string name="close">閉じる</string>
<!---->
<string name="not_available_for_pseudo_account">疑似アカウントでは利用できません</string>
<!---->
<string name="pseudo_account">疑似アカウント(ログインなし、公開データを読めるだけ)</string>
<!---->
<string name="server_confirmed">サーバを確認しました</string>
<!---->
<string name="exit_app_when_close_protected_column">保護されたカラムを戻るボタンで確認なしで閉じようとしたらアプリを終了する</string>
<!---->
<string name="dont_resize">しない</string>
<!---->
<string name="resize_image">添付画像のリサイズ(JPEG,PNG)</string>
<!---->
<string name="long_side_pixel">長辺 %1$d ピクセル</string>
<!---->
<string name="image_capture">カメラで撮影</string>
<!---->
<string name="image_pick">画像を選択</string>
<!---->
<string name="attachment_uploaded">添付メディアをアップロードできました</string>
<!---->
<string name="attachment_uploading">添付メディアのアップロード中です…</string>
<!---->
<string name="missing_storage_permission">ストレージ書き込み権限がありません</string>
<!---->
<string name="send_message_from_another_account">別アカウントでメッセージを送る</string>
<!---->
<string name="send_message">メッセージを送る</string>
<!---->
<string name="open_profile_from_another_account">(同タンスの)別アカウントでプロフを開く</string>
<!---->
<string name="open_profile">プロフを開く</string>
<!---->
<string name="actions_for_user">ユーザへのアクション</string>
<!---->
<string name="actions_for_status">発言へのアクション</string>
<!---->
<string name="confirm_block_user">ユーザ \'%1$s\' をブロックします。よろしいですか?</string>
<!---->
<string name="confirm_mute_user">ユーザ \'%1$s\' をミュートします。よろしいですか?</string>
<!---->
<string name="confirm_delete_status">この発言を削除します。よろしいですか?</string>
<!---->
<string name="acct">Acct</string>
<!---->
<string name="background_color">背景色</string>
<!---->
<string name="color">Color</string>
<!---->
<string name="discard">取り消し</string>
<!---->
<string name="edit">編集</string>
<!---->
<string name="nickname"></string>
<!---->
<string name="nickname_label">通称 (指定するとAcctの代わりに表示されます)</string>
<!---->
<string name="preview">プレビュー</string>
<!---->
<string name="reset">リセット</string>
<!---->
<string name="save">保存</string>
<!---->
<string name="text_color">文字色</string>
<!---->
<string name="nickname_and_color">通称と色</string>
<!---->
<string name="nickname_applied_after_reload">通称と色の変更はカラムをリロードした後に反映されます</string>
<!---->
<string name="confirmation">確認</string>
<!---->
<string name="follow_locked_user">鍵つきユーザのフォロー</string>
<!---->
<string name="follow_requested">フォローリクエストを申請しました</string>
<!---->
<string name="show_follow_button_in_button_bar">フォローボタンをボタンバーに表示する(アプリ再起動が必要)</string>
<!---->
<string name="confirm_follow_request_who_from">%2$s から鍵付きユーザ %1$s にフォローリクエストを送りますか?</string>
<!---->
<string name="confirm_follow_who_from">%2$s から %1$s をフォローしますか?</string>
<!---->
<string name="confirm_post_from">%1$s から投稿します。よろしいですか?</string>
<!---->
<string name="confirm_unfollow_who_from">%2$s から %1$s をフォロー解除しますか?</string>
<!---->
<string name="dont_confirm_again">次回から確認しない</string>
<!---->
<string name="follow_request_cant_remove_by_sender">フォローリクエストを送信者から解除することはできないようです…</string>
<!---->
<string name="profile">プロフィール</string>
<!---->
<string name="profile_of">%1$s のプロフィール</string>
<!---->
<string name="it_is_you">あなたです</string>
<!---->
<string name="boosted_by">発言をブーストした人</string>
<!---->
<string name="dont_refresh">更新しない</string>
<!---->
<string name="favourited_by">発言をお気に入りした人</string>
<!---->
<string name="refresh_after_toot">発言後の更新</string>
<!---->
<string name="refresh_no_scroll">更新するがスクロールしない</string>
<!---->
<string name="refresh_scroll_to_toot">更新して発言までスクロール</string>
<!---->
<string name="account_picker_add_timeline_of">どのアカウントで %1$s を開きますか?</string>
<!---->
<string name="account_picker_boost">どのアカウントでブーストしますか?</string>
<!---->
<string name="account_picker_favourite">どのアカウントでお気に入りしますか?</string>
<!---->
<string name="account_picker_follow">どのアカウントでフォローしますか?</string>
<!---->
<string name="account_picker_open_setting">どのアカウントの設定を開きますか?</string>
<!---->
<string name="account_picker_open_user_who">どのアカウントでユーザ %1$s のプロフィールを確認しますか?</string>
<!---->
<string name="account_picker_toot">どのアカウントでトゥートしますか?</string>
<!---->
<string name="conversation">会話の流れ</string>
<!---->
<string name="hashtag">ハッシュタグ</string>
<!---->
<string name="generating_qr_code">QRコードの作成中…</string>
<!---->
<string name="qr_code">QRコード</string>
<!---->
<string name="clear">消去</string>
<!---->
<string name="clear_text">テキストの消去</string>
<!---->
<string name="clear_text_and_media">テキストとメディアの消去</string>
<!---->
<string name="media_attachment">添付メディア</string>
<!---->
<string name="toot">トゥート</string>
<!---->
<string name="visibility">公開範囲</string>
<!---->
<string name="dont_round_avatar">ユーザ画像を角丸にしない(アプリ再起動が必要)</string>
<!---->
<string name="color_and_background">色と背景</string>
<!---->
<string name="column_background">カラム背景</string>
<!---->
<string name="column_header">カラムヘッダ</string>
<!---->
<string name="foreground_color">文字とアイコンの色</string>
<!---->
<string name="image">画像</string>
<!---->
<string name="image_alpha">画像の不透明度</string>
<!---->
<string name="menu">メニュー</string>
<!---->
<string name="open_in_pseudo_account">疑似アカウント %1$s で開く</string>
<!---->
<string name="pick_image">画像の選択</string>
<!---->
<string name="hashtag_and_visibility_not_match">メッセージにハッシュタグが含まれていますが、公開範囲が公開ではありません。ハッシュタグは公開メッセージに含まれる場合のみ検索されることができます。続けてもよろしいですか?</string>
<!---->
<string name="copy">コピー</string>
<!---->
<string name="mute_word">単語をミュート</string>
<!---->
<string name="muted_word">ミュートした単語</string>
<!---->
<string name="search_web">Web検索</string>
<!---->
<string name="select_and_copy">選択してコピー…</string>
<!---->
<string name="send">共有</string>
<!---->
<string name="word_was_muted">単語をミュートしました</string>
<!---->
<string name="copy_complete">クリップボードにコピーしました</string>
<!---->
<string name="button_background_color">ボタン背景色</string>
<!---->
<string name="button_foreground_color">ボタン前景色</string>
<!---->
<string name="footer_color">フッタの色</string>
<!---->
<string name="tab_background_color">タブ背景色</string>
<!---->
<string name="tab_divider_color">タブ両端の区切りの色</string>
</resources>
<!--ステータスURLをアプリ内で開く時に、どのアカウントから閲覧するかで取得結果が異なる。ログインなしの擬似アカウントも選択肢に含まれる。-->
<string name="open_status_from">ステータスを次のアカウントから開く</string>
<string name="help_translation">翻訳に協力する</string>
</resources>

View File

@ -296,4 +296,6 @@
<string name="button_foreground_color">Button foreground color</string>
<string name="tab_background_color">Tab background color</string>
<string name="tab_divider_color">Tab divider color</string>
<string name="open_status_from">Open status from</string>
<string name="help_translation">Help translation</string>
</resources>