mirror of
https://github.com/pixelfed/pixelfed.git
synced 2024-11-29 01:33:16 +00:00
commit
941a5d0d2d
22 changed files with 356 additions and 401 deletions
|
@ -45,6 +45,11 @@
|
||||||
- Updated ApiV1Controller, use PublicTimelineService. ([f67c67bc](https://github.com/pixelfed/pixelfed/commit/f67c67bc))
|
- Updated ApiV1Controller, use PublicTimelineService. ([f67c67bc](https://github.com/pixelfed/pixelfed/commit/f67c67bc))
|
||||||
- Updated ApiV1Controller, use ProfileService for verify_credentials. ([352aa573](https://github.com/pixelfed/pixelfed/commit/352aa573))
|
- Updated ApiV1Controller, use ProfileService for verify_credentials. ([352aa573](https://github.com/pixelfed/pixelfed/commit/352aa573))
|
||||||
- Updated RemotePost.vue, fix content warning button. ([7647e724](https://github.com/pixelfed/pixelfed/commit/7647e724))
|
- Updated RemotePost.vue, fix content warning button. ([7647e724](https://github.com/pixelfed/pixelfed/commit/7647e724))
|
||||||
|
- Updated AdminMediaController, improve perf and use simple pagination. ([f2686cac](https://github.com/pixelfed/pixelfed/commit/f2686cac))
|
||||||
|
- Updated PostComponent, fix MomentUI like counter. ([42c6121a](https://github.com/pixelfed/pixelfed/commit/42c6121a))
|
||||||
|
- Updated status views, remove like counts from status embed. ([1a2e41b1](https://github.com/pixelfed/pixelfed/commit/1a2e41b1))
|
||||||
|
- Updated Profile, fix unauthenticated private profiles. ([9017f7c4](https://github.com/pixelfed/pixelfed/commit/9017f7c4))
|
||||||
|
- Updated PublicApiController, impr home timeline perf. ([4fe42e5b](https://github.com/pixelfed/pixelfed/commit/4fe42e5b))
|
||||||
- ([](https://github.com/pixelfed/pixelfed/commit/))
|
- ([](https://github.com/pixelfed/pixelfed/commit/))
|
||||||
|
|
||||||
## [v0.11.0 (2021-06-01)](https://github.com/pixelfed/pixelfed/compare/v0.10.10...v0.11.0)
|
## [v0.11.0 (2021-06-01)](https://github.com/pixelfed/pixelfed/compare/v0.10.10...v0.11.0)
|
||||||
|
|
|
@ -27,6 +27,7 @@ trait AdminMediaController
|
||||||
],
|
],
|
||||||
'search' => 'nullable|string|min:1|max:20'
|
'search' => 'nullable|string|min:1|max:20'
|
||||||
]);
|
]);
|
||||||
|
|
||||||
if($request->filled('search')) {
|
if($request->filled('search')) {
|
||||||
$profiles = Profile::where('username', 'like', '%'.$request->input('search').'%')->pluck('id')->toArray();
|
$profiles = Profile::where('username', 'like', '%'.$request->input('search').'%')->pluck('id')->toArray();
|
||||||
$media = Media::whereHas('status')
|
$media = Media::whereHas('status')
|
||||||
|
@ -42,7 +43,8 @@ trait AdminMediaController
|
||||||
$media = MediaBlocklist::latest()->paginate(12);
|
$media = MediaBlocklist::latest()->paginate(12);
|
||||||
return view('admin.media.home', compact('media'));
|
return view('admin.media.home', compact('media'));
|
||||||
}
|
}
|
||||||
$media = Media::whereHas('status')->with('status')->orderby('id', 'desc')->paginate(12);
|
|
||||||
|
$media = Media::whereNull('remote_url')->orderby('id', 'desc')->simplePaginate(12);
|
||||||
return view('admin.media.home', compact('media'));
|
return view('admin.media.home', compact('media'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -47,7 +47,8 @@ class ProfileController extends Controller
|
||||||
});
|
});
|
||||||
|
|
||||||
if ($user->is_private == true) {
|
if ($user->is_private == true) {
|
||||||
abort(404);
|
$profile = null;
|
||||||
|
return view('profile.private', compact('user'));
|
||||||
}
|
}
|
||||||
|
|
||||||
$owner = false;
|
$owner = false;
|
||||||
|
|
|
@ -290,69 +290,32 @@ class PublicApiController extends Controller
|
||||||
$max = $request->input('max_id');
|
$max = $request->input('max_id');
|
||||||
$limit = $request->input('limit') ?? 3;
|
$limit = $request->input('limit') ?? 3;
|
||||||
$user = $request->user();
|
$user = $request->user();
|
||||||
$amin = SnowflakeService::byDate(now()->subDays(90));
|
|
||||||
|
|
||||||
$key = 'user:last_active_at:id:'.$user->id;
|
|
||||||
$ttl = now()->addMinutes(5);
|
|
||||||
Cache::remember($key, $ttl, function() use($user) {
|
|
||||||
$user->last_active_at = now();
|
|
||||||
$user->save();
|
|
||||||
return;
|
|
||||||
});
|
|
||||||
|
|
||||||
$filtered = UserFilter::whereUserId($user->profile_id)
|
$filtered = UserFilter::whereUserId($user->profile_id)
|
||||||
->whereFilterableType('App\Profile')
|
->whereFilterableType('App\Profile')
|
||||||
->whereIn('filter_type', ['mute', 'block'])
|
->whereIn('filter_type', ['mute', 'block'])
|
||||||
->pluck('filterable_id')->toArray();
|
->pluck('filterable_id')->toArray();
|
||||||
|
|
||||||
if($min || $max) {
|
if(PublicTimelineService::count() == 0) {
|
||||||
$dir = $min ? '>' : '<';
|
PublicTimelineService::warmCache(true, 400);
|
||||||
$id = $min ?? $max;
|
|
||||||
$timeline = Status::select(
|
|
||||||
'id',
|
|
||||||
'profile_id',
|
|
||||||
'type',
|
|
||||||
'scope',
|
|
||||||
'local'
|
|
||||||
)->where('id', $dir, $id)
|
|
||||||
->where('id', '>', $amin)
|
|
||||||
->whereIn('type', ['text', 'photo', 'photo:album', 'video', 'video:album', 'photo:video:album'])
|
|
||||||
->whereNotIn('profile_id', $filtered)
|
|
||||||
->whereLocal(true)
|
|
||||||
->whereScope('public')
|
|
||||||
->orderBy('id', 'desc')
|
|
||||||
->limit($limit)
|
|
||||||
->get()
|
|
||||||
->map(function($s) use ($user) {
|
|
||||||
$status = StatusService::get($s->id);
|
|
||||||
$status['favourited'] = (bool) LikeService::liked($user->profile_id, $s->id);
|
|
||||||
return $status;
|
|
||||||
});
|
|
||||||
$res = $timeline->toArray();
|
|
||||||
} else {
|
|
||||||
$timeline = Status::select(
|
|
||||||
'id',
|
|
||||||
'profile_id',
|
|
||||||
'type',
|
|
||||||
'scope',
|
|
||||||
'local'
|
|
||||||
)->whereIn('type', ['text', 'photo', 'photo:album', 'video', 'video:album', 'photo:video:album'])
|
|
||||||
->where('id', '>', $amin)
|
|
||||||
->whereNotIn('profile_id', $filtered)
|
|
||||||
->with('profile', 'hashtags', 'mentions')
|
|
||||||
->whereLocal(true)
|
|
||||||
->whereScope('public')
|
|
||||||
->orderBy('id', 'desc')
|
|
||||||
->limit($limit)
|
|
||||||
->get()
|
|
||||||
->map(function($s) use ($user) {
|
|
||||||
$status = StatusService::get($s->id);
|
|
||||||
$status['favourited'] = (bool) LikeService::liked($user->profile_id, $s->id);
|
|
||||||
return $status;
|
|
||||||
});
|
|
||||||
$res = $timeline->toArray();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($max) {
|
||||||
|
$feed = PublicTimelineService::getRankedMaxId($max, $limit);
|
||||||
|
} else if ($min) {
|
||||||
|
$feed = PublicTimelineService::getRankedMinId($min, $limit);
|
||||||
|
} else {
|
||||||
|
$feed = PublicTimelineService::get(0, $limit);
|
||||||
|
}
|
||||||
|
|
||||||
|
$res = collect($feed)
|
||||||
|
->map(function($k) use($user) {
|
||||||
|
$status = StatusService::get($k);
|
||||||
|
$status['favourited'] = (bool) LikeService::liked($user->profile_id, $k);
|
||||||
|
return $status;
|
||||||
|
})
|
||||||
|
->toArray();
|
||||||
|
|
||||||
return response()->json($res);
|
return response()->json($res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
BIN
public/js/profile.js
vendored
BIN
public/js/profile.js
vendored
Binary file not shown.
BIN
public/js/status.js
vendored
BIN
public/js/status.js
vendored
Binary file not shown.
Binary file not shown.
|
@ -323,7 +323,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="like-count font-weight-bold mt-2 rounded border" style="cursor:pointer;" v-on:click="likesModal">
|
<div class="like-count font-weight-bold mt-2 rounded border" style="cursor:pointer;" v-on:click="likesModal">
|
||||||
|
|
||||||
{{ownerOrAdmin() ? (status.liked_by.total_count + 1) : 0}}
|
{{ownerOrAdmin == true ? (status.liked_by.total_count + 1) : 0}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
|
@ -898,6 +898,10 @@ export default {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(u.has('ui') && u.get('ui') == 'moment' && this.layout != 'moment') {
|
||||||
|
this.layout = 'moment';
|
||||||
|
}
|
||||||
|
|
||||||
if(forceMetro == true || u.has('ui') && u.get('ui') == 'metro' && this.layout != 'metro') {
|
if(forceMetro == true || u.has('ui') && u.get('ui') == 'metro' && this.layout != 'metro') {
|
||||||
this.layout = 'metro';
|
this.layout = 'metro';
|
||||||
}
|
}
|
||||||
|
|
|
@ -703,6 +703,11 @@
|
||||||
this.fetchProfile();
|
this.fetchProfile();
|
||||||
let u = new URLSearchParams(window.location.search);
|
let u = new URLSearchParams(window.location.search);
|
||||||
let forceMetro = localStorage.getItem('pf_metro_ui.exp.forceMetro') == 'true';
|
let forceMetro = localStorage.getItem('pf_metro_ui.exp.forceMetro') == 'true';
|
||||||
|
|
||||||
|
if(u.has('ui') && u.get('ui') == 'moment' && this.layout != 'moment') {
|
||||||
|
this.layout = 'moment';
|
||||||
|
}
|
||||||
|
|
||||||
if(forceMetro == true || u.has('ui') && u.get('ui') == 'metro' && this.layout != 'metro') {
|
if(forceMetro == true || u.has('ui') && u.get('ui') == 'metro' && this.layout != 'metro') {
|
||||||
this.layout = 'metro';
|
this.layout = 'metro';
|
||||||
}
|
}
|
||||||
|
@ -739,10 +744,6 @@
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if(window.outerWidth < 576) {
|
|
||||||
$('nav.navbar').hide();
|
|
||||||
this.isMobile = true;
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
updated() {
|
updated() {
|
||||||
|
|
|
@ -15,8 +15,8 @@ return [
|
||||||
'timelines' => 'خط زمانی',
|
'timelines' => 'خط زمانی',
|
||||||
'embed' => 'توکار',
|
'embed' => 'توکار',
|
||||||
|
|
||||||
'communityGuidelines' => 'دستورالعملهای انجمن',
|
'communityGuidelines' => 'دستورالعملهای اجتماع',
|
||||||
'whatIsTheFediverse' => 'نامتمرکز یعنی چی؟',
|
'whatIsTheFediverse' => 'فدیورس چیست؟',
|
||||||
'controllingVisibility' => 'کنترل نمایش',
|
'controllingVisibility' => 'کنترل نمایش',
|
||||||
'blockingAccounts' => 'حسابهای مسدودشده',
|
'blockingAccounts' => 'حسابهای مسدودشده',
|
||||||
'safetyTips' => 'نکات امنیتی',
|
'safetyTips' => 'نکات امنیتی',
|
||||||
|
|
|
@ -5,15 +5,15 @@ return [
|
||||||
'home' => 'خانه',
|
'home' => 'خانه',
|
||||||
'local' => 'محلی',
|
'local' => 'محلی',
|
||||||
'network' => 'شبکه',
|
'network' => 'شبکه',
|
||||||
'discover' => 'کشفکردن',
|
'discover' => 'کشف کردن',
|
||||||
'viewMyProfile' => 'مشاهده نمایه من',
|
'viewMyProfile' => 'مشاهده نمایه من',
|
||||||
'myProfile' => 'نمایه من',
|
'myProfile' => 'نمایه من',
|
||||||
'myTimeline' => 'جدول زمانی من',
|
'myTimeline' => 'خطزمانی من',
|
||||||
'publicTimeline' => 'جدول زمانی عمومی',
|
'publicTimeline' => 'خطزمانی عمومی',
|
||||||
'remoteFollow' => 'از راه دور دنبال کنید',
|
'remoteFollow' => 'پیگیری راه دور',
|
||||||
'settings' => 'تنظیمات',
|
'settings' => 'تنظیمات',
|
||||||
'admin' => 'مدیر',
|
'admin' => 'مدیر',
|
||||||
'logout' => 'خروج',
|
'logout' => 'خروج',
|
||||||
'directMessages' => 'پیام خصوصی',
|
'directMessages' => 'پیام مستقیم',
|
||||||
'composePost' => 'نوشتن پست',
|
'composePost' => 'ایجاد فرسته',
|
||||||
];
|
];
|
||||||
|
|
|
@ -2,11 +2,11 @@
|
||||||
|
|
||||||
return [
|
return [
|
||||||
|
|
||||||
'likedPhoto' => 'پست شما را پسندید.',
|
'likedPhoto' => 'فرستهٔ شما را پسندید.',
|
||||||
'likedComment' => 'دیدگاه شما را پسندید.',
|
'likedComment' => 'دیدگاه شما را پسندید.',
|
||||||
'startedFollowingYou' => 'شما را دنبال میکند.',
|
'startedFollowingYou' => 'شما را دنبال میکند.',
|
||||||
'commented' => 'دیدگاهی روی پست شما نوشت.',
|
'commented' => 'دیدگاهی روی فرستهٔ شما نوشت.',
|
||||||
'mentionedYou' => 'شما را صدا کرد.',
|
'mentionedYou' => 'شما را صدا کرد.',
|
||||||
'shared' => 'پستی منتشر کرد.',
|
'shared' => 'فرستهای منتشر کرد.',
|
||||||
|
|
||||||
];
|
];
|
||||||
|
|
|
@ -13,10 +13,10 @@ return [
|
||||||
|
|
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
'password' => 'رمز عبور شما باید حداقل شامل ۶ کاراکتر باشد و همچنین با تکرار آن مطابق باشد.',
|
'password' => 'رمز عبور شما باید حداقل شامل ۶ حرف بوده و همچنین با تکرار آن مطابق باشد.',
|
||||||
'reset' => 'رمز عبور شما بازنشانی شد!',
|
'reset' => 'رمز عبور شما بازنشانی شد!',
|
||||||
'sent' => 'اگر ایمیل شما در پایگاهداده ما موجود باشد، شما ایمیل شامل یک لینک بازنشانی رمز عبور در چند دقیقه آینده دریافت خواهید کرد. در صورتی که ایمیلی دریافت نکردید، لطفا صندوق هرزنامه خود را نیز بررسی کنید.',
|
'sent' => 'اگر ایمیلتان در پایگاهداده ما موجود باشد، در چند دقیقه آینده ایمیلی حاوی یک پیوند بازنشانی رمز عبور دریافت خواهید کرد. در صورتی که ایمیلی دریافت نکردید، لطفا صندوق هرزنامه خود را نیز بررسی کنید.',
|
||||||
'token' => 'این لینک نامعتبر است.',
|
'token' => 'این پیوند نامعتبر است.',
|
||||||
'user' => 'اگر ایمیل شما در پایگاهداده ما موجود باشد، شما ایمیل شامل یک لینک بازنشانی رمز عبور در چند دقیقه آینده دریافت خواهید کرد. در صورتی که ایمیلی دریافت نکردید، لطفا صندوق هرزنامه خود را نیز بررسی کنید.',
|
'user' => 'اگر ایمیلتان در پایگاهداده ما موجود باشد، در چند دقیقه آینده ایمیلی حاوی یک پیوند بازنشانی رمز عبور دریافت خواهید کرد. در صورتی که ایمیلی دریافت نکردید، لطفا صندوق هرزنامه خود را نیز بررسی کنید.',
|
||||||
|
|
||||||
];
|
];
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'emptyTimeline' => 'این کاربر هنوز پستی ارسال نکرده!',
|
'emptyTimeline' => 'این کاربر هنوز چیزی منتشر نکرده است!',
|
||||||
'emptyFollowers' => 'این کاربر هنوز دنبالکنندهای ندارد!',
|
'emptyFollowers' => 'این کاربر هنوز دنبالکنندهای ندارد!',
|
||||||
'emptyFollowing' => 'این کاربر هنوز کسی را دنبال نمیکند!',
|
'emptyFollowing' => 'این کاربر هنوز کسی را دنبال نمیکند!',
|
||||||
'emptySaved' => 'شما هنوز هیچ پستی ذخیره نکردهاید!',
|
'emptySaved' => 'شما هنوز هیچ فرستهای را ذخیره نکردهاید!',
|
||||||
'savedWarning' => 'فقط شما میتوانید آنچه که ذخیره کردهاید را ببینید.',
|
'savedWarning' => 'فقط شما میتوانید آنچه که ذخیره کردهاید را ببینید.',
|
||||||
'privateProfileWarning' => 'این حساب خصوصی است.',
|
'privateProfileWarning' => 'این حساب خصوصی است.',
|
||||||
'alreadyFollow' => 'الان :username را دنبال میکنید؟',
|
'alreadyFollow' => 'الان :username را دنبال میکنید؟',
|
||||||
|
|
|
@ -5,8 +5,8 @@ return [
|
||||||
'about' => 'درباره',
|
'about' => 'درباره',
|
||||||
'help' => 'راهنما',
|
'help' => 'راهنما',
|
||||||
'language' => 'زبانها',
|
'language' => 'زبانها',
|
||||||
'fediverse' => 'نامتمرکز',
|
'fediverse' => 'فدیورس',
|
||||||
'opensource' => 'متن باز',
|
'opensource' => 'آزاد/متنباز',
|
||||||
'terms' => 'قوانین',
|
'terms' => 'قوانین',
|
||||||
'privacy' => 'حریم خصوصی',
|
'privacy' => 'حریم خصوصی',
|
||||||
'l10nWip' => 'ما هنوز روی محلیسازی کار میکنیم.',
|
'l10nWip' => 'ما هنوز روی محلیسازی کار میکنیم.',
|
||||||
|
|
|
@ -2,6 +2,6 @@
|
||||||
|
|
||||||
return [
|
return [
|
||||||
|
|
||||||
'emptyPersonalTimeline' => 'جدول زمانی شما خالی است.',
|
'emptyPersonalTimeline' => 'خطزمانی شما خالی است.',
|
||||||
|
|
||||||
];
|
];
|
||||||
|
|
|
@ -14,7 +14,7 @@ return [
|
||||||
*/
|
*/
|
||||||
|
|
||||||
'accepted' => ':attribute باید پذیرفته شده باشد.',
|
'accepted' => ':attribute باید پذیرفته شده باشد.',
|
||||||
'active_url' => 'آدرس :attribute معتبر نیست',
|
'active_url' => 'نشانی :attribute معتبر نیست',
|
||||||
'after' => ':attribute باید تاریخی بعد از :date باشد.',
|
'after' => ':attribute باید تاریخی بعد از :date باشد.',
|
||||||
'after_or_equal' => ':attribute باید تاریخی بعد از :date، یا مطابق با آن باشد.',
|
'after_or_equal' => ':attribute باید تاریخی بعد از :date، یا مطابق با آن باشد.',
|
||||||
'alpha' => ':attribute باید فقط حروف الفبا باشد.',
|
'alpha' => ':attribute باید فقط حروف الفبا باشد.',
|
||||||
|
@ -26,8 +26,8 @@ return [
|
||||||
'between' => [
|
'between' => [
|
||||||
'numeric' => ':attribute باید بین :min و :max باشد.',
|
'numeric' => ':attribute باید بین :min و :max باشد.',
|
||||||
'file' => ':attribute باید بین :min و :max کیلوبایت باشد.',
|
'file' => ':attribute باید بین :min و :max کیلوبایت باشد.',
|
||||||
'string' => ':attribute باید بین :min و :max کاراکتر باشد.',
|
'string' => ':attribute باید بین :min و :max حرف باشد.',
|
||||||
'array' => ':attribute باید بین :min و :max آیتم باشد.',
|
'array' => ':attribute باید بین :min و :max مورد باشد.',
|
||||||
],
|
],
|
||||||
'boolean' => 'فیلد :attribute فقط میتواند صحیح و یا غلط باشد',
|
'boolean' => 'فیلد :attribute فقط میتواند صحیح و یا غلط باشد',
|
||||||
'confirmed' => ':attribute با فیلد تکرار مطابقت ندارد.',
|
'confirmed' => ':attribute با فیلد تکرار مطابقت ندارد.',
|
||||||
|
@ -38,39 +38,39 @@ return [
|
||||||
'digits_between' => ':attribute باید بین :min و :max رقم باشد.',
|
'digits_between' => ':attribute باید بین :min و :max رقم باشد.',
|
||||||
'dimensions' => 'ابعاد تصویر :attribute قابل قبول نیست.',
|
'dimensions' => 'ابعاد تصویر :attribute قابل قبول نیست.',
|
||||||
'distinct' => 'فیلد :attribute تکراری است.',
|
'distinct' => 'فیلد :attribute تکراری است.',
|
||||||
'email' => ':attribute باید یک ایمیل معتبر باشد',
|
'email' => ':attribute باید ایمیلی معتبر باشد',
|
||||||
'exists' => ':attribute انتخاب شده، معتبر نیست.',
|
'exists' => ':attribute انتخاب شده معتبر نیست.',
|
||||||
'file' => ':attribute باید یک فایل باشد',
|
'file' => ':attribute باید یک پرونده باشد',
|
||||||
'filled' => 'فیلد :attribute الزامی است',
|
'filled' => 'فیلد :attribute الزامی است',
|
||||||
'image' => ':attribute باید تصویر باشد.',
|
'image' => ':attribute باید تصویر باشد.',
|
||||||
'in' => ':attribute انتخاب شده، معتبر نیست.',
|
'in' => ':attribute انتخاب شده معتبر نیست.',
|
||||||
'in_array' => 'فیلد :attribute در :other وجود ندارد.',
|
'in_array' => 'فیلد :attribute در :other وجود ندارد.',
|
||||||
'integer' => ':attribute باید عدد صحیح باشد.',
|
'integer' => ':attribute باید عددی صحیح باشد.',
|
||||||
'ip' => ':attribute باید IP معتبر باشد.',
|
'ip' => ':attribute باید IP معتبر باشد.',
|
||||||
'ipv4' => ':attribute باید یک آدرس معتبر از نوع IPv4 باشد.',
|
'ipv4' => ':attribute باید یک نشانی معتبر از نوع IPv4 باشد.',
|
||||||
'ipv6' => ':attribute باید یک آدرس معتبر از نوع IPv6 باشد.',
|
'ipv6' => ':attribute باید یک نشانی معتبر از نوع IPv6 باشد.',
|
||||||
'json' => 'فیلد :attribute باید یک رشته از نوع JSON باشد.',
|
'json' => 'فیلد :attribute باید یک رشته از نوع JSON باشد.',
|
||||||
'max' => [
|
'max' => [
|
||||||
'numeric' => ':attribute نباید بزرگتر از :max باشد.',
|
'numeric' => ':attribute نباید بزرگتر از :max باشد.',
|
||||||
'file' => ':attribute نباید بزرگتر از :max کیلوبایت باشد.',
|
'file' => ':attribute نباید بزرگتر از :max کیلوبایت باشد.',
|
||||||
'string' => ':attribute نباید بیشتر از :max کاراکتر باشد.',
|
'string' => ':attribute نباید بیشتر از :max حرف باشد.',
|
||||||
'array' => ':attribute نباید بیشتر از :max آیتم باشد.',
|
'array' => ':attribute نباید بیشتر از :max مورد باشد.',
|
||||||
],
|
],
|
||||||
'mimes' => ':attribute باید یکی از فرمت های :values باشد.',
|
'mimes' => ':attribute باید یکی از قالبهای :values باشد.',
|
||||||
'mimetypes' => ':attribute باید یکی از فرمت های :values باشد.',
|
'mimetypes' => ':attribute باید یکی از قالبهای :values باشد.',
|
||||||
'min' => [
|
'min' => [
|
||||||
'numeric' => ':attribute نباید کوچکتر از :min باشد.',
|
'numeric' => ':attribute نباید کوچکتر از :min باشد.',
|
||||||
'file' => ':attribute نباید کوچکتر از :min کیلوبایت باشد.',
|
'file' => ':attribute نباید کوچکتر از :min کیلوبایت باشد.',
|
||||||
'string' => ':attribute نباید کمتر از :min کاراکتر باشد.',
|
'string' => ':attribute نباید کمتر از :min حرف باشد.',
|
||||||
'array' => ':attribute نباید کمتر از :min آیتم باشد.',
|
'array' => ':attribute نباید کمتر از :min مورد باشد.',
|
||||||
],
|
],
|
||||||
'not_in' => ':attribute انتخاب شده، معتبر نیست.',
|
'not_in' => ':attribute انتخاب شده معتبر نیست.',
|
||||||
'not_regex' => ':attribute نامعتبر است.',
|
'not_regex' => ':attribute نامعتبر است.',
|
||||||
'numeric' => ':attribute باید عدد باشد.',
|
'numeric' => ':attribute باید عدد باشد.',
|
||||||
'present' => 'فیلد :attribute باید در پارامترهای ارسالی وجود داشته باشد.',
|
'present' => 'فیلد :attribute باید در پارامترهای ارسالی وجود داشته باشد.',
|
||||||
'regex' => 'فرمت :attribute معتبر نیست',
|
'regex' => 'قالب :attribute معتبر نیست',
|
||||||
'required' => 'فیلد :attribute الزامی است',
|
'required' => 'فیلد :attribute الزامی است',
|
||||||
'required_if' => 'هنگامی که :other برابر با :value است، فیلد :attribute الزامی است.',
|
'required_if' => 'هنگامی که :other برابر با :value باشد، فیلد :attribute الزامی است.',
|
||||||
'required_unless' => 'فیلد :attribute ضروری است، مگر آنکه :other در :values موجود باشد.',
|
'required_unless' => 'فیلد :attribute ضروری است، مگر آنکه :other در :values موجود باشد.',
|
||||||
'required_with' => 'در صورت وجود فیلد :values، فیلد :attribute الزامی است.',
|
'required_with' => 'در صورت وجود فیلد :values، فیلد :attribute الزامی است.',
|
||||||
'required_with_all' => 'در صورت وجود فیلدهای :values، فیلد :attribute الزامی است.',
|
'required_with_all' => 'در صورت وجود فیلدهای :values، فیلد :attribute الزامی است.',
|
||||||
|
@ -80,14 +80,14 @@ return [
|
||||||
'size' => [
|
'size' => [
|
||||||
'numeric' => ':attribute باید برابر با :size باشد.',
|
'numeric' => ':attribute باید برابر با :size باشد.',
|
||||||
'file' => ':attribute باید برابر با :size کیلوبایت باشد.',
|
'file' => ':attribute باید برابر با :size کیلوبایت باشد.',
|
||||||
'string' => ':attribute باید برابر با :size کاراکتر باشد.',
|
'string' => ':attribute باید برابر با :size حرف باشد.',
|
||||||
'array' => ':attribute باسد شامل :size آیتم باشد.',
|
'array' => ':attribute باید شامل :size مورد باشد.',
|
||||||
],
|
],
|
||||||
'string' => 'فیلد :attribute باید متن باشد.',
|
'string' => 'فیلد :attribute باید متن باشد.',
|
||||||
'timezone' => 'فیلد :attribute باید یک منطقه زمانی قابل قبول باشد.',
|
'timezone' => 'فیلد :attribute باید یک منطقه زمانی قابل قبول باشد.',
|
||||||
'unique' => ':attribute قبلا انتخاب شده است.',
|
'unique' => ':attribute قبلا انتخاب شده است.',
|
||||||
'uploaded' => 'آپلود فایل :attribute موفقیت آمیز نبود.',
|
'uploaded' => 'بارگذاری پرونده :attribute موفقیت آمیز نبود.',
|
||||||
'url' => 'فرمت آدرس :attribute اشتباه است.',
|
'url' => 'قالب نشانی :attribute اشتباه است.',
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
|
@ -131,7 +131,7 @@ return [
|
||||||
'phone' => 'تلفن',
|
'phone' => 'تلفن',
|
||||||
'mobile' => 'تلفن همراه',
|
'mobile' => 'تلفن همراه',
|
||||||
'age' => 'سن',
|
'age' => 'سن',
|
||||||
'sex' => 'جنسیت',
|
'sex' => 'جنس',
|
||||||
'gender' => 'جنسیت',
|
'gender' => 'جنسیت',
|
||||||
'day' => 'روز',
|
'day' => 'روز',
|
||||||
'month' => 'ماه',
|
'month' => 'ماه',
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
</form>
|
</form>
|
||||||
</span>
|
</span>
|
||||||
@endif
|
@endif
|
||||||
|
@auth
|
||||||
<span class="pl-4">
|
<span class="pl-4">
|
||||||
<i class="fas fa-cog fa-lg text-muted cursor-pointer" data-toggle="modal" data-target="#ctxProfileMenu"></i>
|
<i class="fas fa-cog fa-lg text-muted cursor-pointer" data-toggle="modal" data-target="#ctxProfileMenu"></i>
|
||||||
<div class="modal" tabindex="-1" role="dialog" id="ctxProfileMenu">
|
<div class="modal" tabindex="-1" role="dialog" id="ctxProfileMenu">
|
||||||
|
@ -59,21 +60,8 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</span>
|
</span>
|
||||||
|
@endauth
|
||||||
</div>
|
</div>
|
||||||
<div class="profile-stats pb-3 d-inline-flex lead">
|
|
||||||
<div class="font-weight-light pr-5">
|
|
||||||
<span class="font-weight-bold">{{$user->statuses()->whereNull('reblog_of_id')->whereNull('in_reply_to_id')->count()}}</span>
|
|
||||||
Posts
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<p class="lead mb-0">
|
|
||||||
<span class="font-weight-bold">{{$user->name}}</span>
|
|
||||||
@if($user->remote_url)
|
|
||||||
<span class="badge badge-info">REMOTE PROFILE</span>
|
|
||||||
@endif
|
|
||||||
</p>
|
|
||||||
<p class="mb-0 lead">{{$user->bio}}</p>
|
|
||||||
<p class="mb-0"><a href="{{$user->website}}" class="font-weight-bold" rel="me external nofollow noopener" target="_blank">{{str_limit($user->website, 30)}}</a></p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -81,6 +69,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@push('scripts')
|
@push('scripts')
|
||||||
|
@auth
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
function muteProfile() {
|
function muteProfile() {
|
||||||
axios.post('/i/mute', {
|
axios.post('/i/mute', {
|
||||||
|
@ -104,4 +93,5 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
@endauth
|
||||||
@endpush
|
@endpush
|
|
@ -10,9 +10,9 @@
|
||||||
|
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="profile-timeline mt-2 mt-md-4">
|
<div class="profile-timeline mt-2 mt-md-4">
|
||||||
<div class="card">
|
<div class="">
|
||||||
<div class="card-body py-5">
|
<div class="py-5">
|
||||||
<p class="text-center lead font-weight-bold mb-0">
|
<p class="text-center lead font-weight-bold">
|
||||||
{{__('profile.privateProfileWarning')}}
|
{{__('profile.privateProfileWarning')}}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
|
@ -140,11 +140,6 @@
|
||||||
<a class="font-weight-bold" href="{{$status->url()}}" target="_blank">View More on Pixelfed</a>
|
<a class="font-weight-bold" href="{{$status->url()}}" target="_blank">View More on Pixelfed</a>
|
||||||
</div>
|
</div>
|
||||||
<hr>
|
<hr>
|
||||||
@if($showLikes)
|
|
||||||
<div class="likes font-weight-bold pb-2">
|
|
||||||
<span class="like-count">{{$item->likes_count}}</span> likes
|
|
||||||
</div>
|
|
||||||
@endif
|
|
||||||
<div class="caption">
|
<div class="caption">
|
||||||
<p class="my-0">
|
<p class="my-0">
|
||||||
<span class="username font-weight-bold">
|
<span class="username font-weight-bold">
|
||||||
|
|
|
@ -25,11 +25,5 @@
|
||||||
|
|
||||||
@push('scripts')
|
@push('scripts')
|
||||||
<script type="text/javascript" src="{{ mix('js/status.js') }}"></script>
|
<script type="text/javascript" src="{{ mix('js/status.js') }}"></script>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">App.boot();</script>
|
||||||
$(document).ready(function() {
|
|
||||||
new Vue({
|
|
||||||
el: '#content'
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
@endpush
|
@endpush
|
||||||
|
|
|
@ -72,7 +72,7 @@ Route::group(['prefix' => 'api'], function() use($middleware) {
|
||||||
|
|
||||||
|
|
||||||
Route::get('timelines/home', 'Api\ApiV1Controller@timelineHome')->middleware($middleware);
|
Route::get('timelines/home', 'Api\ApiV1Controller@timelineHome')->middleware($middleware);
|
||||||
Route::get('timelines/public', 'Api\ApiV1Controller@timelinePublic');
|
Route::get('timelines/public', 'Api\ApiV1Controller@timelinePublic')->middleware($middleware);
|
||||||
Route::get('timelines/tag/{hashtag}', 'Api\ApiV1Controller@timelineHashtag');
|
Route::get('timelines/tag/{hashtag}', 'Api\ApiV1Controller@timelineHashtag');
|
||||||
});
|
});
|
||||||
Route::group(['prefix' => 'stories'], function () use($middleware) {
|
Route::group(['prefix' => 'stories'], function () use($middleware) {
|
||||||
|
|
Loading…
Reference in a new issue