Merge pull request #2720 from pixelfed/staging

Staging
This commit is contained in:
daniel 2021-04-06 23:38:50 -06:00 committed by GitHub
commit 089ca37457
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
25 changed files with 264 additions and 146 deletions

View file

@ -56,11 +56,16 @@ MAIL_ENCRYPTION=null
## Databases (MySQL)
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_DATABASE=pixelfed_prod
DB_HOST=db
DB_PASSWORD=pixelfed_db_pass
DB_PORT=3306
DB_DATABASE=pixelfed
DB_USERNAME=pixelfed
DB_PASSWORD=pixelfed
# pass the same values to the db itself
MYSQL_DATABASE=pixelfed_prod
MYSQL_PASSWORD=pixelfed_db_pass
MYSQL_RANDOM_ROOT_PASSWORD=true
MYSQL_USER=pixelfed
## Databases (Postgres)
#DB_CONNECTION=pgsql
@ -74,7 +79,7 @@ DB_PASSWORD=pixelfed
REDIS_CLIENT=phpredis
REDIS_SCHEME=tcp
REDIS_HOST=redis
REDIS_PASSWORD=null
REDIS_PASSWORD=redis_password
REDIS_PORT=6379
REDIS_DATABASE=0

View file

@ -62,6 +62,7 @@
- Updated Compose Apis, refactor rate limits. ([42375b3d](https://github.com/pixelfed/pixelfed/commit/42375b3d))
- Updated PublicApiController, show unlisted comments. ([e1c6297e](https://github.com/pixelfed/pixelfed/commit/e1c6297e))
- Updated ApiV1Controller, add missing variable. ([886ea617](https://github.com/pixelfed/pixelfed/commit/886ea617))
- Updated PublicApiController, limit network pagination to 3 months. ([10119bbb](https://github.com/pixelfed/pixelfed/commit/10119bbb))
- ([](https://github.com/pixelfed/pixelfed/commit/))
## [v0.10.10 (2021-01-28)](https://github.com/pixelfed/pixelfed/compare/v0.10.9...v0.10.10)

View file

@ -523,7 +523,7 @@ class PublicApiController extends Controller
->whereIn('type', ['photo', 'photo:album', 'video', 'video:album', 'photo:video:album'])
->whereNotNull('uri')
->whereScope('public')
// ->where('created_at', '>', now()->subMonths(3))
->where('created_at', '>', now()->subMonths(3))
->orderBy('created_at', 'desc')
->limit($limit)
->get();

View file

@ -11,7 +11,6 @@ version: '3'
# if the volumes are properly shared between cluster members.
services:
## App and Worker
app:
# Comment to use dockerhub image
@ -21,16 +20,15 @@ services:
image: pixelfed
restart: unless-stopped
env_file:
- ./.env.docker
- .env.docker
volumes:
- "app-storage:/var/www/storage"
- "app-bootstrap:/var/www/bootstrap"
- "./.env.docker:/var/www/.env"
- app-storage:/var/www/storage
- app-bootstrap:/var/www/bootstrap
networks:
- external
- internal
ports:
- "8080:80"
- "8080:80"
depends_on:
- db
- redis
@ -42,10 +40,10 @@ services:
image: pixelfed
restart: unless-stopped
env_file:
- ./.env.docker
- .env.docker
volumes:
- "app-storage:/var/www/storage"
- "app-bootstrap:/var/www/bootstrap"
- app-storage:/var/www/storage
- app-bootstrap:/var/www/bootstrap
networks:
- external
- internal
@ -61,17 +59,16 @@ services:
networks:
- internal
command: --default-authentication-plugin=mysql_native_password
environment:
- MYSQL_DATABASE=pixelfed
- MYSQL_USER=${DB_USERNAME}
- MYSQL_PASSWORD=${DB_PASSWORD}
- MYSQL_RANDOM_ROOT_PASSWORD=true
env_file:
- .env.docker
volumes:
- "db-data:/var/lib/mysql"
redis:
image: redis:5-alpine
restart: unless-stopped
env_file:
- .env.docker
volumes:
- "redis-data:/data"
networks:

View file

@ -334,7 +334,7 @@
<p class="lead mb-0">
by <a :href="statusProfileUrl">{{statusUsername}}</a>
<span v-if="relationship && profile && user && !relationship.following && profile.id != user.id">
<span class="px-1 text-lighter"></span>
<span class="px-1 text-lighter"></span>
<a class="font-weight-bold small" href="#">Follow</a>
</span>
</p>
@ -348,7 +348,7 @@
</h2>
<p class="lead mb-0">
by <a :href="statusProfileUrl">{{statusUsername}}</a>
<!-- <span class="px-1 text-lighter"></span>
<!-- <span class="px-1 text-lighter"></span>
<a class="font-weight-bold small" href="#">Follow</a> -->
</p>
</div>
@ -400,7 +400,7 @@
<label class="custom-control-label small font-weight-bold text-muted" style="padding-top: 3px" for="sensitiveReply">Add Content Warning</label>
</div>
</span>
<button class="btn btn-sm font-weight-bold btn-outline-primary py-1"
<button class="btn btn-sm font-weight-bold btn-outline-primary py-1"
v-if="replyText.length > 2" @click="postReply">Post</button>
</p>
</div>
@ -442,7 +442,7 @@
</span>
</p>
</div>
</div>
</div>
</div>
</div>
</div>
@ -687,10 +687,10 @@
.postPresenterContainer {
background: #fff;
}
@media(min-width: 720px) {
.postPresenterContainer {
min-height: 600px;
}
@media(min-width: 720px) {
.postPresenterContainer {
min-height: 600px;
}
}
::-webkit-scrollbar {
width: 0px;
@ -773,10 +773,11 @@ export default {
'status-profile-url',
'status-avatar',
'status-profile-id',
'profile-layout'
'profile-layout',
'profile-recent'
],
components: {
components: {
VueTribute
},
@ -941,12 +942,15 @@ export default {
this.fetchComments();
}
this.loaded = true;
setTimeout(function() {
self.fetchProfilePosts();
}, 3000);
if(this.profileRecent !== false) {
setTimeout(function() {
self.fetchProfilePosts();
}, 3000);
}
setTimeout(function() {
self.fetchState();
document.querySelectorAll('.status-comment .postCommentsContainer .comment-body a').forEach(function(i, e) {
document.querySelectorAll('.status-comment .postCommentsContainer .comment-body a').forEach(function(i, e) {
i.href = App.util.format.rewriteLinks(i);
});
}, 500);
@ -1202,7 +1206,7 @@ export default {
comment: this.replyText,
sensitive: this.replySensitive
}
this.replyText = '';
axios.post('/i/comment', data)
@ -1262,7 +1266,7 @@ export default {
this.redirect('/login?next=' + encodeURIComponent(window.location.pathname));
return;
}
if(this.status.comments_disabled) {
return;
}
@ -1284,7 +1288,7 @@ export default {
axios.get(url)
.then(response => {
let self = this;
this.results = this.layout == 'metro' ?
this.results = this.layout == 'metro' ?
_.reverse(response.data.data) :
response.data.data;
this.pagination = response.data.meta.pagination;
@ -1294,7 +1298,7 @@ export default {
$('.postCommentsLoader').addClass('d-none');
$('.postCommentsContainer').removeClass('d-none');
setTimeout(function() {
document.querySelectorAll('.status-comment .postCommentsContainer .comment-body a').forEach(function(i, e) {
document.querySelectorAll('.status-comment .postCommentsContainer .comment-body a').forEach(function(i, e) {
i.href = App.util.format.rewriteLinks(i);
});
}, 500);
@ -1505,9 +1509,9 @@ export default {
if(profile.local == true) {
return reply.url;
} else {
return showOrigin ?
return showOrigin ?
reply.url :
'/i/web/post/_/' + profile.id + '/' + reply.id;
'/i/web/post/_/' + profile.id + '/' + reply.id;
}
},
@ -1575,7 +1579,7 @@ export default {
});
swal('Untagged', 'You have been untagged from this post.', 'success');
}).catch(err => {
swal('An Error Occurred', 'Please try again later.', 'error');
swal('An Error Occurred', 'Please try again later.', 'error');
});
},
@ -1737,7 +1741,7 @@ export default {
}, 500);
});
},
},
}
</script>

View file

@ -130,7 +130,7 @@
</div>
<div class="pl-2">
<!-- <a class="d-block username font-weight-bold text-dark" v-bind:href="status.account.url" style="line-height:0.5;"> -->
<a class="username font-weight-bold text-dark text-decoration-none" v-bind:href="profileUrl(status)" v-html="statusCardUsernameFormat(status)">
<a class="username font-weight-bold text-dark text-decoration-none text-break" v-bind:href="profileUrl(status)" v-html="statusCardUsernameFormat(status)">
Loading...
</a>
<span v-if="status.account.is_admin" class="fa-stack" title="Admin Account" data-toggle="tooltip" style="height:1em; line-height:1em; max-width:19px;">
@ -408,7 +408,7 @@
<div class="col-12 col-md-6 offset-md-3">
<div class="card shadow-none border" style="height:100vh;">
<div class="card-header d-flex justify-content-between align-items-center">
<div
<div
@click="commentNavigateBack(status.id)"
class="cursor-pointer"
>
@ -441,9 +441,9 @@
</div>
<div class="postCommentsContainer d-none">
<p v-if="replies.length" class="mb-1 text-center load-more-link my-4">
<a
href="#"
class="text-dark"
<a
href="#"
class="text-dark"
title="Load more comments"
@click.prevent="loadMoreComments"
>
@ -516,19 +516,19 @@
</div>
<div class="card-footer mb-3">
<div class="align-middle d-flex">
<img
<img
:src="profile.avatar"
width="36"
height="36"
class="rounded-circle border mr-3">
<textarea
class="form-control rounded-pill"
name="comment"
placeholder="Add a comment…"
autocomplete="off"
<textarea
class="form-control rounded-pill"
name="comment"
placeholder="Add a comment…"
autocomplete="off"
autocorrect="off"
rows="1"
maxlength="0"
maxlength="0"
style="resize: none;overflow-y: hidden"
@click="replyFocus(status)">
</textarea>
@ -741,9 +741,9 @@
body-class="p-2 rounded">
<div>
<vue-tribute :options="tributeSettings">
<textarea
class="form-control replyModalTextarea"
rows="4"
<textarea
class="form-control replyModalTextarea"
rows="4"
v-model="replyText">
</textarea>
</vue-tribute>
@ -764,7 +764,7 @@
<input type="checkbox" class="custom-control-input" id="replyModalCWSwitch" v-model="replyNsfw">
<label :class="[replyNsfw ? 'custom-control-label font-weight-bold text-dark':'custom-control-label text-lighter']" for="replyModalCWSwitch">Mark as NSFW</label>
</div>
<button class="btn btn-primary btn-sm py-2 px-4 lead text-uppercase font-weight-bold" v-on:click.prevent="commentSubmit(status, $event)" :disabled="replyText.length == 0">
{{replySending == true ? 'POSTING' : 'POST'}}
</button>
@ -781,14 +781,14 @@
size="xl"
body-class="list-group-flush p-0 m-0 rounded">
<!-- <post-component
v-if="ctxMenuStatus"
:status-template="ctxMenuStatus.pf_type"
:status-id="ctxMenuStatus.id"
:status-username="ctxMenuStatus.account.username"
:status-url="ctxMenuStatus.url"
:status-profile-url="ctxMenuStatus.account.url"
:status-avatar="ctxMenuStatus.account.avatar"
:status-profile-id="ctxMenuStatus.account.id"
v-if="ctxMenuStatus"
:status-template="ctxMenuStatus.pf_type"
:status-id="ctxMenuStatus.id"
:status-username="ctxMenuStatus.account.username"
:status-url="ctxMenuStatus.url"
:status-profile-url="ctxMenuStatus.account.url"
:status-avatar="ctxMenuStatus.account.avatar"
:status-profile-id="ctxMenuStatus.account.id"
profile-layout="metro">
</post-component> -->
</b-modal>
@ -934,7 +934,7 @@
let el = document.querySelector('link[data-stylesheet="light"]');
el.setAttribute('href', '/css/appdark.css?id=' + Date.now());
el.setAttribute('data-stylesheet', 'dark');
el.setAttribute('data-stylesheet', 'dark');
}*/
if(localStorage.getItem('pf_metro_ui.exp.rec') == 'false') {
@ -1019,14 +1019,14 @@
$('.timeline .pagination').removeClass('d-none');
// if(this.feed.length == 4) {
// this.fetchTimelineApi();
// }
// }
if(this.hashtagPosts.length == 0) {
this.fetchHashtagPosts();
}
// this.fetchStories();
this.rtw();
setTimeout(function() {
document.querySelectorAll('.timeline .card-body .comments .comment-body a').forEach(function(i, e) {
document.querySelectorAll('.timeline .card-body .comments .comment-body a').forEach(function(i, e) {
i.href = App.util.format.rewriteLinks(i);
});
}, 500);
@ -1079,7 +1079,7 @@
'status_id': d.id,
'profile_id': d.account.id
});
}
}
});
this.min_id = Math.max(...this.ids).toString();
this.max_id = Math.min(...this.ids).toString();
@ -1211,7 +1211,7 @@
},
fetchStatusComments(status, card) {
// axios.get('/api/v2/status/'+status.id+'/replies',
// axios.get('/api/v2/status/'+status.id+'/replies',
// {
// params: {
// limit: 6
@ -1223,7 +1223,7 @@
// });
// this.replies = _.reverse(data);
// setTimeout(function() {
// document.querySelectorAll('.timeline .card-body .comments .comment-body a').forEach(function(i, e) {
// document.querySelectorAll('.timeline .card-body .comments .comment-body a').forEach(function(i, e) {
// i.href = App.util.format.rewriteLinks(i);
// });
// }, 500);
@ -1233,7 +1233,7 @@
axios.get(url)
.then(response => {
let self = this;
// this.results = this.layout == 'metro' ?
// this.results = this.layout == 'metro' ?
// _.reverse(response.data.data) :
// response.data.data;
this.replies = _.reverse(response.data.data);
@ -1244,7 +1244,7 @@
$('.postCommentsLoader').addClass('d-none');
$('.postCommentsContainer').removeClass('d-none');
// setTimeout(function() {
// document.querySelectorAll('.status-comment .postCommentsContainer .comment-body a').forEach(function(i, e) {
// document.querySelectorAll('.status-comment .postCommentsContainer .comment-body a').forEach(function(i, e) {
// i.href = App.util.format.rewriteLinks(i);
// });
// }, 500);
@ -1622,7 +1622,7 @@
this.replyText += em + ' ';
$('textarea[name="comment"]').focus();
}
},
},
refreshSuggestions() {
return;
@ -1794,7 +1794,7 @@
this.$refs.ctxModModal.hide();
this.$refs.ctxModOtherModal.show();
},
ctxModMenu() {
this.$refs.ctxModal.hide();
},
@ -1854,7 +1854,7 @@
return usr + '<span class="text-lighter font-weight-bold"> ' + txt + ' ' + dom + '</span>';
break;
default:
default:
return usr + '<span class="text-lighter font-weight-bold">@' + dom + '</span>';
break;
}
@ -2104,7 +2104,7 @@
if(this.status.comments_disabled) {
return;
}
this.replyToIndex = index;
this.replyingToId = e.id;
this.replyingToUsername = e.account.username;
@ -2184,9 +2184,9 @@
color: #3897f0;
}
.replyModalTextarea {
border: none;
font-size: 18px;
resize: none;
border: none;
font-size: 18px;
resize: none;
white-space: pre-wrap;
outline: none;
}

View file

@ -8,6 +8,20 @@
<carousel ref="carousel" :centerMode="true" :loop="false" :per-page="1" :paginationPosition="'bottom-overlay'" paginationActiveColor="#3897f0" paginationColor="#dbdbdb">
<slide v-for="(img, index) in status.media_attachments" :key="'px-carousel-'+img.id + '-' + index" class="w-100 h-100 d-block mx-auto text-center" :title="img.description">
<img :class="img.filter_class + ' img-fluid'" :src="img.url" :alt="altText(img)" onerror="this.onerror=null;this.src='/storage/no-preview.png'">
<p
v-if="status.media_attachments[0].license"
style="
margin-bottom: 0;
padding: 0 5px;
color: #fff;
font-size: 10px;
text-align: right;
position: absolute;
bottom: 0;
right: 0;
border-top-left-radius: 5px;
background: linear-gradient(0deg, rgba(0,0,0,0.5), rgba(0,0,0,0.5));
"><a :href="status.url" class="font-weight-bold text-light">Photo</a> by <a :href="status.account.url" class="font-weight-bold text-light">&commat;{{status.account.username}}</a> licensed under <a :href="status.media_attachments[0].license.url" class="font-weight-bold text-light">{{status.media_attachments[0].license.title}}</a></p>
</slide>
</carousel>
</details>
@ -16,6 +30,20 @@
<carousel ref="carousel" :centerMode="true" :loop="false" :per-page="1" :paginationPosition="'bottom-overlay'" paginationActiveColor="#3897f0" paginationColor="#dbdbdb" class="p-0 m-0">
<slide v-for="(img, index) in status.media_attachments" :key="'px-carousel-'+img.id + '-' + index" class="" style="background: #000; display: flex;align-items: center;" :title="img.description">
<img :class="img.filter_class + ' img-fluid w-100 p-0'" style="" :src="img.url" :alt="altText(img)" onerror="this.onerror=null;this.src='/storage/no-preview.png'">
<p
v-if="status.media_attachments[0].license"
style="
margin-bottom: 0;
padding: 0 5px;
color: #fff;
font-size: 10px;
text-align: right;
position: absolute;
bottom: 0;
right: 0;
border-top-left-radius: 5px;
background: linear-gradient(0deg, rgba(0,0,0,0.5), rgba(0,0,0,0.5));
"><a :href="status.url" class="font-weight-bold text-light">Photo</a> by <a :href="status.account.url" class="font-weight-bold text-light">&commat;{{status.account.username}}</a> licensed under <a :href="status.media_attachments[0].license.url" class="font-weight-bold text-light">{{status.media_attachments[0].license.title}}</a></p>
</slide>
</carousel>
</div>
@ -83,4 +111,4 @@
}
}
}
</script>
</script>

View file

@ -23,27 +23,27 @@
</div>
<div v-else>
<div :title="status.media_attachments[0].description" style="position: relative;">
<img class="card-img-top"
:src="status.media_attachments[0].url"
loading="lazy"
<img class="card-img-top"
:src="status.media_attachments[0].url"
loading="lazy"
:alt="altText(status)"
:width="width()"
:height="height()"
onerror="this.onerror=null;this.src='/storage/no-preview.png'">
<p
<p
v-if="status.media_attachments[0].license"
style="
margin-bottom: 0;
padding: 0 5px;
color: #fff;
font-size: 10px;
text-align: right;
position: absolute;
bottom: 0;
right: 0;
border-top-left-radius: 5px;
background: linear-gradient(0deg, rgba(0,0,0,0.5), rgba(0,0,0,0.5));
margin-bottom: 0;
padding: 0 5px;
color: #fff;
font-size: 10px;
text-align: right;
position: absolute;
bottom: 0;
right: 0;
border-top-left-radius: 5px;
background: linear-gradient(0deg, rgba(0,0,0,0.5), rgba(0,0,0,0.5));
"><a :href="status.url" class="font-weight-bold text-light">Photo</a> by <a :href="status.account.url" class="font-weight-bold text-light">&commat;{{status.account.username}}</a> licensed under <a :href="status.media_attachments[0].license.url" class="font-weight-bold text-light">{{status.media_attachments[0].license.title}}</a></p>
</div>
</div>
@ -91,7 +91,7 @@
},
width() {
if( !this.status.media_attachments[0].meta ||
if( !this.status.media_attachments[0].meta ||
!this.status.media_attachments[0].meta.original ||
!this.status.media_attachments[0].meta.original.width ) {
return;
@ -100,7 +100,7 @@
},
height() {
if( !this.status.media_attachments[0].meta ||
if( !this.status.media_attachments[0].meta ||
!this.status.media_attachments[0].meta.original ||
!this.status.media_attachments[0].meta.original.height ) {
return;
@ -109,4 +109,4 @@
}
}
}
</script>
</script>

View file

@ -13,7 +13,7 @@ return [
|
*/
'failed' => 'لم نعثر على هذه المعطيات في سجلاتنا.',
'throttle' => 'لقد قمت بعدة محاولات. يُرجى إعادة المحاولة لاحقًا بعد مُضيّ :seconds ثوان.',
'failed' => 'هَذِهِ المُؤَهِلاتُ لَا تَتَطابَقُ مَعَ سِجِلَّاتِنَا.',
'throttle' => 'العَدِيدُ مِن مُحَاوَلَاتِ تَسجِيلِ الدُّخُول. يُرجَى المُحَاوَلَةُ مَرَّةً أُخرَى بَعدَ زَمَنٍ قَدرُهُ :seconds ثَواني.',
];

View file

@ -0,0 +1,11 @@
<?php
return [
'compose' => [
'invalid' => [
'album' => 'يَجِبُ أن يَحوِي صُورَةً وَاحِدَة، مَقطَعً مَرئِيًّ أو عَدَدً مِنَ الصُّوَر.',
],
],
];

View file

@ -0,0 +1,28 @@
<?php
return [
'helpcenter' => ' مَركَزُ المُسَاعَدَة',
'whatsnew' => 'مَا الجَدِيد',
'gettingStarted' => 'اِبدَأ',
'sharingMedia' => 'مُشَارَكَةُ الوَسَائِط',
'profile' => 'المَلَفُّ الشَّخصِيّ',
'stories' => 'القِصَص',
'hashtags' => 'الأوسِمَةُ المُرَبَّعَة',
'discover' => 'الاِستِكشاف',
'directMessages' => 'الرَّسَائِلُ المُبَاشِرَة',
'timelines' => 'الخَطُّ الزَّمَنِيّ',
'embed' => 'التَّضمِين',
'communityGuidelines' => 'إرشَادَاتُ المُجتَمَع',
'whatIsTheFediverse' => 'مَا هُوَ Fediverse؟',
'controllingVisibility' => 'التَّحَكُّمُ فِي الرُّؤيَة',
'blockingAccounts' => 'حَظرُ الحِسَابَات',
'safetyTips' => 'نَصَائِحٌ أمنِيَّة',
'reportSomething' => 'الإبلاَغُ عَن شَيءٍ مَا',
'dataPolicy' => 'سِياسَةُ البَيَانَات',
'taggingPeople' => 'وَسمُ الأشخَاص'
];

View file

@ -1,14 +1,19 @@
<?php
return [
'viewMyProfile' => 'معاينة ملفي الشخصي',
'myTimeline' => 'خيطي الزمني',
'publicTimeline' => 'الخيط الزمني العام',
'remoteFollow' => 'المتابَعة عند بُعد',
'settings' => 'الإعدادات',
'admin' => 'المدير',
'logout' => 'خروج',
'directMessages' => 'الرسائل المباشرة',
'search' => 'البَحث',
'home' => 'الرَّئِيسَة',
'local' => 'المَحَلِّيّ',
'network' => 'الشَّبَكَة',
'discover' => 'الاِستِكشاف',
'viewMyProfile' => 'الاِطِّلاعُ عَلَى مَلَفِّي الشَّخصِي',
'myProfile' => 'مَلَفِّي الشَّخصِي',
'myTimeline' => 'خَطِّي الزَّمَنِي',
'publicTimeline' => 'الخَطُّ الزَّمَنِيّ العَام',
'remoteFollow' => 'المُتَابَعَةُ عَن بُعد',
'settings' => 'الإعدادَات',
'admin' => 'المُدِير',
'logout' => 'تَسجِيلُ الخُرُوج',
'directMessages' => 'الرَّسَائِلُ المُبَاشِرَة',
'composePost' => 'إنشاءُ مَنشُور',
];

View file

@ -2,9 +2,11 @@
return [
'likedPhoto' => 'أُعجِب بصورتك.',
'startedFollowingYou' => 'يُتابِعك الآن.',
'commented' => 'علّق على منشورك.',
'mentionedYou' => 'أشار إليك.',
'likedPhoto' => 'اُعجِبَ بِمَنشُورِك.',
'likedComment' => 'اُعجِبَ بِتَعلِيقِك.',
'startedFollowingYou' => 'بَدَأ بِمُتَابَعَتِك.',
'commented' => 'عَلَّقَ عَلَى مَنشُورِك.',
'mentionedYou' => 'قَد ذَكَرَك.',
'shared' => 'شَارَكَ مَنشُورَك.',
];

View file

@ -13,7 +13,7 @@ return [
|
*/
'previous' => '« التالي',
'next' => 'العودة »',
'previous' => '« السَّابِق',
'next' => 'التَّالِي »',
];

View file

@ -13,10 +13,10 @@ return [
|
*/
'password' => نبغي أن يكون طول الكلمة السرية أزيَد مِن ستة حروف و تكون نفسها متطابقة.',
'reset' => 'تم إعادة تعيين كلمتك السرية!',
'sent' => 'لقد قمنا بإرسال رسالة مع رابط لإعادة تعيين الكلمة السرية!',
'token' => مز إعادة تعيين الكلمة السرية هذا لم يعد صالحًا.',
'user' => "تعذّر علينا العثور على مستخدِم له عنوان البريد الإلكتروني هذا.",
'password' => َجِبُ أن تَتَكَوَّنَ كَلِمَةُ المُرُورِ مِن سِتِّ خَانَاتٍ عَلَى الأقل وَأن تَكُونَ مُتَطَابِقَةً مَعَ التَّأكِيد.',
'reset' => 'لَقَد تَمَّ إعادَةُ تَعيِينِ كَلِمَةِ المُرُورِ الخَاصَّةِ بِك!',
'sent' => 'إذَا كَانَ عُنوَانُ بَريدِكَ الإلِكتُرونِيِّ الخاصِّ بِكَ مَوجُودًا فِي قَاعِدَةِ البَيَانَاتِ الخَاصَّةِ بِنَا، فَسَوفَ تَتَلَقَّى رَابِطًا لاِستِعادَةِ كَلِمَةِ المُرُورِ عَلَى عُنوَانِ بَريدِكَ الإلِكتُرونِيِّ فِي غُضُونِ بِضعِ دَقائِق. إذَا لَم تَستَلِم هَذَا البَريد، يُرجَى التَّحقُّقُ مِن مُجَلَّدِ الرَّسَائِل غَيرِ المَرغُوبِ فِيهَا.',
'token' => َمزُ إعادَةِ تَعيِينِ كَلِمَةِ المُرُورِ هَذَا غَيرُ صَالِح.',
'user' => 'إذَا كَانَ عُنوَانُ بَريدِكَ الإلِكتُرونِيِّ الخاصِّ بِكَ مَوجُودًا فِي قَاعِدَةِ البَيَانَاتِ الخَاصَّةِ بِنَا، فَسَوفَ تَتَلَقَّى رَابِطًا لاِستِعادَةِ كَلِمَةِ المُرُورِ عَلَى عُنوَانِ بَريدِكَ الإلِكتُرونِيِّ فِي غُضُونِ بِضعِ دَقائِق. إذَا لَم تَستَلِم هَذَا البَريد، يُرجَى التَّحقُّقُ مِن مُجَلَّدِ الرَّسَائِل غَيرِ المَرغُوبِ فِيهَا.',
];

View file

@ -1,12 +1,15 @@
<?php
return [
'emptyTimeline' => 'لم يقم هذا المستخدِم بنشر أي منشور بعد!',
'emptyFollowers' => 'ليس لهذا المستخدِم متابِعون بعد!',
'emptyFollowing' => 'هذا المستخدِم لا يتابع أحدًا بعد!',
'emptySaved' => 'لم تقم بحفظ أي منشور بعد!',
'savedWarning' => 'لا يمكنك عرض إلا ما قمت بالإحتفاظ به',
'privateProfileWarning' => 'هذا الحساب خاص',
'alreadyFollow' => 'أنت تتبع :username?',
'loginToSeeProfile' => 'قصد عرض صوَرهم و فيديوهاتهت.',
'emptyTimeline' => 'هَذَا المُستَخدِمُ لَيسَ لَدَيهِ أيُّ مَنشُورَاتٍ حَتَّى الآن!',
'emptyFollowers' => 'هَذَا المُستَخدِمُ لَيسَ لَدَيهِ أيُّ مُتَابِعِينَ حَتَّى الآن!',
'emptyFollowing' => 'هَذَا المُستَخدِمُ لَا يُتَابِعُ أَيُّ شَخصٍ حَتَّى الآن!',
'emptySaved' => 'أنتَ لَم تَحفَظ أيُّ مَنشُورٍ حَتَّى الآن!',
'savedWarning' => 'أنتَ فَقَطّ مَن يُمكَنُهُ رُؤيَةُ مَا قَد حَفَظتَهُ أنت',
'privateProfileWarning' => 'هَذَا حِسَابٌ خاصّ',
'alreadyFollow' => 'هَل تُتَابِعُ :username بِالفِعل؟',
'loginToSeeProfile' => 'لِمُشَاهَدَةِ صُوَرِهِ وَمَقَاطِعِهِ المَرئِيَّة.',
'status.disabled.header' => 'إنَّ المَلَفَّ الشَّخصِيّ غَيرُ مُتَاح',
'status.disabled.body' => 'عُذرًا، إنَّ هَذَا المَلَفَّ الشَّخصِيّ غَيرُ مُتَاحٍ فِي الوَقتِ الحالِيِّ. يُرجَى المُحَاوَلَةُ مَرَّةً أُخرَى بَعدَ قَلِيل.',
];

View file

@ -0,0 +1,20 @@
<?php
return [
'about' => 'حَول',
'help' => 'المُسَاعَدَة',
'language' => 'اللُّغَة',
'fediverse' => 'Fediverse',
'opensource' => 'المَصدَرُ المَفتُوح',
'terms' => 'الشُّرُوط',
'privacy' => 'الخُصُوصِيَّة',
'l10nWip' => 'لَا نَزَالُ نَعمَلُ عَلَى دَعمِ اللُّغَةِ العَرَبِيَّة',
'currentLocale' => 'اللُّغَةُ الحالِيَّة',
'selectLocale' => 'اِختَر إحدَى اللُّغَاتِ المَدعُومَة',
'contact' => 'التَّوَاصُل',
'contact-us' => 'تَوَاصَل مَعَنَا',
'places' => 'الأَمَاكِن',
'profiles' => 'المَلَفَّاتُ الشَّخصِيَّة',
];

View file

@ -2,6 +2,6 @@
return [
'emptyPersonalTimeline' => 'إنّ خيطك الزمني فارغ.',
'emptyPersonalTimeline' => 'إنَّ الخَطَّ الزَّمَنِيَّ الخاصَّ بِكَ فَارِغ.',
];

View file

@ -0,0 +1,11 @@
<?php
return [
'compose' => [
'invalid' => [
'album' => 'Должен содержать одно фото, видео, или несколько фото.',
],
],
];

View file

@ -5,22 +5,24 @@ return [
'helpcenter' => 'Помощь',
'whatsnew' => 'Что нового',
'gettingStarted' => 'Первые шаги',
'gettingStarted' => 'Начало работы',
'sharingMedia' => 'Поделиться',
'profile' => 'Профиль',
'stories' => 'Истории',
'hashtags' => 'Хэштэти',
'hashtags' => 'Хэштэги',
'discover' => 'Discover',
'directMessages' => 'Личное сообщение',
'directMessages' => 'Личные сообщения',
'timelines' => 'Ленты',
'embed' => 'Вставить',
'communityGuidelines' => 'Правила сообщества',
'whatIsTheFediverse' => 'Что такое fediverse?',
'controllingVisibility' => 'Управление видимостью',
'blockingAccounts' => 'Заблокированные аккаунты',
'blockingAccounts' => 'Блокировка аккаунтов',
'safetyTips' => 'Советы по безопасности',
'reportSomething' => 'Пожаловаться',
'reportSomething' => 'Жалобы',
'dataPolicy' => 'Конфиденциальность'
'taggingPeople' => 'Отметки людей'
];

View file

@ -3,11 +3,11 @@
return [
'search' => 'Поиск',
'home' => 'Home',
'local' => 'локальная',
'network' => 'Сеть',
'home' => 'Главная',
'local' => 'Локальная',
'network' => 'Глобальная',
'discover' => 'Discover',
'viewMyProfile' => 'Локальная лента',
'viewMyProfile' => 'Мой профиль',
'myTimeline' => 'Моя лента',
'publicTimeline' => 'Глобальная лента',
'remoteFollow' => 'Remote Follow',

View file

@ -15,8 +15,8 @@ return [
'password' => 'Пароль должен содержать не менее 6 символов и должен совпадать с подтверждением пароля.',
'reset' => 'Ваш пароль был сброшен!',
'sent' => 'Мы отправили ссылку для сброса пароля по e-mail!',
'sent' => 'Если ваш e-mail существует в нашей базе данных, в течение нескольких минут вы получите письмо со ссылкой для восстановления пароля. Если не получили письмо, пожалуйста, проверьте папку "Спам".',
'token' => 'Этот токен для сброса пароля некорректен.',
'user' => 'Мы не можем найти пользователя с таким e-mail.',
'user' => 'Если ваш e-mail существует в нашей базе данных, в течение нескольких минут вы получите письмо со ссылкой для восстановления пароля. Если не получили письмо, пожалуйста, проверьте папку "Спам".',
];

View file

@ -5,11 +5,11 @@ return [
'emptyFollowers' => 'У этого пользователя пока нет подписчиков!',
'emptyFollowing' => 'Этот пользователь пока ни на кого не подписан!',
'emptySaved' => 'Вы еще не сохранили ни одного поста!',
'savedWarning' => 'Только можете видеть сохранённые посты',
'savedWarning' => 'Только вы можете видеть сохранённые посты',
'privateProfileWarning' => 'Эта учётная запись скрыта',
'alreadyFollow' => 'Уже подписаны на :username?',
'loginToSeeProfile' => 'что бы посмотреть их фото и видео.',
'loginToSeeProfile' => 'чтобы посмотреть их фото и видео.',
'status.disabled.header' => 'Учётная запись недоступна',
'status.disabled.body' => 'Нам очень жаль, эта учётная запись недоступна на данный момент. Пожалуйста, попробуйте позже.',
'status.disabled.body' => 'К сожалению, эта учётная запись недоступна на данный момент. Пожалуйста, попробуйте ещё раз позднее.',
];

View file

@ -11,8 +11,9 @@ return [
'privacy' => 'Конфиденциальность',
'l10nWip' => 'Мы все еще работаем над локализацией',
'currentLocale' => 'Выбранный язык',
'selectLocale' => 'выберите один из поддерживаемых языков',
'selectLocale' => 'Выберите один из поддерживаемых языков',
'contact' => 'Контакт',
'contact-us' => 'Связь с нами',
'profiles' => 'Профили',
];

View file

@ -58,7 +58,7 @@
</div>
</div>
<div class="form-group row">
<label for="bio" class="col-sm-3 col-form-label font-weight-bold">Language</label>
<label for="language" class="col-sm-3 col-form-label font-weight-bold">Language</label>
<div class="col-sm-9">
<select class="form-control" name="language">
@foreach(App\Util\Localization\Localization::languages() as $lang)