Merge branch 'master' into feature/noid/attachments

pull/352/head
Maxence Lange 2019-03-05 14:11:16 -01:00 zatwierdzone przez GitHub
commit a6ad99eed1
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
145 zmienionych plików z 18117 dodań i 14514 usunięć

Wyświetl plik

@ -70,7 +70,7 @@ pipeline:
matrix:
TESTS: syntax-php7.3
eslint:
image: nextcloudci/jsunit:jsunit-5
image: node:lts-alpine
commands:
- npm install
- npm run lint
@ -78,7 +78,7 @@ pipeline:
matrix:
TESTS: eslint
vue-build:
image: nextcloudci/jsunit:jsunit-5
image: node:lts-alpine
commands:
- npm install
- npm run build

Wyświetl plik

@ -1,5 +1,17 @@
# Changelog
## 0.1.3
- [global] fixing an issue displaying timeline when opening details for a local account.
- [global] provide more details in logs on async failure.
- [global] Cache refreshing on some events (new post, new follow)
- [federated] adding security @context on returned Actor.
- [federated] signature can be 5min old (instead of 30s) to avoid issue on badly configured instance of Nextcloud.
- [federated] webfinger will also check the host of the account.
- [UI] do not clear post field on fail post creation.
## 0.1.2
- [global] Fix Host Header on proxy setup

Wyświetl plik

@ -12,7 +12,7 @@ cert_dir=$(HOME)/.nextcloud/certificates
github_account=nextcloud
branch=master
codecov_token_dir=$(HOME)/.nextcloud/codecov_token
version+=0.1.2
version+=0.2.0-dev01
@ -59,8 +59,8 @@ lint-fix:
# Cleaning
clean:
rm -rf $(build_dir)
rm -f js/social.js
rm -f js/social.js.map
rm -fr js/
mkdir js/
clean-dev:
rm -rf node_modules

Wyświetl plik

@ -11,7 +11,7 @@ Some requirements in this alpha stage are that your Nextcloud:
![](img/screenshot.png)
- **🙋 Find your friends:** No matter if they use Nextcloud, [🐘 Mastodon](https://joinmastodon.org), [🇫 Friendica](https://friendi.ca), and soon [✱ Diaspora](https://joindiaspora.com), [👹 MediaGoblin](https://www.mediagoblin.org) and more – you can follow them!
- **🙋 Find your friends:** No matter if they use [Nextcloud Social](https://github.com/nextcloud/social#nextcloud-social), [🐘 Mastodon](https://joinmastodon.org), [🇫 Friendica](https://friendi.ca) – and soon [📺 PeerTube](https://joinpeertube.org), [🅿️ Pleroma](https://pleroma.social) or [📷 PixelFed](https://pixelfed.org) – you can follow them!
- **📜 Profile info:** No need to fill out more profiles – your info from Nextcloud will be used and extended.
- **👐 Own your posts:** Everything you post stays on your Nextcloud!
- **🕸 Open standards:** We use the established [ActivityPub](https://en.wikipedia.org/wiki/ActivityPub) standard!

Wyświetl plik

@ -18,7 +18,7 @@
**🕸 Open standards:** We use the established ActivityPub standard!
]]></description>
<version>0.1.2</version>
<version>0.2.0-dev01</version>
<licence>agpl</licence>
<author mail="maxence@artificial-owl.com">Maxence Lange</author>
<author mail="jus@bitgrid.net">Julius Härtl</author>
@ -47,6 +47,7 @@
<commands>
<command>OCA\Social\Command\CacheRefresh</command>
<command>OCA\Social\Command\NoteCreate</command>
<command>OCA\Social\Command\NoteBoost</command>
<command>OCA\Social\Command\Reset</command>
<command>OCA\Social\Command\QueueStatus</command>
<command>OCA\Social\Command\QueueProcess</command>

Wyświetl plik

@ -38,10 +38,10 @@ return [
'routes' => [
['name' => 'Navigation#navigate', 'url' => '/', 'verb' => 'GET'],
['name' => 'Navigation#test', 'url' => '/test', 'verb' => 'GET'],
[
'name' => 'Navigation#timeline', 'url' => '/timeline/{path}', 'verb' => 'GET',
'requirements' => ['path' => '.+'], 'defaults' => ['path' => '']
'requirements' => ['path' => '.+'],
'defaults' => ['path' => '']
],
['name' => 'Navigation#documentGet', 'url' => '/document/get', 'verb' => 'GET'],
['name' => 'Navigation#documentGetPublic', 'url' => '/document/public', 'verb' => 'GET'],
@ -54,11 +54,16 @@ return [
['name' => 'ActivityPub#followers', 'url' => '/@{username}/followers', 'verb' => 'GET'],
['name' => 'ActivityPub#following', 'url' => '/@{username}/following', 'verb' => 'GET'],
['name' => 'OStatus#subscribe', 'url' => '/ostatus/follow/{uri}', 'verb' => 'GET'],
['name' => 'OStatus#followRemote', 'url' => '/api/v1/ostatus/followRemote/{local}', 'verb' => 'GET'],
['name' => 'OStatus#getLink', 'url' => '/api/v1/ostatus/link/{local}/{account}', 'verb' => 'GET'],
['name' => 'SocialPub#displayPost', 'url' => '/@{username}/{postId}', 'verb' => 'GET'],
['name' => 'Local#streamHome', 'url' => '/api/v1/stream/home', 'verb' => 'GET'],
['name' => 'Local#streamNotifications', 'url' => '/api/v1/stream/notifications', 'verb' => 'GET'],
['name' => 'Local#streamTimeline', 'url' => '/api/v1/stream/timeline', 'verb' => 'GET'],
['name' => 'Local#streamTag', 'url' => '/api/v1/stream/tag/{hashtag}/', 'verb' => 'GET'],
['name' => 'Local#streamFederated', 'url' => '/api/v1/stream/federated', 'verb' => 'GET'],
['name' => 'Local#streamDirect', 'url' => '/api/v1/stream/direct', 'verb' => 'GET'],
['name' => 'Local#streamAccount', 'url' => '/api/v1/account/{username}/stream', 'verb' => 'GET'],
@ -66,6 +71,8 @@ return [
['name' => 'Local#postCreate', 'url' => '/api/v1/post', 'verb' => 'POST'],
['name' => 'Local#postDelete', 'url' => '/api/v1/post', 'verb' => 'DELETE'],
['name' => 'Local#postBoost', 'url' => '/api/v1/post/boost', 'verb' => 'POST'],
['name' => 'Local#actionFollow', 'url' => '/api/v1/current/follow', 'verb' => 'PUT'],
['name' => 'Local#actionUnfollow', 'url' => '/api/v1/current/follow', 'verb' => 'DELETE'],
@ -84,12 +91,10 @@ return [
// ['name' => 'Local#documentsCache', 'url' => '/api/v1/documents/cache', 'verb' => 'POST'],
['name' => 'Queue#asyncWithToken', 'url' => CurlService::ASYNC_TOKEN, 'verb' => 'POST'],
['name' => 'Local#search', 'url' => '/api/v1/search', 'verb' => 'GET'],
[
'name' => 'Config#setCloudAddress', 'url' => '/api/v1/config/cloudAddress',
'verb' => 'POST'
],
['name' => 'Queue#asyncForRequest', 'url' => CurlService::ASYNC_REQUEST_TOKEN, 'verb' => 'POST'],
['name' => 'Config#setCloudAddress', 'url' => '/api/v1/config/cloudAddress', 'verb' => 'POST']
]
];

8
composer.lock wygenerowano
Wyświetl plik

@ -12,12 +12,12 @@
"source": {
"type": "git",
"url": "https://github.com/daita/my-small-php-tools.git",
"reference": "0baac1f399b257b00fdc2eafb754396ffa1892f4"
"reference": "5e701ed958f2db68d6803277926bad445183b941"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/daita/my-small-php-tools/zipball/0baac1f399b257b00fdc2eafb754396ffa1892f4",
"reference": "0baac1f399b257b00fdc2eafb754396ffa1892f4",
"url": "https://api.github.com/repos/daita/my-small-php-tools/zipball/5e701ed958f2db68d6803277926bad445183b941",
"reference": "5e701ed958f2db68d6803277926bad445183b941",
"shasum": ""
},
"require": {
@ -40,7 +40,7 @@
}
],
"description": "My small PHP Tools",
"time": "2018-12-27T11:14:55+00:00"
"time": "2019-02-22T11:09:54+00:00"
},
{
"name": "friendica/json-ld",

Wyświetl plik

@ -0,0 +1 @@
{"contextUrl":null,"document":"{\n \"@context\": {\n \"id\": \"@id\",\n \"type\": \"@type\",\n\n \"cred\": \"https:\/\/w3id.org\/credentials#\",\n \"dc\": \"http:\/\/purl.org\/dc\/terms\/\",\n \"identity\": \"https:\/\/w3id.org\/identity#\",\n \"perm\": \"https:\/\/w3id.org\/permissions#\",\n \"ps\": \"https:\/\/w3id.org\/payswarm#\",\n \"rdf\": \"http:\/\/www.w3.org\/1999\/02\/22-rdf-syntax-ns#\",\n \"rdfs\": \"http:\/\/www.w3.org\/2000\/01\/rdf-schema#\",\n \"sec\": \"https:\/\/w3id.org\/security#\",\n \"schema\": \"http:\/\/schema.org\/\",\n \"xsd\": \"http:\/\/www.w3.org\/2001\/XMLSchema#\",\n\n \"Group\": \"https:\/\/www.w3.org\/ns\/activitystreams#Group\",\n\n \"claim\": {\"@id\": \"cred:claim\", \"@type\": \"@id\"},\n \"credential\": {\"@id\": \"cred:credential\", \"@type\": \"@id\"},\n \"issued\": {\"@id\": \"cred:issued\", \"@type\": \"xsd:dateTime\"},\n \"issuer\": {\"@id\": \"cred:issuer\", \"@type\": \"@id\"},\n \"recipient\": {\"@id\": \"cred:recipient\", \"@type\": \"@id\"},\n \"Credential\": \"cred:Credential\",\n \"CryptographicKeyCredential\": \"cred:CryptographicKeyCredential\",\n\n \"about\": {\"@id\": \"schema:about\", \"@type\": \"@id\"},\n \"address\": {\"@id\": \"schema:address\", \"@type\": \"@id\"},\n \"addressCountry\": \"schema:addressCountry\",\n \"addressLocality\": \"schema:addressLocality\",\n \"addressRegion\": \"schema:addressRegion\",\n \"comment\": \"rdfs:comment\",\n \"created\": {\"@id\": \"dc:created\", \"@type\": \"xsd:dateTime\"},\n \"creator\": {\"@id\": \"dc:creator\", \"@type\": \"@id\"},\n \"description\": \"schema:description\",\n \"email\": \"schema:email\",\n \"familyName\": \"schema:familyName\",\n \"givenName\": \"schema:givenName\",\n \"image\": {\"@id\": \"schema:image\", \"@type\": \"@id\"},\n \"label\": \"rdfs:label\",\n \"name\": \"schema:name\",\n \"postalCode\": \"schema:postalCode\",\n \"streetAddress\": \"schema:streetAddress\",\n \"title\": \"dc:title\",\n \"url\": {\"@id\": \"schema:url\", \"@type\": \"@id\"},\n \"Person\": \"schema:Person\",\n \"PostalAddress\": \"schema:PostalAddress\",\n \"Organization\": \"schema:Organization\",\n\n \"identityService\": {\"@id\": \"identity:identityService\", \"@type\": \"@id\"},\n \"idp\": {\"@id\": \"identity:idp\", \"@type\": \"@id\"},\n \"Identity\": \"identity:Identity\",\n\n \"paymentProcessor\": \"ps:processor\",\n \"preferences\": {\"@id\": \"ps:preferences\", \"@type\": \"@vocab\"},\n\n \"cipherAlgorithm\": \"sec:cipherAlgorithm\",\n \"cipherData\": \"sec:cipherData\",\n \"cipherKey\": \"sec:cipherKey\",\n \"digestAlgorithm\": \"sec:digestAlgorithm\",\n \"digestValue\": \"sec:digestValue\",\n \"domain\": \"sec:domain\",\n \"expires\": {\"@id\": \"sec:expiration\", \"@type\": \"xsd:dateTime\"},\n \"initializationVector\": \"sec:initializationVector\",\n \"member\": {\"@id\": \"schema:member\", \"@type\": \"@id\"},\n \"memberOf\": {\"@id\": \"schema:memberOf\", \"@type\": \"@id\"},\n \"nonce\": \"sec:nonce\",\n \"normalizationAlgorithm\": \"sec:normalizationAlgorithm\",\n \"owner\": {\"@id\": \"sec:owner\", \"@type\": \"@id\"},\n \"password\": \"sec:password\",\n \"privateKey\": {\"@id\": \"sec:privateKey\", \"@type\": \"@id\"},\n \"privateKeyPem\": \"sec:privateKeyPem\",\n \"publicKey\": {\"@id\": \"sec:publicKey\", \"@type\": \"@id\"},\n \"publicKeyPem\": \"sec:publicKeyPem\",\n \"publicKeyService\": {\"@id\": \"sec:publicKeyService\", \"@type\": \"@id\"},\n \"revoked\": {\"@id\": \"sec:revoked\", \"@type\": \"xsd:dateTime\"},\n \"signature\": \"sec:signature\",\n \"signatureAlgorithm\": \"sec:signatureAlgorithm\",\n \"signatureValue\": \"sec:signatureValue\",\n \"CryptographicKey\": \"sec:Key\",\n \"EncryptedMessage\": \"sec:EncryptedMessage\",\n \"GraphSignature2012\": \"sec:GraphSignature2012\",\n \"LinkedDataSignature2015\": \"sec:LinkedDataSignature2015\",\n\n \"accessControl\": {\"@id\": \"perm:accessControl\", \"@type\": \"@id\"},\n \"writePermission\": {\"@id\": \"perm:writePermission\", \"@type\": \"@id\"}\n }\n}\n","documentUrl":"https:\/\/web-payments.org\/contexts\/identity-v1.jsonld"}

Wyświetl plik

@ -0,0 +1 @@
{"contextUrl":null,"document":"{\n \"@context\": {\n \"id\": \"@id\",\n \"type\": \"@type\",\n\n \"dc\": \"http:\/\/purl.org\/dc\/terms\/\",\n \"sec\": \"https:\/\/w3id.org\/security#\",\n \"xsd\": \"http:\/\/www.w3.org\/2001\/XMLSchema#\",\n\n \"EcdsaKoblitzSignature2016\": \"sec:EcdsaKoblitzSignature2016\",\n \"Ed25519Signature2018\": \"sec:Ed25519Signature2018\",\n \"EncryptedMessage\": \"sec:EncryptedMessage\",\n \"GraphSignature2012\": \"sec:GraphSignature2012\",\n \"LinkedDataSignature2015\": \"sec:LinkedDataSignature2015\",\n \"LinkedDataSignature2016\": \"sec:LinkedDataSignature2016\",\n \"CryptographicKey\": \"sec:Key\",\n\n \"authenticationTag\": \"sec:authenticationTag\",\n \"canonicalizationAlgorithm\": \"sec:canonicalizationAlgorithm\",\n \"cipherAlgorithm\": \"sec:cipherAlgorithm\",\n \"cipherData\": \"sec:cipherData\",\n \"cipherKey\": \"sec:cipherKey\",\n \"created\": {\"@id\": \"dc:created\", \"@type\": \"xsd:dateTime\"},\n \"creator\": {\"@id\": \"dc:creator\", \"@type\": \"@id\"},\n \"digestAlgorithm\": \"sec:digestAlgorithm\",\n \"digestValue\": \"sec:digestValue\",\n \"domain\": \"sec:domain\",\n \"encryptionKey\": \"sec:encryptionKey\",\n \"expiration\": {\"@id\": \"sec:expiration\", \"@type\": \"xsd:dateTime\"},\n \"expires\": {\"@id\": \"sec:expiration\", \"@type\": \"xsd:dateTime\"},\n \"initializationVector\": \"sec:initializationVector\",\n \"iterationCount\": \"sec:iterationCount\",\n \"nonce\": \"sec:nonce\",\n \"normalizationAlgorithm\": \"sec:normalizationAlgorithm\",\n \"owner\": {\"@id\": \"sec:owner\", \"@type\": \"@id\"},\n \"password\": \"sec:password\",\n \"privateKey\": {\"@id\": \"sec:privateKey\", \"@type\": \"@id\"},\n \"privateKeyPem\": \"sec:privateKeyPem\",\n \"publicKey\": {\"@id\": \"sec:publicKey\", \"@type\": \"@id\"},\n \"publicKeyBase58\": \"sec:publicKeyBase58\",\n \"publicKeyPem\": \"sec:publicKeyPem\",\n \"publicKeyWif\": \"sec:publicKeyWif\",\n \"publicKeyService\": {\"@id\": \"sec:publicKeyService\", \"@type\": \"@id\"},\n \"revoked\": {\"@id\": \"sec:revoked\", \"@type\": \"xsd:dateTime\"},\n \"salt\": \"sec:salt\",\n \"signature\": \"sec:signature\",\n \"signatureAlgorithm\": \"sec:signingAlgorithm\",\n \"signatureValue\": \"sec:signatureValue\"\n }\n}\n","documentUrl":"https:\/\/web-payments.org\/contexts\/security-v1.jsonld"}

File diff suppressed because one or more lines are too long

Wyświetl plik

2
css/style.scss 100644
Wyświetl plik

@ -0,0 +1,2 @@
@include icon-black-white('reply', 'social', 1);
@include icon-black-white('emoji', 'social', 1);

7
img/emoji.svg 100644
Wyświetl plik

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" width="68" height="68">
<path d="M34 0C15.3 0 0 15.3 0 34s15.3 34 34 34 34-15.3 34-34S52.7 0 34 0zm0 64C17.5 64 4 50.5 4 34S17.5 4 34 4s30 13.5 30 30-13.5 30-30 30z"/>
<path d="M44.6 44.6c-5.8 5.8-15.4 5.8-21.2 0-.8-.8-2-.8-2.8 0-.8.8-.8 2 0 2.8C24.3 51.1 29.1 53 34 53s9.7-1.9 13.4-5.6c.8-.8.8-2 0-2.8-.8-.8-2-.8-2.8 0z"/>
<circle r="5" cy="26" cx="24"/>
<circle r="5" cy="26" cx="44"/>
</svg>

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 498 B

6
img/reply.svg 100644
Wyświetl plik

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
<g transform="matrix(-1,0,0,1,16,-1036.4)">
<path d="m1 1051.4s0.39147-7.8025 7-10v-4l7 7-7 7v-4c-5.1157 0-7 4-7 4z"/>
</g>
</svg>

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 410 B

Wyświetl plik

@ -15,6 +15,7 @@ OC.L10N.register(
"Profile" : "Профил",
"Local timeline" : "Локален таймлайн",
"Global timeline" : "Глобален таимлайн",
"Following" : "Последователи",
"Post publicly" : "Публикувай ",
"Post to followers" : "Публикувай за последователите ти",
"Post to recipients" : "Публикувах за получателите",
@ -24,12 +25,10 @@ OC.L10N.register(
"Post to followers only" : "Публикувай само за последователите ти",
"Public" : "Публично",
"Unfollow" : "Не следвай",
"Following" : "Последователи",
"Follow" : "Последвай",
"posts" : "Публикации",
"following" : "последователи",
"followers" : "Последователи",
"No accounts found" : "Не е открит профил",
"Searching for" : "Търсене за",
"No posts found" : "Не са открити публикации",
"Posts from people you follow will show up here" : "Публикации от хора, които следваш ще откриеш тук",

Wyświetl plik

@ -13,6 +13,7 @@
"Profile" : "Профил",
"Local timeline" : "Локален таймлайн",
"Global timeline" : "Глобален таимлайн",
"Following" : "Последователи",
"Post publicly" : "Публикувай ",
"Post to followers" : "Публикувай за последователите ти",
"Post to recipients" : "Публикувах за получателите",
@ -22,12 +23,10 @@
"Post to followers only" : "Публикувай само за последователите ти",
"Public" : "Публично",
"Unfollow" : "Не следвай",
"Following" : "Последователи",
"Follow" : "Последвай",
"posts" : "Публикации",
"following" : "последователи",
"followers" : "Последователи",
"No accounts found" : "Не е открит профил",
"Searching for" : "Търсене за",
"No posts found" : "Не са открити публикации",
"Posts from people you follow will show up here" : "Публикации от хора, които следваш ще откриеш тук",

Wyświetl plik

@ -17,6 +17,7 @@ OC.L10N.register(
"Profile" : "Perfil",
"Local timeline" : "Cronologia local",
"Global timeline" : "Cronologia global",
"Following" : "Seguint",
"Post publicly" : "Missatge públicament",
"Post to followers" : "Missatge als seguidors",
"Post to recipients" : "Missatge a destinataris",
@ -30,12 +31,10 @@ OC.L10N.register(
"Public" : "Públic",
"Post to public timelines" : "Missatges a cronologies públiques",
"Unfollow" : "Deixar de seguir",
"Following" : "Seguint",
"Follow" : "Segueix",
"posts" : "missatges",
"following" : "seguint",
"followers" : "seguidors",
"No accounts found" : "Cap compte trobat",
"Searching for" : "Buscant",
"No posts found" : "No s'han trobat missatges",
"Posts from people you follow will show up here" : "Missatges de persones que segueix es mostraràn aquí",

Wyświetl plik

@ -15,6 +15,7 @@
"Profile" : "Perfil",
"Local timeline" : "Cronologia local",
"Global timeline" : "Cronologia global",
"Following" : "Seguint",
"Post publicly" : "Missatge públicament",
"Post to followers" : "Missatge als seguidors",
"Post to recipients" : "Missatge a destinataris",
@ -28,12 +29,10 @@
"Public" : "Públic",
"Post to public timelines" : "Missatges a cronologies públiques",
"Unfollow" : "Deixar de seguir",
"Following" : "Seguint",
"Follow" : "Segueix",
"posts" : "missatges",
"following" : "seguint",
"followers" : "seguidors",
"No accounts found" : "Cap compte trobat",
"Searching for" : "Buscant",
"No posts found" : "No s'han trobat missatges",
"Posts from people you follow will show up here" : "Missatges de persones que segueix es mostraràn aquí",

Wyświetl plik

@ -17,6 +17,7 @@ OC.L10N.register(
"Profile" : "Profil",
"Local timeline" : "Místní časová osa",
"Global timeline" : "Globální časová osa",
"Following" : "Odebírající",
"Post publicly" : "Zveřejnit všem",
"Post to followers" : "Napsat odběratelům",
"Post to recipients" : "Zveřejnit odběratelům",
@ -30,13 +31,16 @@ OC.L10N.register(
"Public" : "Veřejné",
"Post to public timelines" : "Přispívat do veřejných časových os",
"Unfollow" : "Přestat následovat",
"Following" : "Odebírající",
"Follow" : "Odebírat",
"posts" : "příspěvky",
"following" : "následují",
"followers" : "odběratelé",
"No accounts found" : "Nenalezeny žádné účty",
"No results found" : "Nenalezeny žádné výsledky",
"There were no results for your search:" : "Pro vaše hledání nejsou žádné výsledky:",
"Searching for" : "Hledání",
"Reply" : "Odpovědět",
"More actions" : "Další akce",
"Delete post" : "Smazat příspěvek",
"No posts found" : "Nenalezeny žádné příspěvky",
"Posts from people you follow will show up here" : "Příspěvky od lidí, které odebíráte, se zobrazí zde",
"No direct messages found" : "Nenalezeny žádné přímé zprávy",
@ -45,6 +49,16 @@ OC.L10N.register(
"Posts from other people on this instance will show up here" : "Příspěvky od ostatních lidí na této instanci se zobrazí zde",
"No global posts found" : "Nenalezeny žádné globální příspěvky",
"Posts from federated instances will show up here" : "Příspěvky z federovaných instancí se zobrazí zde",
"No posts found for this tag" : "Nenalezeny žádné příspěvky s tímto štítkem",
"Follow on Nextcloud Social" : "Odebírat na Nexcloud Social",
"Hello" : "Ahoj",
"Please confirm that you want to follow this account:" : "Potvrďte, že chcete odebírat od tohoto účtu:",
"You are following this account" : "Odebíráte od tohoto účtu",
"Close" : "Zavřít",
"You are going to follow:" : "Chystáte se odebírat od:",
"name@domain of your federation account" : "jmeno@domena vašeho federovaného účtu",
"Continue" : "Pokračovat",
"This step is needed as the user is probably not registered on the same server as you are. We will redirect you to your homeserver to follow this account." : "Tento krok je potřeba protože uživatel nejspíš není zaregistrován na stejném serveru, jako vy. Abyste mohli od tohoto účtu odebírat, budete přesměrováni na svůj domovský server.",
"User not found" : "Uživatel nenalezen",
"Sorry, we could not find the account of {userId}" : "Je nám líto, nepodařilo se nalézt účet {userId}",
"Nextcloud becomes part of the federated social networks!" : "Nextcloud se stává součástí federovaných sociálních sítí!",

Wyświetl plik

@ -15,6 +15,7 @@
"Profile" : "Profil",
"Local timeline" : "Místní časová osa",
"Global timeline" : "Globální časová osa",
"Following" : "Odebírající",
"Post publicly" : "Zveřejnit všem",
"Post to followers" : "Napsat odběratelům",
"Post to recipients" : "Zveřejnit odběratelům",
@ -28,13 +29,16 @@
"Public" : "Veřejné",
"Post to public timelines" : "Přispívat do veřejných časových os",
"Unfollow" : "Přestat následovat",
"Following" : "Odebírající",
"Follow" : "Odebírat",
"posts" : "příspěvky",
"following" : "následují",
"followers" : "odběratelé",
"No accounts found" : "Nenalezeny žádné účty",
"No results found" : "Nenalezeny žádné výsledky",
"There were no results for your search:" : "Pro vaše hledání nejsou žádné výsledky:",
"Searching for" : "Hledání",
"Reply" : "Odpovědět",
"More actions" : "Další akce",
"Delete post" : "Smazat příspěvek",
"No posts found" : "Nenalezeny žádné příspěvky",
"Posts from people you follow will show up here" : "Příspěvky od lidí, které odebíráte, se zobrazí zde",
"No direct messages found" : "Nenalezeny žádné přímé zprávy",
@ -43,6 +47,16 @@
"Posts from other people on this instance will show up here" : "Příspěvky od ostatních lidí na této instanci se zobrazí zde",
"No global posts found" : "Nenalezeny žádné globální příspěvky",
"Posts from federated instances will show up here" : "Příspěvky z federovaných instancí se zobrazí zde",
"No posts found for this tag" : "Nenalezeny žádné příspěvky s tímto štítkem",
"Follow on Nextcloud Social" : "Odebírat na Nexcloud Social",
"Hello" : "Ahoj",
"Please confirm that you want to follow this account:" : "Potvrďte, že chcete odebírat od tohoto účtu:",
"You are following this account" : "Odebíráte od tohoto účtu",
"Close" : "Zavřít",
"You are going to follow:" : "Chystáte se odebírat od:",
"name@domain of your federation account" : "jmeno@domena vašeho federovaného účtu",
"Continue" : "Pokračovat",
"This step is needed as the user is probably not registered on the same server as you are. We will redirect you to your homeserver to follow this account." : "Tento krok je potřeba protože uživatel nejspíš není zaregistrován na stejném serveru, jako vy. Abyste mohli od tohoto účtu odebírat, budete přesměrováni na svůj domovský server.",
"User not found" : "Uživatel nenalezen",
"Sorry, we could not find the account of {userId}" : "Je nám líto, nepodařilo se nalézt účet {userId}",
"Nextcloud becomes part of the federated social networks!" : "Nextcloud se stává součástí federovaných sociálních sítí!",

Wyświetl plik

@ -17,6 +17,7 @@ OC.L10N.register(
"Profile" : "Profil",
"Local timeline" : "Lokale Zeitachse",
"Global timeline" : "Globale Zeitachse",
"Following" : "Folge ich",
"Post publicly" : "Öffentlich posten",
"Post to followers" : "An Follower posten",
"Post to recipients" : "An Empfänger posten",
@ -30,13 +31,16 @@ OC.L10N.register(
"Public" : "Öffentlich",
"Post to public timelines" : "Für öffentliche Zeitachsen posten",
"Unfollow" : "Entfolgen",
"Following" : "Folge ich",
"Follow" : "Folgen",
"posts" : "Posts",
"following" : "Folge ich",
"followers" : "Followers",
"No accounts found" : "Keine Konten gefunden",
"No results found" : "Keine Ergebnisse gefunden",
"There were no results for your search:" : "Es gibt keine Ergebnisse für Deine Suche:",
"Searching for" : "Suchen nach",
"Reply" : "Antworten",
"More actions" : "Weitere Aktionen",
"Delete post" : "Post löschen",
"No posts found" : "Keine Posts gefunden",
"Posts from people you follow will show up here" : "Posts von Personen denen Du folgst werden hier angezeigt",
"No direct messages found" : "Keine Direktnachrichten gefunden",
@ -45,6 +49,16 @@ OC.L10N.register(
"Posts from other people on this instance will show up here" : "Posts von anderen Personen dieser Instanz werden hier angezeigt",
"No global posts found" : "Keine globalen Posts gefunden",
"Posts from federated instances will show up here" : "Posts von federierten Instanzen werden hier angezeigt",
"No posts found for this tag" : "Keine Posts für dieses Schlagwort gefunden",
"Follow on Nextcloud Social" : "Auf Nextcloud Social folgen",
"Hello" : "Hallo",
"Please confirm that you want to follow this account:" : "Bitte bestätige, dass Du diesem Konto folgen willst:",
"You are following this account" : "Du folgst diesem Konto",
"Close" : "Schließen",
"You are going to follow:" : "Du folgst:",
"name@domain of your federation account" : "name@domain von Deinem Federation-Konto",
"Continue" : "Fortsetzen",
"This step is needed as the user is probably not registered on the same server as you are. We will redirect you to your homeserver to follow this account." : "Dieser Schritt ist nötig, da der Benutzer vielleicht nicht auf dem gleichen Server wie Du registriert ist. Wir werden Dich auf Deinen Server weiterleiten so dass Du diesem Konto folgen kannst.",
"User not found" : "Benutzer nicht gefunden",
"Sorry, we could not find the account of {userId}" : "Das Konto von {userId} konnte nicht gefunden werden",
"Nextcloud becomes part of the federated social networks!" : "Nextcloud wird Teil des Verbundes sozialer Netzwerke!",

Wyświetl plik

@ -15,6 +15,7 @@
"Profile" : "Profil",
"Local timeline" : "Lokale Zeitachse",
"Global timeline" : "Globale Zeitachse",
"Following" : "Folge ich",
"Post publicly" : "Öffentlich posten",
"Post to followers" : "An Follower posten",
"Post to recipients" : "An Empfänger posten",
@ -28,13 +29,16 @@
"Public" : "Öffentlich",
"Post to public timelines" : "Für öffentliche Zeitachsen posten",
"Unfollow" : "Entfolgen",
"Following" : "Folge ich",
"Follow" : "Folgen",
"posts" : "Posts",
"following" : "Folge ich",
"followers" : "Followers",
"No accounts found" : "Keine Konten gefunden",
"No results found" : "Keine Ergebnisse gefunden",
"There were no results for your search:" : "Es gibt keine Ergebnisse für Deine Suche:",
"Searching for" : "Suchen nach",
"Reply" : "Antworten",
"More actions" : "Weitere Aktionen",
"Delete post" : "Post löschen",
"No posts found" : "Keine Posts gefunden",
"Posts from people you follow will show up here" : "Posts von Personen denen Du folgst werden hier angezeigt",
"No direct messages found" : "Keine Direktnachrichten gefunden",
@ -43,6 +47,16 @@
"Posts from other people on this instance will show up here" : "Posts von anderen Personen dieser Instanz werden hier angezeigt",
"No global posts found" : "Keine globalen Posts gefunden",
"Posts from federated instances will show up here" : "Posts von federierten Instanzen werden hier angezeigt",
"No posts found for this tag" : "Keine Posts für dieses Schlagwort gefunden",
"Follow on Nextcloud Social" : "Auf Nextcloud Social folgen",
"Hello" : "Hallo",
"Please confirm that you want to follow this account:" : "Bitte bestätige, dass Du diesem Konto folgen willst:",
"You are following this account" : "Du folgst diesem Konto",
"Close" : "Schließen",
"You are going to follow:" : "Du folgst:",
"name@domain of your federation account" : "name@domain von Deinem Federation-Konto",
"Continue" : "Fortsetzen",
"This step is needed as the user is probably not registered on the same server as you are. We will redirect you to your homeserver to follow this account." : "Dieser Schritt ist nötig, da der Benutzer vielleicht nicht auf dem gleichen Server wie Du registriert ist. Wir werden Dich auf Deinen Server weiterleiten so dass Du diesem Konto folgen kannst.",
"User not found" : "Benutzer nicht gefunden",
"Sorry, we could not find the account of {userId}" : "Das Konto von {userId} konnte nicht gefunden werden",
"Nextcloud becomes part of the federated social networks!" : "Nextcloud wird Teil des Verbundes sozialer Netzwerke!",

Wyświetl plik

@ -17,6 +17,7 @@ OC.L10N.register(
"Profile" : "Profil",
"Local timeline" : "Lokale Zeitachse",
"Global timeline" : "Globale Zeitachse",
"Following" : "Folge ich",
"Post publicly" : "Öffentlich posten",
"Post to followers" : "An Follower posten",
"Post to recipients" : "An Empfänger posten",
@ -30,13 +31,16 @@ OC.L10N.register(
"Public" : "Öffentlich",
"Post to public timelines" : "Für öffentliche Zeitachsen posten",
"Unfollow" : "Entfolgen",
"Following" : "Folge ich",
"Follow" : "Folgen",
"posts" : "Posts",
"following" : "Folge ich",
"followers" : "Followers",
"No accounts found" : "Keine Konten gefunden",
"No results found" : "Keine Ergebnisse gefunden",
"There were no results for your search:" : "Es gibt keine Ergebnisse für Ihre Suche:",
"Searching for" : "Suchen nach",
"Reply" : "Antworten",
"More actions" : "Weitere Aktionen",
"Delete post" : "Post löschen",
"No posts found" : "Keine Posts gefunden",
"Posts from people you follow will show up here" : "Posts von Personen denen Sie folgen werden hier angezeigt",
"No direct messages found" : "Keine Direktnachrichten gefunden",
@ -45,6 +49,16 @@ OC.L10N.register(
"Posts from other people on this instance will show up here" : "Posts von anderen Personen dieser Instanz werden hier angezeigt",
"No global posts found" : "Keine globalen Posts gefunden",
"Posts from federated instances will show up here" : "Posts von federierten Instanzen werden hier angezeigt",
"No posts found for this tag" : "Keine Posts für dieses Schlagwort gefunden",
"Follow on Nextcloud Social" : "Auf Nextcloud Social folgen",
"Hello" : "Hallo",
"Please confirm that you want to follow this account:" : "Bitte bestätigen Sie, dass Sie diesem Konto folgen wollen:",
"You are following this account" : "Sie folgen diesem Konto",
"Close" : "Schließen",
"You are going to follow:" : "Sie folgen:",
"name@domain of your federation account" : "name@domain von Ihrem Federation-Konto",
"Continue" : "Fortsetzen",
"This step is needed as the user is probably not registered on the same server as you are. We will redirect you to your homeserver to follow this account." : "Dieser Schritt ist nötig, da der Benutzer vielleicht nicht auf dem gleichen Server wie Sie registriert ist. Wir werden Sie auf Ihren Server weiterleiten so dass Sie diesem Konto folgen können.",
"User not found" : "Benutzer nicht gefunden",
"Sorry, we could not find the account of {userId}" : "Das Konto von {userId} konnte nicht gefunden werden",
"Nextcloud becomes part of the federated social networks!" : "Nextcloud wird Teil des Verbundes sozialer Netzwerke! ",

Wyświetl plik

@ -15,6 +15,7 @@
"Profile" : "Profil",
"Local timeline" : "Lokale Zeitachse",
"Global timeline" : "Globale Zeitachse",
"Following" : "Folge ich",
"Post publicly" : "Öffentlich posten",
"Post to followers" : "An Follower posten",
"Post to recipients" : "An Empfänger posten",
@ -28,13 +29,16 @@
"Public" : "Öffentlich",
"Post to public timelines" : "Für öffentliche Zeitachsen posten",
"Unfollow" : "Entfolgen",
"Following" : "Folge ich",
"Follow" : "Folgen",
"posts" : "Posts",
"following" : "Folge ich",
"followers" : "Followers",
"No accounts found" : "Keine Konten gefunden",
"No results found" : "Keine Ergebnisse gefunden",
"There were no results for your search:" : "Es gibt keine Ergebnisse für Ihre Suche:",
"Searching for" : "Suchen nach",
"Reply" : "Antworten",
"More actions" : "Weitere Aktionen",
"Delete post" : "Post löschen",
"No posts found" : "Keine Posts gefunden",
"Posts from people you follow will show up here" : "Posts von Personen denen Sie folgen werden hier angezeigt",
"No direct messages found" : "Keine Direktnachrichten gefunden",
@ -43,6 +47,16 @@
"Posts from other people on this instance will show up here" : "Posts von anderen Personen dieser Instanz werden hier angezeigt",
"No global posts found" : "Keine globalen Posts gefunden",
"Posts from federated instances will show up here" : "Posts von federierten Instanzen werden hier angezeigt",
"No posts found for this tag" : "Keine Posts für dieses Schlagwort gefunden",
"Follow on Nextcloud Social" : "Auf Nextcloud Social folgen",
"Hello" : "Hallo",
"Please confirm that you want to follow this account:" : "Bitte bestätigen Sie, dass Sie diesem Konto folgen wollen:",
"You are following this account" : "Sie folgen diesem Konto",
"Close" : "Schließen",
"You are going to follow:" : "Sie folgen:",
"name@domain of your federation account" : "name@domain von Ihrem Federation-Konto",
"Continue" : "Fortsetzen",
"This step is needed as the user is probably not registered on the same server as you are. We will redirect you to your homeserver to follow this account." : "Dieser Schritt ist nötig, da der Benutzer vielleicht nicht auf dem gleichen Server wie Sie registriert ist. Wir werden Sie auf Ihren Server weiterleiten so dass Sie diesem Konto folgen können.",
"User not found" : "Benutzer nicht gefunden",
"Sorry, we could not find the account of {userId}" : "Das Konto von {userId} konnte nicht gefunden werden",
"Nextcloud becomes part of the federated social networks!" : "Nextcloud wird Teil des Verbundes sozialer Netzwerke! ",

Wyświetl plik

@ -17,6 +17,7 @@ OC.L10N.register(
"Profile" : "Perfil",
"Local timeline" : "Timeline local",
"Global timeline" : "Timeline global",
"Following" : "Siguiendo",
"Post publicly" : "Publicar públicamente",
"Post to followers" : "Publicar para seguidores",
"Post to recipients" : "Publicar para destinatarios",
@ -30,13 +31,16 @@ OC.L10N.register(
"Public" : "Público",
"Post to public timelines" : "Publicar en timelines públicos",
"Unfollow" : "Dejar de seguir",
"Following" : "Siguiendo",
"Follow" : "Seguir",
"posts" : "entradas",
"following" : "siguiendo",
"followers" : "seguidores",
"No accounts found" : "No se sigue a ninguna cuenta",
"No results found" : "No se han encontrado resultados",
"There were no results for your search:" : "No ha habido resultados para tu búsqueda:",
"Searching for" : "Buscando",
"Reply" : "Responder",
"More actions" : "Más acciones",
"Delete post" : "Eliminar post",
"No posts found" : "No se han encontrado entradas",
"Posts from people you follow will show up here" : "Las entradas de gente a la que sigues aparecerán aquí",
"No direct messages found" : "No se han encontrado mensajes directos",
@ -45,6 +49,16 @@ OC.L10N.register(
"Posts from other people on this instance will show up here" : "Las entradas de otras personas en esta instancia aparecerán aquí",
"No global posts found" : "No se han encontrado entradas globales",
"Posts from federated instances will show up here" : "Las entradas de instancias federadas aparecerán aquí",
"No posts found for this tag" : "No se han encontrado posts para esta etiqueta",
"Follow on Nextcloud Social" : "Seguir en Nextcloud Social",
"Hello" : "Hola",
"Please confirm that you want to follow this account:" : "Por favor, confirma que quieres seguir a esta cuenta:",
"You are following this account" : "Estás siguiendo a esta cuenta",
"Close" : "Cerrar",
"You are going to follow:" : "Vas a seguir a:",
"name@domain of your federation account" : "nombre@dominio de tu cuenta federada",
"Continue" : "Continuar",
"This step is needed as the user is probably not registered on the same server as you are. We will redirect you to your homeserver to follow this account." : "Este paso es necesario porque el usuario probablemente no está registrado en el mismo servidor que tú. Te redirigiremos a tu servidor para seguir a esta cuenta",
"User not found" : "Usuario no encontrado",
"Sorry, we could not find the account of {userId}" : "Lo sentimos, no hemos podido encontrar la cuenta de {userId}",
"Nextcloud becomes part of the federated social networks!" : "¡Nextcloud pasa a ser parte de las redes sociales federadas!",

Wyświetl plik

@ -15,6 +15,7 @@
"Profile" : "Perfil",
"Local timeline" : "Timeline local",
"Global timeline" : "Timeline global",
"Following" : "Siguiendo",
"Post publicly" : "Publicar públicamente",
"Post to followers" : "Publicar para seguidores",
"Post to recipients" : "Publicar para destinatarios",
@ -28,13 +29,16 @@
"Public" : "Público",
"Post to public timelines" : "Publicar en timelines públicos",
"Unfollow" : "Dejar de seguir",
"Following" : "Siguiendo",
"Follow" : "Seguir",
"posts" : "entradas",
"following" : "siguiendo",
"followers" : "seguidores",
"No accounts found" : "No se sigue a ninguna cuenta",
"No results found" : "No se han encontrado resultados",
"There were no results for your search:" : "No ha habido resultados para tu búsqueda:",
"Searching for" : "Buscando",
"Reply" : "Responder",
"More actions" : "Más acciones",
"Delete post" : "Eliminar post",
"No posts found" : "No se han encontrado entradas",
"Posts from people you follow will show up here" : "Las entradas de gente a la que sigues aparecerán aquí",
"No direct messages found" : "No se han encontrado mensajes directos",
@ -43,6 +47,16 @@
"Posts from other people on this instance will show up here" : "Las entradas de otras personas en esta instancia aparecerán aquí",
"No global posts found" : "No se han encontrado entradas globales",
"Posts from federated instances will show up here" : "Las entradas de instancias federadas aparecerán aquí",
"No posts found for this tag" : "No se han encontrado posts para esta etiqueta",
"Follow on Nextcloud Social" : "Seguir en Nextcloud Social",
"Hello" : "Hola",
"Please confirm that you want to follow this account:" : "Por favor, confirma que quieres seguir a esta cuenta:",
"You are following this account" : "Estás siguiendo a esta cuenta",
"Close" : "Cerrar",
"You are going to follow:" : "Vas a seguir a:",
"name@domain of your federation account" : "nombre@dominio de tu cuenta federada",
"Continue" : "Continuar",
"This step is needed as the user is probably not registered on the same server as you are. We will redirect you to your homeserver to follow this account." : "Este paso es necesario porque el usuario probablemente no está registrado en el mismo servidor que tú. Te redirigiremos a tu servidor para seguir a esta cuenta",
"User not found" : "Usuario no encontrado",
"Sorry, we could not find the account of {userId}" : "Lo sentimos, no hemos podido encontrar la cuenta de {userId}",
"Nextcloud becomes part of the federated social networks!" : "¡Nextcloud pasa a ser parte de las redes sociales federadas!",

30
l10n/es_AR.js 100644
Wyświetl plik

@ -0,0 +1,30 @@
OC.L10N.register(
"social",
{
"Social" : "Social",
"🎉 Nextcloud becomes part of the federated social networks!" : "🎉 ¡Nextcloud se convierte en parte de las redes sociales federadas!",
"Social needs the .well-known automatic discovery to be properly set up. If Nextcloud is not installed in the root of the domain, it is often the case that Nextcloud can't configure this automatically. To use Social, the admin of this Nextcloud instance needs to manually configure the .well-known redirects: " : "Lo social necesita que el descubrimiento automático bien conocido se configure correctamente. Si Nextcloud no está instalado en la raíz del dominio, a menudo es el caso que Nextcloud no puede configurar esto automáticamente. Para usar Social, el administrador de esta instancia de Nextcloud necesita configurar manualmente los redireccionamientos conocidos.",
"Open documentation" : "Abrir documentación",
"Social app setup" : "Configuración de la aplicación social",
"Finish setup" : "Terminar la configuración",
"Home" : "Casa",
"Direct messages" : "Mensajes directos",
"Profile" : "Perfil",
"Local timeline" : "Línea de tiempo local",
"Global timeline" : "Línea de tiempo global",
"Post publicly" : "Publicar públicamente",
"Post to followers" : "Publicar en seguidores",
"Post to recipients" : "Publicar en destinatarios",
"Post unlisted" : "Publicar sin listar",
"Direct" : "Directo",
"Post to mentioned users only" : "Publicar solo para los usuarios mencionados",
"Unlisted" : "No listado",
"Do not post to public timelines" : "No publicar en líneas de tiempo públicas",
"Followers" : "Seguidores",
"Post to followers only" : "Publicar solo en seguidores",
"Public" : "Público",
"Follow" : "Seguir",
"posts" : "publicaciones",
"following" : "siguiendo"
},
"nplurals=2; plural=(n != 1);");

28
l10n/es_AR.json 100644
Wyświetl plik

@ -0,0 +1,28 @@
{ "translations": {
"Social" : "Social",
"🎉 Nextcloud becomes part of the federated social networks!" : "🎉 ¡Nextcloud se convierte en parte de las redes sociales federadas!",
"Social needs the .well-known automatic discovery to be properly set up. If Nextcloud is not installed in the root of the domain, it is often the case that Nextcloud can't configure this automatically. To use Social, the admin of this Nextcloud instance needs to manually configure the .well-known redirects: " : "Lo social necesita que el descubrimiento automático bien conocido se configure correctamente. Si Nextcloud no está instalado en la raíz del dominio, a menudo es el caso que Nextcloud no puede configurar esto automáticamente. Para usar Social, el administrador de esta instancia de Nextcloud necesita configurar manualmente los redireccionamientos conocidos.",
"Open documentation" : "Abrir documentación",
"Social app setup" : "Configuración de la aplicación social",
"Finish setup" : "Terminar la configuración",
"Home" : "Casa",
"Direct messages" : "Mensajes directos",
"Profile" : "Perfil",
"Local timeline" : "Línea de tiempo local",
"Global timeline" : "Línea de tiempo global",
"Post publicly" : "Publicar públicamente",
"Post to followers" : "Publicar en seguidores",
"Post to recipients" : "Publicar en destinatarios",
"Post unlisted" : "Publicar sin listar",
"Direct" : "Directo",
"Post to mentioned users only" : "Publicar solo para los usuarios mencionados",
"Unlisted" : "No listado",
"Do not post to public timelines" : "No publicar en líneas de tiempo públicas",
"Followers" : "Seguidores",
"Post to followers only" : "Publicar solo en seguidores",
"Public" : "Público",
"Follow" : "Seguir",
"posts" : "publicaciones",
"following" : "siguiendo"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

Wyświetl plik

@ -1,18 +0,0 @@
OC.L10N.register(
"social",
{
"Open documentation" : "Ireki dokumentazioa",
"Finish setup" : "Amaitu ezarpena",
"Home" : "Hasiera",
"Direct messages" : "Mezu zuzenak",
"Profile" : "Profila",
"Direct" : "Zuzena",
"Followers" : "Jarraitzaileak",
"Public" : "Publikoa",
"Following" : "Jarraitzen",
"Follow" : "Jarraitu",
"following" : "jarraitzen",
"No accounts found" : "Ez da konturik aurkitu",
"User not found" : "Ez da erabiltzailea aurkitu"
},
"nplurals=2; plural=(n != 1);");

Wyświetl plik

@ -1,16 +0,0 @@
{ "translations": {
"Open documentation" : "Ireki dokumentazioa",
"Finish setup" : "Amaitu ezarpena",
"Home" : "Hasiera",
"Direct messages" : "Mezu zuzenak",
"Profile" : "Profila",
"Direct" : "Zuzena",
"Followers" : "Jarraitzaileak",
"Public" : "Publikoa",
"Following" : "Jarraitzen",
"Follow" : "Jarraitu",
"following" : "jarraitzen",
"No accounts found" : "Ez da konturik aurkitu",
"User not found" : "Ez da erabiltzailea aurkitu"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

Wyświetl plik

@ -13,6 +13,7 @@ OC.L10N.register(
"Profile" : "Profiili",
"Local timeline" : "Paikallinen aikajana",
"Global timeline" : "Julkinen aikajana",
"Following" : "Seuraa",
"Post publicly" : "Julkaisun julkisuus",
"Post to followers" : "Julkaise seuraajille",
"Post to recipients" : "Julkaise vastaanottajille",
@ -26,12 +27,12 @@ OC.L10N.register(
"Public" : "Julkinen",
"Post to public timelines" : "Julkaise julkisille aikajanoille",
"Unfollow" : "Lopeta seuraaminen",
"Following" : "Seuraa",
"Follow" : "Seuraa",
"posts" : "julkaisut",
"following" : "seuraa",
"followers" : "seuraajat",
"No accounts found" : "Tilejä ei löytynyt",
"No results found" : "Tuloksia ei löytynyt",
"There were no results for your search:" : "Hakusi ei palauttanut tuloksia:",
"Searching for" : "Haetaan",
"No posts found" : "Julkaisuja ei löytynyt",
"Posts from people you follow will show up here" : "Seuraamiesi käyttäjien julkaisut näkyvät täällä",
@ -41,6 +42,7 @@ OC.L10N.register(
"Posts from other people on this instance will show up here" : "Muiden ihmisten tähän asennukseen kirjoitetut julkaisut näkyvät täällä",
"No global posts found" : "Yleisiä julkaisuja ei löytynyt",
"Posts from federated instances will show up here" : "Yhteenliitettyihin asennuksiin tehdyt julkaisut näkyvät täällä",
"User not found" : "Käyttäjää ei löytynyt",
"Nextcloud becomes part of the federated social networks!" : "Nextcloudista tulee yhteenliitettyjen sosiaalisten verkostojen osa!",
"We automatically created a Social account for you. Your Social ID is the same as your federated cloud ID:" : "Loimme sinulle automaattisesti Sosiaalinen -tilin. Sinun Social ID on sama kun yhteenliitettyjen pilvien ID:",
"Since you are new to Social, start by following the official Nextcloud account so you don't miss any news" : "Koska olet uusi käyttäjä, aloita seuraamalla virallista Nextcloud -tiliä ettet jää uutisista paitsi",

Wyświetl plik

@ -11,6 +11,7 @@
"Profile" : "Profiili",
"Local timeline" : "Paikallinen aikajana",
"Global timeline" : "Julkinen aikajana",
"Following" : "Seuraa",
"Post publicly" : "Julkaisun julkisuus",
"Post to followers" : "Julkaise seuraajille",
"Post to recipients" : "Julkaise vastaanottajille",
@ -24,12 +25,12 @@
"Public" : "Julkinen",
"Post to public timelines" : "Julkaise julkisille aikajanoille",
"Unfollow" : "Lopeta seuraaminen",
"Following" : "Seuraa",
"Follow" : "Seuraa",
"posts" : "julkaisut",
"following" : "seuraa",
"followers" : "seuraajat",
"No accounts found" : "Tilejä ei löytynyt",
"No results found" : "Tuloksia ei löytynyt",
"There were no results for your search:" : "Hakusi ei palauttanut tuloksia:",
"Searching for" : "Haetaan",
"No posts found" : "Julkaisuja ei löytynyt",
"Posts from people you follow will show up here" : "Seuraamiesi käyttäjien julkaisut näkyvät täällä",
@ -39,6 +40,7 @@
"Posts from other people on this instance will show up here" : "Muiden ihmisten tähän asennukseen kirjoitetut julkaisut näkyvät täällä",
"No global posts found" : "Yleisiä julkaisuja ei löytynyt",
"Posts from federated instances will show up here" : "Yhteenliitettyihin asennuksiin tehdyt julkaisut näkyvät täällä",
"User not found" : "Käyttäjää ei löytynyt",
"Nextcloud becomes part of the federated social networks!" : "Nextcloudista tulee yhteenliitettyjen sosiaalisten verkostojen osa!",
"We automatically created a Social account for you. Your Social ID is the same as your federated cloud ID:" : "Loimme sinulle automaattisesti Sosiaalinen -tilin. Sinun Social ID on sama kun yhteenliitettyjen pilvien ID:",
"Since you are new to Social, start by following the official Nextcloud account so you don't miss any news" : "Koska olet uusi käyttäjä, aloita seuraamalla virallista Nextcloud -tiliä ettet jää uutisista paitsi",

Wyświetl plik

@ -2,27 +2,65 @@ OC.L10N.register(
"social",
{
"Social" : "Social",
"🎉 Nextcloud becomes part of the federated social networks!" : "🎉 Nextcloud devient acteur des réseaux sociaux fédérés !",
"🎉 Nextcloud becomes part of the federated social networks!" : "🎉 Nextcloud fait maintenant partie des réseaux sociaux fédérés !",
"** Disclaimer: this is an ALPHA version **\n\n**🎉 Nextcloud becomes part of the federated social networks!**\n\n**🙋 Find your friends:** No matter if they use Nextcloud, 🐘 Mastodon, 🇫 Friendica, and soon ✱ Diaspora, 👹 MediaGoblin and more – you can follow them!\n\n**📜 Profile info:** No need to fill out more profiles – your info from Nextcloud will be used and extended.\n\n**👐 Own your posts:** Everything you post stays on your Nextcloud!\n\n**🕸 Open standards:** We use the established ActivityPub standard!" : "** Attention : ceci est une version ALPHA **\n\n**🎉 Nextcloud devient acteur des réseaux sociaux fédérés !**\n\n**🙋 Trouver vos amis :** Peu importe qu'ils utilisent Nextcloud, 🐘 Mastodon, 🇫 Friendica, et bientôt ✱ Diaspora, 👹 MediaGoblin et plus encore – vous pouvez les suivre !\n\n**📜 Informations de profil :** Pas besoin de remplir un profil de plus – vos informations provenant de Nextcloud seront utilisées et étendue.\n\n**👐 Détenez vos posts :** Tout ce que vous postez reste sur votre Nextcloud !\n\n**🕸 Normes libre :** Nous utilisons le standard ActivityPub !",
".well-known/webfinger isn't properly set up!" : ".well-known/webfinger n'est pas paramétré correctement !",
"Social needs the .well-known automatic discovery to be properly set up. If Nextcloud is not installed in the root of the domain, it is often the case that Nextcloud can't configure this automatically. To use Social, the admin of this Nextcloud instance needs to manually configure the .well-known redirects: " : "Les réseaux sociaux ont besoin que le fichier .well-known puisse être découvert automatiquement pour être mis en place correctement. Si Nextcloud n'est pas installé à la racine du domaine, il est courant que dans ce cas là Nextcloud n'arrive pas à configurer cela automatiquement. Pour utiliser l'intégration des réseaux sociaux, l'administrateur de cette instance de Nextcloud doit configurer manuellement les redditions .well-known :",
"Open documentation" : "Ouvrir la documentation",
"Social app setup" : "Configuration de l'appli Social",
"ActivityPub requires a fixed URL to make entries unique. Note that this can not be changed later without resetting the Social app." : "ActivityPub requiert une URL fixe pour rendre les entrées uniques. Notez que cela ne peut être changé plus tard sans réinitialiser l'appli Social.",
"ActivityPub URL base" : "Base de l'URL ActivityPub",
"Finish setup" : "Terminer la configuration",
"The Social app needs to be set up by the server administrator." : "L'appli Social a besoin d'être configurée par l'administrateur du serveur.",
"Home" : "Accueil",
"Direct messages" : "Messages directs",
"Profile" : "Profil",
"Followers" : "Abonnés",
"Public" : "Public",
"Unfollow" : "Ne plus suivre",
"Local timeline" : "Fil local",
"Global timeline" : "Fil global",
"Following" : "Suivi",
"Post publicly" : "Poster publiquement",
"Post to followers" : "Poster aux abonnés",
"Post to recipients" : "Poster aux destinataires",
"Post unlisted" : "Post non répertorié",
"Direct" : "Direct",
"Post to mentioned users only" : "Poster aux utilisateurs mentionnées seulement",
"Unlisted" : "Non listé",
"Do not post to public timelines" : "Ne pas poster dans les fils publics",
"Followers" : "Abonnés",
"Post to followers only" : "Poster aux abonnés seulement",
"Public" : "Public",
"Post to public timelines" : "Poster aux fils publics",
"Unfollow" : "Ne plus suivre",
"Follow" : "Suivre",
"posts" : "messages",
"following" : "suivi",
"followers" : "abonnés",
"No results found" : "Aucun résultat trouvé",
"There were no results for your search:" : "Aucun résultat n'a été trouvé pour votre recherche :",
"Searching for" : "Recherche de",
"Reply" : "Répondre",
"More actions" : "Plus d'actions",
"No posts found" : "Aucun message trouvé",
"Posts from people you follow will show up here" : "Les messages des personnes que vous suivez apparaitront ici",
"No direct messages found" : "Aucun message direct",
"Posts directed to you will show up here" : "Les messages qui vous sont adressés apparaitront ici",
"No local posts found" : "Aucun message local trouvé",
"Posts from other people on this instance will show up here" : "Les messages d'autres personnes de cette instance apparaitront ici",
"No global posts found" : "Aucun message global trouvé",
"Posts from federated instances will show up here" : "Les messages des instances fédérées apparaitront ici",
"No posts found for this tag" : "Aucun post trouvé avec cette étiquette",
"Hello" : "Bonjour",
"Please confirm that you want to follow this account:" : "Veuillez confirmer que vous souhaitez suivre ce compte :",
"You are following this account" : "Vous suivez ce compte",
"Close" : "Fermer",
"You are going to follow:" : "Vous allez suivre :",
"Continue" : "Continuer",
"This step is needed as the user is probably not registered on the same server as you are. We will redirect you to your homeserver to follow this account." : "Cette étape est nécessaire car l'utilisateur n'est probablement pas inscrit sur le même serveur que vous. Nous vous redirigerons vers votre propre serveur pour suivre ce compte",
"User not found" : "Utilisateur non trouvé",
"Sorry, we could not find the account of {userId}" : "Désolé, impossible de trouver le compte {userId}",
"Nextcloud becomes part of the federated social networks!" : "Nextcloud fait maintenant partie des réseaux sociaux fédérés !",
"We automatically created a Social account for you. Your Social ID is the same as your federated cloud ID:" : "Nous avons automatiquement créé un compte Social pour vous. Votre ID Social est le même que votre ID cloud fédéré :",
"Since you are new to Social, start by following the official Nextcloud account so you don't miss any news" : "Comme vous êtes nouveau dans Social, commencez par suivre le compte officiel de Nextcloud pour ne louper aucune nouvelle",
"Follow Nextcloud on mastodon.xyz" : "Suivez Nextcloud sur mastodon.xyz"
},
"nplurals=2; plural=(n > 1);");

Wyświetl plik

@ -1,26 +1,64 @@
{ "translations": {
"Social" : "Social",
"🎉 Nextcloud becomes part of the federated social networks!" : "🎉 Nextcloud devient acteur des réseaux sociaux fédérés !",
"🎉 Nextcloud becomes part of the federated social networks!" : "🎉 Nextcloud fait maintenant partie des réseaux sociaux fédérés !",
"** Disclaimer: this is an ALPHA version **\n\n**🎉 Nextcloud becomes part of the federated social networks!**\n\n**🙋 Find your friends:** No matter if they use Nextcloud, 🐘 Mastodon, 🇫 Friendica, and soon ✱ Diaspora, 👹 MediaGoblin and more – you can follow them!\n\n**📜 Profile info:** No need to fill out more profiles – your info from Nextcloud will be used and extended.\n\n**👐 Own your posts:** Everything you post stays on your Nextcloud!\n\n**🕸 Open standards:** We use the established ActivityPub standard!" : "** Attention : ceci est une version ALPHA **\n\n**🎉 Nextcloud devient acteur des réseaux sociaux fédérés !**\n\n**🙋 Trouver vos amis :** Peu importe qu'ils utilisent Nextcloud, 🐘 Mastodon, 🇫 Friendica, et bientôt ✱ Diaspora, 👹 MediaGoblin et plus encore – vous pouvez les suivre !\n\n**📜 Informations de profil :** Pas besoin de remplir un profil de plus – vos informations provenant de Nextcloud seront utilisées et étendue.\n\n**👐 Détenez vos posts :** Tout ce que vous postez reste sur votre Nextcloud !\n\n**🕸 Normes libre :** Nous utilisons le standard ActivityPub !",
".well-known/webfinger isn't properly set up!" : ".well-known/webfinger n'est pas paramétré correctement !",
"Social needs the .well-known automatic discovery to be properly set up. If Nextcloud is not installed in the root of the domain, it is often the case that Nextcloud can't configure this automatically. To use Social, the admin of this Nextcloud instance needs to manually configure the .well-known redirects: " : "Les réseaux sociaux ont besoin que le fichier .well-known puisse être découvert automatiquement pour être mis en place correctement. Si Nextcloud n'est pas installé à la racine du domaine, il est courant que dans ce cas là Nextcloud n'arrive pas à configurer cela automatiquement. Pour utiliser l'intégration des réseaux sociaux, l'administrateur de cette instance de Nextcloud doit configurer manuellement les redditions .well-known :",
"Open documentation" : "Ouvrir la documentation",
"Social app setup" : "Configuration de l'appli Social",
"ActivityPub requires a fixed URL to make entries unique. Note that this can not be changed later without resetting the Social app." : "ActivityPub requiert une URL fixe pour rendre les entrées uniques. Notez que cela ne peut être changé plus tard sans réinitialiser l'appli Social.",
"ActivityPub URL base" : "Base de l'URL ActivityPub",
"Finish setup" : "Terminer la configuration",
"The Social app needs to be set up by the server administrator." : "L'appli Social a besoin d'être configurée par l'administrateur du serveur.",
"Home" : "Accueil",
"Direct messages" : "Messages directs",
"Profile" : "Profil",
"Followers" : "Abonnés",
"Public" : "Public",
"Unfollow" : "Ne plus suivre",
"Local timeline" : "Fil local",
"Global timeline" : "Fil global",
"Following" : "Suivi",
"Post publicly" : "Poster publiquement",
"Post to followers" : "Poster aux abonnés",
"Post to recipients" : "Poster aux destinataires",
"Post unlisted" : "Post non répertorié",
"Direct" : "Direct",
"Post to mentioned users only" : "Poster aux utilisateurs mentionnées seulement",
"Unlisted" : "Non listé",
"Do not post to public timelines" : "Ne pas poster dans les fils publics",
"Followers" : "Abonnés",
"Post to followers only" : "Poster aux abonnés seulement",
"Public" : "Public",
"Post to public timelines" : "Poster aux fils publics",
"Unfollow" : "Ne plus suivre",
"Follow" : "Suivre",
"posts" : "messages",
"following" : "suivi",
"followers" : "abonnés",
"No results found" : "Aucun résultat trouvé",
"There were no results for your search:" : "Aucun résultat n'a été trouvé pour votre recherche :",
"Searching for" : "Recherche de",
"Reply" : "Répondre",
"More actions" : "Plus d'actions",
"No posts found" : "Aucun message trouvé",
"Posts from people you follow will show up here" : "Les messages des personnes que vous suivez apparaitront ici",
"No direct messages found" : "Aucun message direct",
"Posts directed to you will show up here" : "Les messages qui vous sont adressés apparaitront ici",
"No local posts found" : "Aucun message local trouvé",
"Posts from other people on this instance will show up here" : "Les messages d'autres personnes de cette instance apparaitront ici",
"No global posts found" : "Aucun message global trouvé",
"Posts from federated instances will show up here" : "Les messages des instances fédérées apparaitront ici",
"No posts found for this tag" : "Aucun post trouvé avec cette étiquette",
"Hello" : "Bonjour",
"Please confirm that you want to follow this account:" : "Veuillez confirmer que vous souhaitez suivre ce compte :",
"You are following this account" : "Vous suivez ce compte",
"Close" : "Fermer",
"You are going to follow:" : "Vous allez suivre :",
"Continue" : "Continuer",
"This step is needed as the user is probably not registered on the same server as you are. We will redirect you to your homeserver to follow this account." : "Cette étape est nécessaire car l'utilisateur n'est probablement pas inscrit sur le même serveur que vous. Nous vous redirigerons vers votre propre serveur pour suivre ce compte",
"User not found" : "Utilisateur non trouvé",
"Sorry, we could not find the account of {userId}" : "Désolé, impossible de trouver le compte {userId}",
"Nextcloud becomes part of the federated social networks!" : "Nextcloud fait maintenant partie des réseaux sociaux fédérés !",
"We automatically created a Social account for you. Your Social ID is the same as your federated cloud ID:" : "Nous avons automatiquement créé un compte Social pour vous. Votre ID Social est le même que votre ID cloud fédéré :",
"Since you are new to Social, start by following the official Nextcloud account so you don't miss any news" : "Comme vous êtes nouveau dans Social, commencez par suivre le compte officiel de Nextcloud pour ne louper aucune nouvelle",
"Follow Nextcloud on mastodon.xyz" : "Suivez Nextcloud sur mastodon.xyz"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
}

Wyświetl plik

@ -3,53 +3,67 @@ OC.L10N.register(
{
"Social" : "Social",
"🎉 Nextcloud becomes part of the federated social networks!" : "🎉 Nextcloud xa forma parte das redes sociais federadas!",
"** Disclaimer: this is an ALPHA version **\n\n**🎉 Nextcloud becomes part of the federated social networks!**\n\n**🙋 Find your friends:** No matter if they use Nextcloud, 🐘 Mastodon, 🇫 Friendica, and soon ✱ Diaspora, 👹 MediaGoblin and more – you can follow them!\n\n**📜 Profile info:** No need to fill out more profiles – your info from Nextcloud will be used and extended.\n\n**👐 Own your posts:** Everything you post stays on your Nextcloud!\n\n**🕸 Open standards:** We use the established ActivityPub standard!" : "** Aviso: esta é unha versión ALPHA **\n\n**🎉 Nextcloud forma parte da rede social federada!**\n\n**🙋 Atope os seus amigos:** Non importa se utilizan, 🐘 Mastodon, 🇫 Friendica, e pronto ✱ Diaspora, 👹 MediaGoblin e máis – pode seguilas!\n\n**📜 Info de perfil:** Non precisa completar máis perfís – utilizarase e publicarase a súa información de Nextcloud.\n\n**👐 Posúa o seu contido:** Todo o que publique permanece no seu Nextcloud!\n\n**🕸 Protocolos abertos:** Utilizamos o estándar establecido ActivityPub!",
"** Disclaimer: this is an ALPHA version **\n\n**🎉 Nextcloud becomes part of the federated social networks!**\n\n**🙋 Find your friends:** No matter if they use Nextcloud, 🐘 Mastodon, 🇫 Friendica, and soon ✱ Diaspora, 👹 MediaGoblin and more – you can follow them!\n\n**📜 Profile info:** No need to fill out more profiles – your info from Nextcloud will be used and extended.\n\n**👐 Own your posts:** Everything you post stays on your Nextcloud!\n\n**🕸 Open standards:** We use the established ActivityPub standard!" : "** Aviso: esta é unha versión ALPHA **\n\n**🎉 Nextcloud forma parte da rede social federada!**\n\n**🙋 Atope os seus amigos:** Non importa se empregan, 🐘 Mastodon, 🇫 Friendica, e pronto ✱ Diaspora, 👹 MediaGoblin e máis – pode seguilas!\n\n**📜 Info de perfil:** Non precisa completar máis perfís – utilizarase e publicarase a súa información de Nextcloud.\n\n**👐 Posúa o seu contido:** Todo o que publique permanece no seu Nextcloud!\n\n**🕸 Protocolos abertos:** Utilizamos o estándar estabelecido ActivityPub!",
".well-known/webfinger isn't properly set up!" : ".well-known/webfinger non está correctamente configurado!",
"Social needs the .well-known automatic discovery to be properly set up. If Nextcloud is not installed in the root of the domain, it is often the case that Nextcloud can't configure this automatically. To use Social, the admin of this Nextcloud instance needs to manually configure the .well-known redirects: " : "Social precisa que o descubrimento automático .well-known sexa correctamente configurado. Se Nextcloud non está instalado na raíz do dominio soe acontecer que non configura de xeito automático o servizo. Para utilizar Social, a administración de esta instancia Nextcloud precisa configurar manualmente a redireción .well-known:",
"Social needs the .well-known automatic discovery to be properly set up. If Nextcloud is not installed in the root of the domain, it is often the case that Nextcloud can't configure this automatically. To use Social, the admin of this Nextcloud instance needs to manually configure the .well-known redirects: " : "Social precisa que o descubrimento automático .well-known sexa configurado correctamente. Se Nextcloud non está instalado na raíz do dominio soe acontecer que non configura de xeito automático o servizo. Para utilizar Social, a administración desta instancia Nextcloud precisa configurar manualmente a redireción .well-known:",
"Open documentation" : "Abrir a documentación",
"Social app setup" : "Configurar Social app",
"ActivityPub requires a fixed URL to make entries unique. Note that this can not be changed later without resetting the Social app." : "ActivityPub precisa unha URL fixa para facer as entradas únicas. Déase conta de que esto non se poderá cambiar posteriormente sen restablecer a app Social.",
"Social app setup" : "Configurar o aplicativo Social",
"ActivityPub requires a fixed URL to make entries unique. Note that this can not be changed later without resetting the Social app." : "ActivityPub precisa un URL fixo para facer as entradas únicas. Déase conta de que isto non se poderá cambiar posteriormente sen restabelecer o aplicativo Social.",
"ActivityPub URL base" : "URL base de ActivityPub",
"Finish setup" : "Rematar instalación",
"The Social app needs to be set up by the server administrator." : "A app Social precisa ser instalada pola administración do servidor.",
"The Social app needs to be set up by the server administrator." : "O aplicativo Social precisa ser instalado pola administración do servidor.",
"Home" : "Inicio",
"Direct messages" : "Mensaxes directas",
"Profile" : "Perfil",
"Local timeline" : "Liña temporal local",
"Global timeline" : "Liña temporal federada",
"Following" : "Seguindo",
"Post publicly" : "Mensaxe pública",
"Post to followers" : "Mensaxe para seguidoras",
"Post to followers" : "Mensaxe para seguidores",
"Post to recipients" : "Mensaxe para mencionadas",
"Post unlisted" : "Mensaxe non listada",
"Direct" : "Directa",
"Post to mentioned users only" : "Mensaxe só para as usuarias mencionadas",
"Post to mentioned users only" : "Mensaxe só para os usuarios mencionados",
"Unlisted" : "Non listada",
"Do not post to public timelines" : "Non publicar en liñas temporais públicas",
"Followers" : "Seguidoras",
"Post to followers only" : "Mensaxe só para seguidoras",
"Followers" : "Seguidores",
"Post to followers only" : "Mensaxe só para seguidores",
"Public" : "Público",
"Post to public timelines" : "Publicar en liñas temporais públicas",
"Unfollow" : "Deixar de seguir",
"Following" : "Seguindo",
"Follow" : "Seguir",
"posts" : "mensaxes",
"following" : "seguindo",
"followers" : "seguidoras",
"No accounts found" : "Non se atoparon contas",
"followers" : "seguidores",
"No results found" : "Non se atoparon resultados",
"There were no results for your search:" : "Non houbo resultados para a súa busca:",
"Searching for" : "Buscando",
"Reply" : "Responder",
"More actions" : "Máis accións",
"Delete post" : "Eliminar mensaxe",
"No posts found" : "Non se atoparon mensaxes",
"Posts from people you follow will show up here" : "Mostraranse aquí as mensaxes da xente que vostede segue",
"Posts from people you follow will show up here" : "As publicacións da xente que vostede segue amosaranse aquí",
"No direct messages found" : "Non se atoparon mensaxes directas",
"Posts directed to you will show up here" : "A mensaxes dirixidas a vostede mostraranse aquí",
"Posts directed to you will show up here" : "A mensaxes dirixidas a vostede amosaranse aquí",
"No local posts found" : "Non se atoparon publicacións locais",
"Posts from other people on this instance will show up here" : "Publicacións de outras persoas de esta instancia mostraranse aquí",
"Posts from other people on this instance will show up here" : "As publicacións doutras persoas desta instancia amosaranse aquí",
"No global posts found" : "Non hai mensaxes federadas",
"Posts from federated instances will show up here" : "As publicacións das instancias federadas mostraranse aquí",
"Posts from federated instances will show up here" : "As publicacións das instancias federadas amosaranse aquí",
"No posts found for this tag" : "Non se atoparon mensaxes por esta etiqueta",
"Follow on Nextcloud Social" : "Seguir no Nextcloud Social",
"Hello" : "Ola",
"Please confirm that you want to follow this account:" : "Confirme que quere seguir esta conta:",
"You are following this account" : "Vostede está a seguir esta conta",
"Close" : "Pechar",
"You are going to follow:" : "Vai seguir:",
"name@domain of your federation account" : "nome@dominio da súa conta de federación",
"Continue" : "Continuar",
"This step is needed as the user is probably not registered on the same server as you are. We will redirect you to your homeserver to follow this account." : "Este paso é necesario porque probablemente o usuario non estea rexistrado no mesmo servidor que está. Redirixímolo ao seu servidor de hospedaxe para seguir esta conta.",
"User not found" : "Non se atopou o usuario",
"Sorry, we could not find the account of {userId}" : " Mágoa, non foi posíbel atopar a conta de {userId}",
"Nextcloud becomes part of the federated social networks!" : "Nextcloud pasa a formar parte das redes sociais federadas!",
"We automatically created a Social account for you. Your Social ID is the same as your federated cloud ID:" : "Creamos de xeito automático unha conta Social para vostede. O seu ID Social é o mesmo que o seu ID de nube federada:",
"Since you are new to Social, start by following the official Nextcloud account so you don't miss any news" : "Xa que vostede é nova en Social, pode comezar seguindo a conta oficial de Nextcloud así non perderá ningunha nova",
"Since you are new to Social, start by following the official Nextcloud account so you don't miss any news" : "Xa que vostede é novo en Social, pode comezar seguindo a conta oficial de Nextcloud así non perderá ningunha nova",
"Follow Nextcloud on mastodon.xyz" : "Siga a Nextcloud en mastodon.xyz"
},
"nplurals=2; plural=(n != 1);");

Wyświetl plik

@ -1,53 +1,67 @@
{ "translations": {
"Social" : "Social",
"🎉 Nextcloud becomes part of the federated social networks!" : "🎉 Nextcloud xa forma parte das redes sociais federadas!",
"** Disclaimer: this is an ALPHA version **\n\n**🎉 Nextcloud becomes part of the federated social networks!**\n\n**🙋 Find your friends:** No matter if they use Nextcloud, 🐘 Mastodon, 🇫 Friendica, and soon ✱ Diaspora, 👹 MediaGoblin and more – you can follow them!\n\n**📜 Profile info:** No need to fill out more profiles – your info from Nextcloud will be used and extended.\n\n**👐 Own your posts:** Everything you post stays on your Nextcloud!\n\n**🕸 Open standards:** We use the established ActivityPub standard!" : "** Aviso: esta é unha versión ALPHA **\n\n**🎉 Nextcloud forma parte da rede social federada!**\n\n**🙋 Atope os seus amigos:** Non importa se utilizan, 🐘 Mastodon, 🇫 Friendica, e pronto ✱ Diaspora, 👹 MediaGoblin e máis – pode seguilas!\n\n**📜 Info de perfil:** Non precisa completar máis perfís – utilizarase e publicarase a súa información de Nextcloud.\n\n**👐 Posúa o seu contido:** Todo o que publique permanece no seu Nextcloud!\n\n**🕸 Protocolos abertos:** Utilizamos o estándar establecido ActivityPub!",
"** Disclaimer: this is an ALPHA version **\n\n**🎉 Nextcloud becomes part of the federated social networks!**\n\n**🙋 Find your friends:** No matter if they use Nextcloud, 🐘 Mastodon, 🇫 Friendica, and soon ✱ Diaspora, 👹 MediaGoblin and more – you can follow them!\n\n**📜 Profile info:** No need to fill out more profiles – your info from Nextcloud will be used and extended.\n\n**👐 Own your posts:** Everything you post stays on your Nextcloud!\n\n**🕸 Open standards:** We use the established ActivityPub standard!" : "** Aviso: esta é unha versión ALPHA **\n\n**🎉 Nextcloud forma parte da rede social federada!**\n\n**🙋 Atope os seus amigos:** Non importa se empregan, 🐘 Mastodon, 🇫 Friendica, e pronto ✱ Diaspora, 👹 MediaGoblin e máis – pode seguilas!\n\n**📜 Info de perfil:** Non precisa completar máis perfís – utilizarase e publicarase a súa información de Nextcloud.\n\n**👐 Posúa o seu contido:** Todo o que publique permanece no seu Nextcloud!\n\n**🕸 Protocolos abertos:** Utilizamos o estándar estabelecido ActivityPub!",
".well-known/webfinger isn't properly set up!" : ".well-known/webfinger non está correctamente configurado!",
"Social needs the .well-known automatic discovery to be properly set up. If Nextcloud is not installed in the root of the domain, it is often the case that Nextcloud can't configure this automatically. To use Social, the admin of this Nextcloud instance needs to manually configure the .well-known redirects: " : "Social precisa que o descubrimento automático .well-known sexa correctamente configurado. Se Nextcloud non está instalado na raíz do dominio soe acontecer que non configura de xeito automático o servizo. Para utilizar Social, a administración de esta instancia Nextcloud precisa configurar manualmente a redireción .well-known:",
"Social needs the .well-known automatic discovery to be properly set up. If Nextcloud is not installed in the root of the domain, it is often the case that Nextcloud can't configure this automatically. To use Social, the admin of this Nextcloud instance needs to manually configure the .well-known redirects: " : "Social precisa que o descubrimento automático .well-known sexa configurado correctamente. Se Nextcloud non está instalado na raíz do dominio soe acontecer que non configura de xeito automático o servizo. Para utilizar Social, a administración desta instancia Nextcloud precisa configurar manualmente a redireción .well-known:",
"Open documentation" : "Abrir a documentación",
"Social app setup" : "Configurar Social app",
"ActivityPub requires a fixed URL to make entries unique. Note that this can not be changed later without resetting the Social app." : "ActivityPub precisa unha URL fixa para facer as entradas únicas. Déase conta de que esto non se poderá cambiar posteriormente sen restablecer a app Social.",
"Social app setup" : "Configurar o aplicativo Social",
"ActivityPub requires a fixed URL to make entries unique. Note that this can not be changed later without resetting the Social app." : "ActivityPub precisa un URL fixo para facer as entradas únicas. Déase conta de que isto non se poderá cambiar posteriormente sen restabelecer o aplicativo Social.",
"ActivityPub URL base" : "URL base de ActivityPub",
"Finish setup" : "Rematar instalación",
"The Social app needs to be set up by the server administrator." : "A app Social precisa ser instalada pola administración do servidor.",
"The Social app needs to be set up by the server administrator." : "O aplicativo Social precisa ser instalado pola administración do servidor.",
"Home" : "Inicio",
"Direct messages" : "Mensaxes directas",
"Profile" : "Perfil",
"Local timeline" : "Liña temporal local",
"Global timeline" : "Liña temporal federada",
"Following" : "Seguindo",
"Post publicly" : "Mensaxe pública",
"Post to followers" : "Mensaxe para seguidoras",
"Post to followers" : "Mensaxe para seguidores",
"Post to recipients" : "Mensaxe para mencionadas",
"Post unlisted" : "Mensaxe non listada",
"Direct" : "Directa",
"Post to mentioned users only" : "Mensaxe só para as usuarias mencionadas",
"Post to mentioned users only" : "Mensaxe só para os usuarios mencionados",
"Unlisted" : "Non listada",
"Do not post to public timelines" : "Non publicar en liñas temporais públicas",
"Followers" : "Seguidoras",
"Post to followers only" : "Mensaxe só para seguidoras",
"Followers" : "Seguidores",
"Post to followers only" : "Mensaxe só para seguidores",
"Public" : "Público",
"Post to public timelines" : "Publicar en liñas temporais públicas",
"Unfollow" : "Deixar de seguir",
"Following" : "Seguindo",
"Follow" : "Seguir",
"posts" : "mensaxes",
"following" : "seguindo",
"followers" : "seguidoras",
"No accounts found" : "Non se atoparon contas",
"followers" : "seguidores",
"No results found" : "Non se atoparon resultados",
"There were no results for your search:" : "Non houbo resultados para a súa busca:",
"Searching for" : "Buscando",
"Reply" : "Responder",
"More actions" : "Máis accións",
"Delete post" : "Eliminar mensaxe",
"No posts found" : "Non se atoparon mensaxes",
"Posts from people you follow will show up here" : "Mostraranse aquí as mensaxes da xente que vostede segue",
"Posts from people you follow will show up here" : "As publicacións da xente que vostede segue amosaranse aquí",
"No direct messages found" : "Non se atoparon mensaxes directas",
"Posts directed to you will show up here" : "A mensaxes dirixidas a vostede mostraranse aquí",
"Posts directed to you will show up here" : "A mensaxes dirixidas a vostede amosaranse aquí",
"No local posts found" : "Non se atoparon publicacións locais",
"Posts from other people on this instance will show up here" : "Publicacións de outras persoas de esta instancia mostraranse aquí",
"Posts from other people on this instance will show up here" : "As publicacións doutras persoas desta instancia amosaranse aquí",
"No global posts found" : "Non hai mensaxes federadas",
"Posts from federated instances will show up here" : "As publicacións das instancias federadas mostraranse aquí",
"Posts from federated instances will show up here" : "As publicacións das instancias federadas amosaranse aquí",
"No posts found for this tag" : "Non se atoparon mensaxes por esta etiqueta",
"Follow on Nextcloud Social" : "Seguir no Nextcloud Social",
"Hello" : "Ola",
"Please confirm that you want to follow this account:" : "Confirme que quere seguir esta conta:",
"You are following this account" : "Vostede está a seguir esta conta",
"Close" : "Pechar",
"You are going to follow:" : "Vai seguir:",
"name@domain of your federation account" : "nome@dominio da súa conta de federación",
"Continue" : "Continuar",
"This step is needed as the user is probably not registered on the same server as you are. We will redirect you to your homeserver to follow this account." : "Este paso é necesario porque probablemente o usuario non estea rexistrado no mesmo servidor que está. Redirixímolo ao seu servidor de hospedaxe para seguir esta conta.",
"User not found" : "Non se atopou o usuario",
"Sorry, we could not find the account of {userId}" : " Mágoa, non foi posíbel atopar a conta de {userId}",
"Nextcloud becomes part of the federated social networks!" : "Nextcloud pasa a formar parte das redes sociais federadas!",
"We automatically created a Social account for you. Your Social ID is the same as your federated cloud ID:" : "Creamos de xeito automático unha conta Social para vostede. O seu ID Social é o mesmo que o seu ID de nube federada:",
"Since you are new to Social, start by following the official Nextcloud account so you don't miss any news" : "Xa que vostede é nova en Social, pode comezar seguindo a conta oficial de Nextcloud así non perderá ningunha nova",
"Since you are new to Social, start by following the official Nextcloud account so you don't miss any news" : "Xa que vostede é novo en Social, pode comezar seguindo a conta oficial de Nextcloud así non perderá ningunha nova",
"Follow Nextcloud on mastodon.xyz" : "Siga a Nextcloud en mastodon.xyz"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

Wyświetl plik

@ -9,15 +9,14 @@ OC.L10N.register(
"Profile" : "Profil",
"Local timeline" : "Helyi idővonal",
"Global timeline" : "Globális idővonal",
"Following" : "További",
"Direct" : "Közvetlen",
"Unlisted" : "Titkos",
"Followers" : "Követők",
"Public" : "Nyilvános",
"Following" : "További",
"Follow" : "Követ",
"posts" : "Küldések",
"following" : "további",
"No accounts found" : "Nincsenek ilyen felhasználói fiókok",
"Searching for" : "Keress",
"No posts found" : "Nem található hozzászólás",
"No direct messages found" : "Nem található közvetlen üzenet",

Wyświetl plik

@ -7,15 +7,14 @@
"Profile" : "Profil",
"Local timeline" : "Helyi idővonal",
"Global timeline" : "Globális idővonal",
"Following" : "További",
"Direct" : "Közvetlen",
"Unlisted" : "Titkos",
"Followers" : "Követők",
"Public" : "Nyilvános",
"Following" : "További",
"Follow" : "Követ",
"posts" : "Küldések",
"following" : "további",
"No accounts found" : "Nincsenek ilyen felhasználói fiókok",
"Searching for" : "Keress",
"No posts found" : "Nem található hozzászólás",
"No direct messages found" : "Nem található közvetlen üzenet",

Wyświetl plik

@ -1,11 +1,28 @@
OC.L10N.register(
"social",
{
"Social" : "Samfélagsnet",
"🎉 Nextcloud becomes part of the federated social networks!" : "🎉 Nextcloud verður hluti af samfélagsnetum í skýjasambandi!",
"** Disclaimer: this is an ALPHA version **\n\n**🎉 Nextcloud becomes part of the federated social networks!**\n\n**🙋 Find your friends:** No matter if they use Nextcloud, 🐘 Mastodon, 🇫 Friendica, and soon ✱ Diaspora, 👹 MediaGoblin and more – you can follow them!\n\n**📜 Profile info:** No need to fill out more profiles – your info from Nextcloud will be used and extended.\n\n**👐 Own your posts:** Everything you post stays on your Nextcloud!\n\n**🕸 Open standards:** We use the established ActivityPub standard!" : "** Fyrirvari: þetta er ALFA-prófunarútgáfa **\n\n**🎉 Nextcloud verður hluti af samfélagsnetum í skýjasambandi!**\n\n**🙋 Finndu vini þína:** Það skiptir ekki máli hvort þeir noti Nextcloud, 🐘 Mastodon, 🇫 Friendica, og fljótlega ✱ Diaspora, 👹 MediaGoblin og fleira – þú getur fylgst með þeim!\n\n**📜 Upplýsingar um notendasnið:** Engin þörf á að fylla út fleiri notendasnið – upplýsingarnar um þig í Nextcloud verða notaðar og auknar.\n\n**👐 Eigðu þínar eigin færslur:** Allt sem þú skrifar er geymt á Nextcloud skýiny þínu!\n\n**🕸 Opnir staðlar:** Við notum hinn þegar útbreidda ActivityPub-staðal!",
".well-known/webfinger isn't properly set up!" : ".well-known/webfinger er ekki rétt uppsett!",
"Open documentation" : "Opna hjálparskjöl",
"Social app setup" : "Uppsetning forrits fyrir samfélagsnet",
"ActivityPub requires a fixed URL to make entries unique. Note that this can not be changed later without resetting the Social app." : "ActivityPub þarf að nota fastar URL-slóðir til að færslur verði einstakar. Athugaðu að þessu er ekki hægt að breyta síðar nema að samfélagsnetsforritið sé frumstillt.",
"ActivityPub URL base" : "Grunnslóð ActivityPub",
"Finish setup" : "Ljúka uppsetningu",
"The Social app needs to be set up by the server administrator." : "Samfélagsnetsforritið verður að vera sett upp af kerfisstjóra.",
"Home" : "Heim",
"Direct messages" : "Bein skilaboð",
"Profile" : "Notandasnið",
"Local timeline" : "Staðvær tímalína",
"Global timeline" : "Víðvær tímalína",
"Following" : "Fylgir",
"Post publicly" : "Birta opinberlega",
"Post to followers" : "Senda einungis á fylgjendur",
"Post to recipients" : "Senda á viðtakendur",
"Post unlisted" : "Senda inn óskráð",
"Direct" : "Beint",
"Post to mentioned users only" : "Senda einungis á notendur sem minnst er á",
"Unlisted" : "Óskráð",
"Do not post to public timelines" : "Ekki senda á opinberar tímalínur",
"Followers" : "Fylgjendur",
@ -13,16 +30,24 @@ OC.L10N.register(
"Public" : "Opinbert",
"Post to public timelines" : "Senda á opinberar tímalínur",
"Unfollow" : "Hætta að fylgja",
"Following" : "Fylgir",
"Follow" : "Fylgja",
"posts" : "færslur",
"following" : "fylgir",
"followers" : "fylgjendur",
"No accounts found" : "Engir aðgangsreikningar fundust",
"Searching for" : "Leita að",
"No posts found" : "Engar færslur fundust",
"Posts from people you follow will show up here" : "Færslur frá fólki sem þú fylgir munu birtast hér",
"No direct messages found" : "Engin bein skilaboð fundust",
"Posts directed to you will show up here" : "Færslum sem beint er til þín munu birtast hér",
"No local posts found" : "Engar staðværar færslur fundust",
"Posts from other people on this instance will show up here" : "Færslur frá fólki á þessu tilviki þjóns munu birtast hér",
"No global posts found" : "Engar víðværar færslur fundust",
"Posts from federated instances will show up here" : "Færslur frá fólki á tilvikum þjóna í skýjasambandi munu birtast hér",
"User not found" : "Notandi fannst ekki",
"Sorry, we could not find the account of {userId}" : "Því miður, við gátum ekki fundið notandaaðganginn {userId}",
"Nextcloud becomes part of the federated social networks!" : "Nextcloud verður hluti af samfélagsnetum í skýjasambandi!",
"We automatically created a Social account for you. Your Social ID is the same as your federated cloud ID:" : "Við útbjuggum sjálfvirkt samfélagsnetsaðgang fyrir þíg. Samfélagsnetsauðkennið þitt er það sama og skýjasambandsauðkennið þitt (Federated Cloud ID):",
"Since you are new to Social, start by following the official Nextcloud account so you don't miss any news" : "Þar sem þú ert nýr á samfélagsnetinu, byrjaðu þá á því að fylgjast með opinbera Nextcloud aðgangnum svo þú missir ekki af neinu fréttnæmu",
"Follow Nextcloud on mastodon.xyz" : "Fylgstu með Nextcloud á mastodon.xyz"
},
"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);");

Wyświetl plik

@ -1,9 +1,26 @@
{ "translations": {
"Social" : "Samfélagsnet",
"🎉 Nextcloud becomes part of the federated social networks!" : "🎉 Nextcloud verður hluti af samfélagsnetum í skýjasambandi!",
"** Disclaimer: this is an ALPHA version **\n\n**🎉 Nextcloud becomes part of the federated social networks!**\n\n**🙋 Find your friends:** No matter if they use Nextcloud, 🐘 Mastodon, 🇫 Friendica, and soon ✱ Diaspora, 👹 MediaGoblin and more – you can follow them!\n\n**📜 Profile info:** No need to fill out more profiles – your info from Nextcloud will be used and extended.\n\n**👐 Own your posts:** Everything you post stays on your Nextcloud!\n\n**🕸 Open standards:** We use the established ActivityPub standard!" : "** Fyrirvari: þetta er ALFA-prófunarútgáfa **\n\n**🎉 Nextcloud verður hluti af samfélagsnetum í skýjasambandi!**\n\n**🙋 Finndu vini þína:** Það skiptir ekki máli hvort þeir noti Nextcloud, 🐘 Mastodon, 🇫 Friendica, og fljótlega ✱ Diaspora, 👹 MediaGoblin og fleira – þú getur fylgst með þeim!\n\n**📜 Upplýsingar um notendasnið:** Engin þörf á að fylla út fleiri notendasnið – upplýsingarnar um þig í Nextcloud verða notaðar og auknar.\n\n**👐 Eigðu þínar eigin færslur:** Allt sem þú skrifar er geymt á Nextcloud skýiny þínu!\n\n**🕸 Opnir staðlar:** Við notum hinn þegar útbreidda ActivityPub-staðal!",
".well-known/webfinger isn't properly set up!" : ".well-known/webfinger er ekki rétt uppsett!",
"Open documentation" : "Opna hjálparskjöl",
"Social app setup" : "Uppsetning forrits fyrir samfélagsnet",
"ActivityPub requires a fixed URL to make entries unique. Note that this can not be changed later without resetting the Social app." : "ActivityPub þarf að nota fastar URL-slóðir til að færslur verði einstakar. Athugaðu að þessu er ekki hægt að breyta síðar nema að samfélagsnetsforritið sé frumstillt.",
"ActivityPub URL base" : "Grunnslóð ActivityPub",
"Finish setup" : "Ljúka uppsetningu",
"The Social app needs to be set up by the server administrator." : "Samfélagsnetsforritið verður að vera sett upp af kerfisstjóra.",
"Home" : "Heim",
"Direct messages" : "Bein skilaboð",
"Profile" : "Notandasnið",
"Local timeline" : "Staðvær tímalína",
"Global timeline" : "Víðvær tímalína",
"Following" : "Fylgir",
"Post publicly" : "Birta opinberlega",
"Post to followers" : "Senda einungis á fylgjendur",
"Post to recipients" : "Senda á viðtakendur",
"Post unlisted" : "Senda inn óskráð",
"Direct" : "Beint",
"Post to mentioned users only" : "Senda einungis á notendur sem minnst er á",
"Unlisted" : "Óskráð",
"Do not post to public timelines" : "Ekki senda á opinberar tímalínur",
"Followers" : "Fylgjendur",
@ -11,16 +28,24 @@
"Public" : "Opinbert",
"Post to public timelines" : "Senda á opinberar tímalínur",
"Unfollow" : "Hætta að fylgja",
"Following" : "Fylgir",
"Follow" : "Fylgja",
"posts" : "færslur",
"following" : "fylgir",
"followers" : "fylgjendur",
"No accounts found" : "Engir aðgangsreikningar fundust",
"Searching for" : "Leita að",
"No posts found" : "Engar færslur fundust",
"Posts from people you follow will show up here" : "Færslur frá fólki sem þú fylgir munu birtast hér",
"No direct messages found" : "Engin bein skilaboð fundust",
"Posts directed to you will show up here" : "Færslum sem beint er til þín munu birtast hér",
"No local posts found" : "Engar staðværar færslur fundust",
"Posts from other people on this instance will show up here" : "Færslur frá fólki á þessu tilviki þjóns munu birtast hér",
"No global posts found" : "Engar víðværar færslur fundust",
"Posts from federated instances will show up here" : "Færslur frá fólki á tilvikum þjóna í skýjasambandi munu birtast hér",
"User not found" : "Notandi fannst ekki",
"Sorry, we could not find the account of {userId}" : "Því miður, við gátum ekki fundið notandaaðganginn {userId}",
"Nextcloud becomes part of the federated social networks!" : "Nextcloud verður hluti af samfélagsnetum í skýjasambandi!",
"We automatically created a Social account for you. Your Social ID is the same as your federated cloud ID:" : "Við útbjuggum sjálfvirkt samfélagsnetsaðgang fyrir þíg. Samfélagsnetsauðkennið þitt er það sama og skýjasambandsauðkennið þitt (Federated Cloud ID):",
"Since you are new to Social, start by following the official Nextcloud account so you don't miss any news" : "Þar sem þú ert nýr á samfélagsnetinu, byrjaðu þá á því að fylgjast með opinbera Nextcloud aðgangnum svo þú missir ekki af neinu fréttnæmu",
"Follow Nextcloud on mastodon.xyz" : "Fylgstu með Nextcloud á mastodon.xyz"
},"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);"
}

Wyświetl plik

@ -17,6 +17,7 @@ OC.L10N.register(
"Profile" : "Profilo",
"Local timeline" : "Linea temporale locale",
"Global timeline" : "Linea temporale globale",
"Following" : "Segui già",
"Post publicly" : "Commenta pubblicamente",
"Post to followers" : "Commenta per i seguaci",
"Post to recipients" : "Commenta per i destinatari",
@ -30,13 +31,16 @@ OC.L10N.register(
"Public" : "Pubblico",
"Post to public timelines" : "Commenta su linee temporali pubbliche",
"Unfollow" : "Smetti di seguire",
"Following" : "Segui già",
"Follow" : "Segui",
"posts" : "commenti",
"following" : "segui già",
"followers" : "seguaci",
"No accounts found" : "Nessun account trovato",
"No results found" : "Nessun risultato trovato",
"There were no results for your search:" : "Non ci sono stati risultati per la tua ricerca:",
"Searching for" : "Ricerca",
"Reply" : "Rispondi",
"More actions" : "Altre azioni",
"Delete post" : "Elimina commento",
"No posts found" : "Nessun commento trovato",
"Posts from people you follow will show up here" : "Commenti da persone che segui saranno mostrati qui",
"No direct messages found" : "Nessun messaggio diretto trovato",
@ -45,6 +49,16 @@ OC.L10N.register(
"Posts from other people on this instance will show up here" : "Commenti da altre persone su questa istanza saranno mostrati qui",
"No global posts found" : "Nessun commento locale trovato",
"Posts from federated instances will show up here" : "Commenti da istanze federate saranno mostrati qui",
"No posts found for this tag" : "Nessun commento trovato per questa etichetta",
"Follow on Nextcloud Social" : "Segui su Nextcloud Social",
"Hello" : "Ciao",
"Please confirm that you want to follow this account:" : "Conferma che desideri seguire questo account:",
"You are following this account" : "Stai seguendo questo account",
"Close" : "Chiudi",
"You are going to follow:" : "Stai per seguire:",
"name@domain of your federation account" : "nome@dominio del tuo account federato",
"Continue" : "Continua",
"This step is needed as the user is probably not registered on the same server as you are. We will redirect you to your homeserver to follow this account." : "Questo passo è necessario perché l'utente probabilmente non è registrato sul tuo stesso server. Ti reindirizzeremo al tuo homeserver per seguire questo account.",
"User not found" : "Utente non trovato",
"Sorry, we could not find the account of {userId}" : "Spiacenti, impossibile trovare l'account di {userId}",
"Nextcloud becomes part of the federated social networks!" : "Nextcloud diventa parte delle reti sociali federate!",

Wyświetl plik

@ -15,6 +15,7 @@
"Profile" : "Profilo",
"Local timeline" : "Linea temporale locale",
"Global timeline" : "Linea temporale globale",
"Following" : "Segui già",
"Post publicly" : "Commenta pubblicamente",
"Post to followers" : "Commenta per i seguaci",
"Post to recipients" : "Commenta per i destinatari",
@ -28,13 +29,16 @@
"Public" : "Pubblico",
"Post to public timelines" : "Commenta su linee temporali pubbliche",
"Unfollow" : "Smetti di seguire",
"Following" : "Segui già",
"Follow" : "Segui",
"posts" : "commenti",
"following" : "segui già",
"followers" : "seguaci",
"No accounts found" : "Nessun account trovato",
"No results found" : "Nessun risultato trovato",
"There were no results for your search:" : "Non ci sono stati risultati per la tua ricerca:",
"Searching for" : "Ricerca",
"Reply" : "Rispondi",
"More actions" : "Altre azioni",
"Delete post" : "Elimina commento",
"No posts found" : "Nessun commento trovato",
"Posts from people you follow will show up here" : "Commenti da persone che segui saranno mostrati qui",
"No direct messages found" : "Nessun messaggio diretto trovato",
@ -43,6 +47,16 @@
"Posts from other people on this instance will show up here" : "Commenti da altre persone su questa istanza saranno mostrati qui",
"No global posts found" : "Nessun commento locale trovato",
"Posts from federated instances will show up here" : "Commenti da istanze federate saranno mostrati qui",
"No posts found for this tag" : "Nessun commento trovato per questa etichetta",
"Follow on Nextcloud Social" : "Segui su Nextcloud Social",
"Hello" : "Ciao",
"Please confirm that you want to follow this account:" : "Conferma che desideri seguire questo account:",
"You are following this account" : "Stai seguendo questo account",
"Close" : "Chiudi",
"You are going to follow:" : "Stai per seguire:",
"name@domain of your federation account" : "nome@dominio del tuo account federato",
"Continue" : "Continua",
"This step is needed as the user is probably not registered on the same server as you are. We will redirect you to your homeserver to follow this account." : "Questo passo è necessario perché l'utente probabilmente non è registrato sul tuo stesso server. Ti reindirizzeremo al tuo homeserver per seguire questo account.",
"User not found" : "Utente non trovato",
"Sorry, we could not find the account of {userId}" : "Spiacenti, impossibile trovare l'account di {userId}",
"Nextcloud becomes part of the federated social networks!" : "Nextcloud diventa parte delle reti sociali federate!",

Wyświetl plik

@ -2,29 +2,41 @@ OC.L10N.register(
"social",
{
"Social" : "SNS",
"🎉 Nextcloud becomes part of the federated social networks!" : "🎉 Nextcloudは分散ソーシャルネットワークの一部になります",
"** Disclaimer: this is an ALPHA version **\n\n**🎉 Nextcloud becomes part of the federated social networks!**\n\n**🙋 Find your friends:** No matter if they use Nextcloud, 🐘 Mastodon, 🇫 Friendica, and soon ✱ Diaspora, 👹 MediaGoblin and more – you can follow them!\n\n**📜 Profile info:** No need to fill out more profiles – your info from Nextcloud will be used and extended.\n\n**👐 Own your posts:** Everything you post stays on your Nextcloud!\n\n**🕸 Open standards:** We use the established ActivityPub standard!" : "** 免責事項: このアプリはアルファ版です **\n\n**🎉 Nextcloud は分散型ソーシャル・ネットワークの一部になりました!**\n\n**🙋 友達を見つける:** Nextcloudを使っていなくても問題ありません, 🐘 マストドン, 🇫 Friendica, もうすぐ ✱ Diaspora, 👹 MediaGoblin 等など – フォローできますよ!\n\n**📜 プロフィール情報:** プロフィールを追加で記入する必要はありません – Nextcloudのあなたの情報が拡張されて使われます。\n**👐 投稿するには:** Nextcloud上であなたつぶやきを投稿するだけ\n\n**🕸 オープンスタンダード:** これらを ActivityPubスタンダードで構築しています!",
".well-known/webfinger isn't properly set up!" : ".well-known/webfinger が正しく設定されていません!",
"Social needs the .well-known automatic discovery to be properly set up. If Nextcloud is not installed in the root of the domain, it is often the case that Nextcloud can't configure this automatically. To use Social, the admin of this Nextcloud instance needs to manually configure the .well-known redirects: " : "ソーシャルアプリは、 .well-known を正しく設定して自動的に検出されるようにしておく必要があります。Nextcloudのドメインルートにインストールされていない場合、Nextcloudが自動的に設定できないケースが多々あります。その場合、ソーシャルを使うにはNextcloudサーバー管理者が .well-known のリダイレクトを手動で設定する必要があります。",
"Open documentation" : "ドキュメントを開く",
"Social app setup" : "ソーシャルアプリ設定",
"ActivityPub requires a fixed URL to make entries unique. Note that this can not be changed later without resetting the Social app." : "ActivityPub では、投稿のURLを一意にする為に固定されたURLが必要です。これを変更するにはソーシャルアプリをリセットしなければならないことに注意してください。",
"ActivityPub URL base" : "ActivityPub URL のベース",
"Finish setup" : "セットアップを完了します",
"The Social app needs to be set up by the server administrator." : "ソーシャルアプリはサーバー管理者による設定が必要です。",
"Home" : "ホーム",
"Direct messages" : "ダイレクトメッセージ",
"Profile" : "プロフィール",
"Local timeline" : "ローカルタイムライン",
"Global timeline" : "グローバルタイムライン",
"Following" : "フォロー中",
"Post publicly" : "公開投稿",
"Post to followers" : "フォロワーへ投稿",
"Post to recipients" : "受取人へ投稿",
"Post unlisted" : "限定公開で投稿",
"Direct" : "ダイレクト",
"Post to mentioned users only" : "メンションしたユーザにだけ投稿する",
"Unlisted" : "限定公開",
"Do not post to public timelines" : "公開タイムラインへ投稿しない",
"Followers" : "フォロワー",
"Post to followers only" : "フォロワーにだけ投稿する",
"Public" : "公開",
"Post to public timelines" : "公開タイムラインへ投稿する",
"Unfollow" : "フォローしない",
"Following" : "フォロー中",
"Follow" : "フォローする",
"posts" : "投稿",
"following" : "フォロー中",
"followers" : "フォロワー",
"No accounts found" : "アカウントが見つかりません",
"Searching for" : "を探す",
"Reply" : "返信",
"No posts found" : "投稿が見つかりません",
"Posts from people you follow will show up here" : "あなたがフォローしている人の投稿がここに表示されます",
"No direct messages found" : "ダイレクトメッセージが見つかりません",
@ -33,7 +45,11 @@ OC.L10N.register(
"Posts from other people on this instance will show up here" : "このインスタンスの他の人からの投稿がここに表示されます",
"No global posts found" : "グローバルの投稿が見つかりません",
"Posts from federated instances will show up here" : "連携したインスタンスからの投稿がここに表示されます",
"Close" : "閉じる",
"User not found" : "ユーザーが見つかりません",
"Sorry, we could not find the account of {userId}" : "残念ながら、アカウント {userId} は見つかりませんでした",
"Nextcloud becomes part of the federated social networks!" : "Nextcloudはソーシャルネットワーク連携の一部になります",
"We automatically created a Social account for you. Your Social ID is the same as your federated cloud ID:" : "自動的にソーシャルアカウントを作成します。ソーシャルIDは、クラウド連携IDと同じです:",
"Since you are new to Social, start by following the official Nextcloud account so you don't miss any news" : "Socialは初めてですか最新ニュスを見逃さないように公式Nextcloudアカウントをフォローしましょう。",
"Follow Nextcloud on mastodon.xyz" : "mastodon.xyzでNextcloudをフォローする"
},

Wyświetl plik

@ -1,28 +1,40 @@
{ "translations": {
"Social" : "SNS",
"🎉 Nextcloud becomes part of the federated social networks!" : "🎉 Nextcloudは分散ソーシャルネットワークの一部になります",
"** Disclaimer: this is an ALPHA version **\n\n**🎉 Nextcloud becomes part of the federated social networks!**\n\n**🙋 Find your friends:** No matter if they use Nextcloud, 🐘 Mastodon, 🇫 Friendica, and soon ✱ Diaspora, 👹 MediaGoblin and more – you can follow them!\n\n**📜 Profile info:** No need to fill out more profiles – your info from Nextcloud will be used and extended.\n\n**👐 Own your posts:** Everything you post stays on your Nextcloud!\n\n**🕸 Open standards:** We use the established ActivityPub standard!" : "** 免責事項: このアプリはアルファ版です **\n\n**🎉 Nextcloud は分散型ソーシャル・ネットワークの一部になりました!**\n\n**🙋 友達を見つける:** Nextcloudを使っていなくても問題ありません, 🐘 マストドン, 🇫 Friendica, もうすぐ ✱ Diaspora, 👹 MediaGoblin 等など – フォローできますよ!\n\n**📜 プロフィール情報:** プロフィールを追加で記入する必要はありません – Nextcloudのあなたの情報が拡張されて使われます。\n**👐 投稿するには:** Nextcloud上であなたつぶやきを投稿するだけ\n\n**🕸 オープンスタンダード:** これらを ActivityPubスタンダードで構築しています!",
".well-known/webfinger isn't properly set up!" : ".well-known/webfinger が正しく設定されていません!",
"Social needs the .well-known automatic discovery to be properly set up. If Nextcloud is not installed in the root of the domain, it is often the case that Nextcloud can't configure this automatically. To use Social, the admin of this Nextcloud instance needs to manually configure the .well-known redirects: " : "ソーシャルアプリは、 .well-known を正しく設定して自動的に検出されるようにしておく必要があります。Nextcloudのドメインルートにインストールされていない場合、Nextcloudが自動的に設定できないケースが多々あります。その場合、ソーシャルを使うにはNextcloudサーバー管理者が .well-known のリダイレクトを手動で設定する必要があります。",
"Open documentation" : "ドキュメントを開く",
"Social app setup" : "ソーシャルアプリ設定",
"ActivityPub requires a fixed URL to make entries unique. Note that this can not be changed later without resetting the Social app." : "ActivityPub では、投稿のURLを一意にする為に固定されたURLが必要です。これを変更するにはソーシャルアプリをリセットしなければならないことに注意してください。",
"ActivityPub URL base" : "ActivityPub URL のベース",
"Finish setup" : "セットアップを完了します",
"The Social app needs to be set up by the server administrator." : "ソーシャルアプリはサーバー管理者による設定が必要です。",
"Home" : "ホーム",
"Direct messages" : "ダイレクトメッセージ",
"Profile" : "プロフィール",
"Local timeline" : "ローカルタイムライン",
"Global timeline" : "グローバルタイムライン",
"Following" : "フォロー中",
"Post publicly" : "公開投稿",
"Post to followers" : "フォロワーへ投稿",
"Post to recipients" : "受取人へ投稿",
"Post unlisted" : "限定公開で投稿",
"Direct" : "ダイレクト",
"Post to mentioned users only" : "メンションしたユーザにだけ投稿する",
"Unlisted" : "限定公開",
"Do not post to public timelines" : "公開タイムラインへ投稿しない",
"Followers" : "フォロワー",
"Post to followers only" : "フォロワーにだけ投稿する",
"Public" : "公開",
"Post to public timelines" : "公開タイムラインへ投稿する",
"Unfollow" : "フォローしない",
"Following" : "フォロー中",
"Follow" : "フォローする",
"posts" : "投稿",
"following" : "フォロー中",
"followers" : "フォロワー",
"No accounts found" : "アカウントが見つかりません",
"Searching for" : "を探す",
"Reply" : "返信",
"No posts found" : "投稿が見つかりません",
"Posts from people you follow will show up here" : "あなたがフォローしている人の投稿がここに表示されます",
"No direct messages found" : "ダイレクトメッセージが見つかりません",
@ -31,7 +43,11 @@
"Posts from other people on this instance will show up here" : "このインスタンスの他の人からの投稿がここに表示されます",
"No global posts found" : "グローバルの投稿が見つかりません",
"Posts from federated instances will show up here" : "連携したインスタンスからの投稿がここに表示されます",
"Close" : "閉じる",
"User not found" : "ユーザーが見つかりません",
"Sorry, we could not find the account of {userId}" : "残念ながら、アカウント {userId} は見つかりませんでした",
"Nextcloud becomes part of the federated social networks!" : "Nextcloudはソーシャルネットワーク連携の一部になります",
"We automatically created a Social account for you. Your Social ID is the same as your federated cloud ID:" : "自動的にソーシャルアカウントを作成します。ソーシャルIDは、クラウド連携IDと同じです:",
"Since you are new to Social, start by following the official Nextcloud account so you don't miss any news" : "Socialは初めてですか最新ニュスを見逃さないように公式Nextcloudアカウントをフォローしましょう。",
"Follow Nextcloud on mastodon.xyz" : "mastodon.xyzでNextcloudをフォローする"
},"pluralForm" :"nplurals=1; plural=0;"

Wyświetl plik

@ -12,6 +12,7 @@ OC.L10N.register(
"Profile" : "Profils",
"Local timeline" : "Lokālā laika josla",
"Global timeline" : "Globālā laika josla",
"Following" : "Seko",
"Post publicly" : "Publisks ieraksts",
"Post to followers" : "Ieraksts sekotājiem",
"Post to recipients" : "Ieraksts saņēmējam",
@ -22,12 +23,10 @@ OC.L10N.register(
"Followers" : "Sekotāji",
"Public" : "Publisks",
"Unfollow" : "Atsekot",
"Following" : "Seko",
"Follow" : "Sekot",
"posts" : "ieraksts",
"following" : "seko",
"followers" : "sekotāji",
"No accounts found" : "Konti nav atrasti",
"Searching for" : "Meklēt",
"No posts found" : "Atrasta jauns ieraksts",
"No direct messages found" : "Tiešie ziņojumi nav atrasti",

Wyświetl plik

@ -10,6 +10,7 @@
"Profile" : "Profils",
"Local timeline" : "Lokālā laika josla",
"Global timeline" : "Globālā laika josla",
"Following" : "Seko",
"Post publicly" : "Publisks ieraksts",
"Post to followers" : "Ieraksts sekotājiem",
"Post to recipients" : "Ieraksts saņēmējam",
@ -20,12 +21,10 @@
"Followers" : "Sekotāji",
"Public" : "Publisks",
"Unfollow" : "Atsekot",
"Following" : "Seko",
"Follow" : "Sekot",
"posts" : "ieraksts",
"following" : "seko",
"followers" : "sekotāji",
"No accounts found" : "Konti nav atrasti",
"Searching for" : "Meklēt",
"No posts found" : "Atrasta jauns ieraksts",
"No direct messages found" : "Tiešie ziņojumi nav atrasti",

Wyświetl plik

@ -17,6 +17,7 @@ OC.L10N.register(
"Profile" : "Profiel",
"Local timeline" : "Lokale tijdlijn",
"Global timeline" : "Globale tijdlijn",
"Following" : "Volgend",
"Post publicly" : "Plaats openbaar",
"Post to followers" : "Plaatsen voor volgers",
"Post to recipients" : "Plaatsen voor ontvangers",
@ -30,12 +31,12 @@ OC.L10N.register(
"Public" : "Openbaar",
"Post to public timelines" : "Plaatsen op openbare tijdlijnen",
"Unfollow" : "Ontvolgen",
"Following" : "Volgend",
"Follow" : "Volgen",
"posts" : "berichten",
"following" : "volgend",
"followers" : "volgers",
"No accounts found" : "Geen accounts gevonden",
"No results found" : "Geen resultaten gevonden",
"There were no results for your search:" : "Geen resultaten voor je zoekterm:",
"Searching for" : "Zoeken naar",
"No posts found" : "Geen berichten gevonden",
"Posts from people you follow will show up here" : "Berichten van mensen die je volgt, worden hier getoond",
@ -45,6 +46,16 @@ OC.L10N.register(
"Posts from other people on this instance will show up here" : "Berichten van anderen op deze server verschijnen hier",
"No global posts found" : "Geen globale berichten gevonden",
"Posts from federated instances will show up here" : "Berichten van gefedereerde servers worden hier getoond",
"No posts found for this tag" : "Geen berichten gevonden met deze tag",
"Follow on Nextcloud Social" : "Volg op Nextcloud Social",
"Hello" : "Hallo",
"Please confirm that you want to follow this account:" : "Bevestig alstublieft dat je dit account wilt volgen:",
"You are following this account" : "Je volgt dit account",
"Close" : "Sluiten",
"You are going to follow:" : "Je gaat volgen:",
"name@domain of your federation account" : "naam@domein van je federatie account",
"Continue" : "Doorgaan",
"This step is needed as the user is probably not registered on the same server as you are. We will redirect you to your homeserver to follow this account." : "Deze stap is nodig omdat de gebruiker waarschijnlijk niet op dezelfde server is geregistreerd als jij. We zullen je doorverwijzen naar jouw homeserver om dit account te volgen.",
"User not found" : "Gebruiker niet gevonden",
"Sorry, we could not find the account of {userId}" : "Sorry, we konden het account van {userId} niet vinden",
"Nextcloud becomes part of the federated social networks!" : "Nextcloud wordt onderdeel van de gefedereerde sociale netwerken!",

Wyświetl plik

@ -15,6 +15,7 @@
"Profile" : "Profiel",
"Local timeline" : "Lokale tijdlijn",
"Global timeline" : "Globale tijdlijn",
"Following" : "Volgend",
"Post publicly" : "Plaats openbaar",
"Post to followers" : "Plaatsen voor volgers",
"Post to recipients" : "Plaatsen voor ontvangers",
@ -28,12 +29,12 @@
"Public" : "Openbaar",
"Post to public timelines" : "Plaatsen op openbare tijdlijnen",
"Unfollow" : "Ontvolgen",
"Following" : "Volgend",
"Follow" : "Volgen",
"posts" : "berichten",
"following" : "volgend",
"followers" : "volgers",
"No accounts found" : "Geen accounts gevonden",
"No results found" : "Geen resultaten gevonden",
"There were no results for your search:" : "Geen resultaten voor je zoekterm:",
"Searching for" : "Zoeken naar",
"No posts found" : "Geen berichten gevonden",
"Posts from people you follow will show up here" : "Berichten van mensen die je volgt, worden hier getoond",
@ -43,6 +44,16 @@
"Posts from other people on this instance will show up here" : "Berichten van anderen op deze server verschijnen hier",
"No global posts found" : "Geen globale berichten gevonden",
"Posts from federated instances will show up here" : "Berichten van gefedereerde servers worden hier getoond",
"No posts found for this tag" : "Geen berichten gevonden met deze tag",
"Follow on Nextcloud Social" : "Volg op Nextcloud Social",
"Hello" : "Hallo",
"Please confirm that you want to follow this account:" : "Bevestig alstublieft dat je dit account wilt volgen:",
"You are following this account" : "Je volgt dit account",
"Close" : "Sluiten",
"You are going to follow:" : "Je gaat volgen:",
"name@domain of your federation account" : "naam@domein van je federatie account",
"Continue" : "Doorgaan",
"This step is needed as the user is probably not registered on the same server as you are. We will redirect you to your homeserver to follow this account." : "Deze stap is nodig omdat de gebruiker waarschijnlijk niet op dezelfde server is geregistreerd als jij. We zullen je doorverwijzen naar jouw homeserver om dit account te volgen.",
"User not found" : "Gebruiker niet gevonden",
"Sorry, we could not find the account of {userId}" : "Sorry, we konden het account van {userId} niet vinden",
"Nextcloud becomes part of the federated social networks!" : "Nextcloud wordt onderdeel van de gefedereerde sociale netwerken!",

Wyświetl plik

@ -10,6 +10,7 @@ OC.L10N.register(
"Profile" : "Profil",
"Local timeline" : "Lokalna oś czasu",
"Global timeline" : "Globalna oś czasu",
"Following" : "Obserwujesz",
"Post publicly" : "Opublikuj dla wszystkich",
"Post to followers" : "Opublikuj dla obserwujących",
"Post to recipients" : "Opublikuj dla odbiorców",
@ -22,12 +23,10 @@ OC.L10N.register(
"Public" : "Publiczny",
"Post to public timelines" : "Umieść na publicznych osiach czasu",
"Unfollow" : "Przestań obserwować",
"Following" : "Obserwujesz",
"Follow" : "Obserwuj",
"posts" : "wpisy",
"following" : "śledzeni",
"followers" : "śledzący",
"No accounts found" : "Nie znaleziono kont",
"Searching for" : "Wyszukiwanie",
"No posts found" : "Nie znaleziono wpisów",
"Posts from people you follow will show up here" : "Tutaj będą pojawiać się wpisy osób które obserwujesz",
@ -37,6 +36,8 @@ OC.L10N.register(
"Posts from other people on this instance will show up here" : "Tutaj będą pojawiać się wpisy innych użytkowników tej instancji",
"No global posts found" : "Nie znaleziono globalnych wpisów",
"Posts from federated instances will show up here" : "Tutaj będą pojawiać się wpisy ze sfederowanych instancji ",
"User not found" : "Nie znaleziono użytkownika",
"Sorry, we could not find the account of {userId}" : "Nie udało się odnaleźć konta {userId}",
"Nextcloud becomes part of the federated social networks!" : "Nextcloud staje się częścią sfederowanych sieci społecznościowych!",
"Since you are new to Social, start by following the official Nextcloud account so you don't miss any news" : "Ponieważ jesteś tu nowy(-a), rozpocznij od zaobserwowania konta Nextcloud, dzięki czemu nie przegapisz żadnych nowości",
"Follow Nextcloud on mastodon.xyz" : "Zaobserwuj Nextcloud na mastodon.xyz"

Wyświetl plik

@ -8,6 +8,7 @@
"Profile" : "Profil",
"Local timeline" : "Lokalna oś czasu",
"Global timeline" : "Globalna oś czasu",
"Following" : "Obserwujesz",
"Post publicly" : "Opublikuj dla wszystkich",
"Post to followers" : "Opublikuj dla obserwujących",
"Post to recipients" : "Opublikuj dla odbiorców",
@ -20,12 +21,10 @@
"Public" : "Publiczny",
"Post to public timelines" : "Umieść na publicznych osiach czasu",
"Unfollow" : "Przestań obserwować",
"Following" : "Obserwujesz",
"Follow" : "Obserwuj",
"posts" : "wpisy",
"following" : "śledzeni",
"followers" : "śledzący",
"No accounts found" : "Nie znaleziono kont",
"Searching for" : "Wyszukiwanie",
"No posts found" : "Nie znaleziono wpisów",
"Posts from people you follow will show up here" : "Tutaj będą pojawiać się wpisy osób które obserwujesz",
@ -35,6 +34,8 @@
"Posts from other people on this instance will show up here" : "Tutaj będą pojawiać się wpisy innych użytkowników tej instancji",
"No global posts found" : "Nie znaleziono globalnych wpisów",
"Posts from federated instances will show up here" : "Tutaj będą pojawiać się wpisy ze sfederowanych instancji ",
"User not found" : "Nie znaleziono użytkownika",
"Sorry, we could not find the account of {userId}" : "Nie udało się odnaleźć konta {userId}",
"Nextcloud becomes part of the federated social networks!" : "Nextcloud staje się częścią sfederowanych sieci społecznościowych!",
"Since you are new to Social, start by following the official Nextcloud account so you don't miss any news" : "Ponieważ jesteś tu nowy(-a), rozpocznij od zaobserwowania konta Nextcloud, dzięki czemu nie przegapisz żadnych nowości",
"Follow Nextcloud on mastodon.xyz" : "Zaobserwuj Nextcloud na mastodon.xyz"

Wyświetl plik

@ -17,6 +17,7 @@ OC.L10N.register(
"Profile" : "Perfil",
"Local timeline" : "Linha de tempo local",
"Global timeline" : "Linha do tempo global",
"Following" : "Seguindo",
"Post publicly" : "Postar publicamente",
"Post to followers" : "Postar para seguidores",
"Post to recipients" : "Postar para destinatários",
@ -30,13 +31,16 @@ OC.L10N.register(
"Public" : "Público",
"Post to public timelines" : "Postar em linhas do tempo públicas",
"Unfollow" : "Deixar de seguir",
"Following" : "Seguindo",
"Follow" : "Seguir",
"posts" : "postagens",
"following" : "seguindo",
"followers" : "seguidores",
"No accounts found" : "Nenhuma conta encontrada",
"No results found" : "Nenhum resultado encontrado",
"There were no results for your search:" : "Não houve resultados para sua pesquisa:",
"Searching for" : "Procurando por",
"Reply" : "Responder",
"More actions" : "Mais ações",
"Delete post" : "Excluir mensagem",
"No posts found" : "Nenhuma postagem encontrada",
"Posts from people you follow will show up here" : "Postagens de pessoas que você segue aparecerão aqui",
"No direct messages found" : "Nenhuma mensagem direta encontrada",
@ -45,6 +49,16 @@ OC.L10N.register(
"Posts from other people on this instance will show up here" : "Postagens de outras pessoas desta instância aparecerão aqui",
"No global posts found" : "Nenhuma postagem global encontrada",
"Posts from federated instances will show up here" : "Postagens de instâncias federadas aparecerão aqui",
"No posts found for this tag" : "Sem postagens para esta tag",
"Follow on Nextcloud Social" : "Seguir no Nextcloud Social",
"Hello" : "Olá",
"Please confirm that you want to follow this account:" : "Confirme que você quer seguir esta conta:",
"You are following this account" : "Você está seguindo esta conta",
"Close" : "Fechar",
"You are going to follow:" : "Você vai seguir:",
"name@domain of your federation account" : "name@domain de sua conta federada",
"Continue" : "Continuar",
"This step is needed as the user is probably not registered on the same server as you are. We will redirect you to your homeserver to follow this account." : "Esta etapa é necessária porque o usuário provavelmente não está registrado no mesmo servidor que você. Nós o redirecionaremos para seu servidor de origem para seguir esta conta.",
"User not found" : "Usuário não encontrado",
"Sorry, we could not find the account of {userId}" : "Não foi possível encontrar a conta de {userId}",
"Nextcloud becomes part of the federated social networks!" : "O Nextcloud torna-se parte de redes sociais federadas!",

Wyświetl plik

@ -15,6 +15,7 @@
"Profile" : "Perfil",
"Local timeline" : "Linha de tempo local",
"Global timeline" : "Linha do tempo global",
"Following" : "Seguindo",
"Post publicly" : "Postar publicamente",
"Post to followers" : "Postar para seguidores",
"Post to recipients" : "Postar para destinatários",
@ -28,13 +29,16 @@
"Public" : "Público",
"Post to public timelines" : "Postar em linhas do tempo públicas",
"Unfollow" : "Deixar de seguir",
"Following" : "Seguindo",
"Follow" : "Seguir",
"posts" : "postagens",
"following" : "seguindo",
"followers" : "seguidores",
"No accounts found" : "Nenhuma conta encontrada",
"No results found" : "Nenhum resultado encontrado",
"There were no results for your search:" : "Não houve resultados para sua pesquisa:",
"Searching for" : "Procurando por",
"Reply" : "Responder",
"More actions" : "Mais ações",
"Delete post" : "Excluir mensagem",
"No posts found" : "Nenhuma postagem encontrada",
"Posts from people you follow will show up here" : "Postagens de pessoas que você segue aparecerão aqui",
"No direct messages found" : "Nenhuma mensagem direta encontrada",
@ -43,6 +47,16 @@
"Posts from other people on this instance will show up here" : "Postagens de outras pessoas desta instância aparecerão aqui",
"No global posts found" : "Nenhuma postagem global encontrada",
"Posts from federated instances will show up here" : "Postagens de instâncias federadas aparecerão aqui",
"No posts found for this tag" : "Sem postagens para esta tag",
"Follow on Nextcloud Social" : "Seguir no Nextcloud Social",
"Hello" : "Olá",
"Please confirm that you want to follow this account:" : "Confirme que você quer seguir esta conta:",
"You are following this account" : "Você está seguindo esta conta",
"Close" : "Fechar",
"You are going to follow:" : "Você vai seguir:",
"name@domain of your federation account" : "name@domain de sua conta federada",
"Continue" : "Continuar",
"This step is needed as the user is probably not registered on the same server as you are. We will redirect you to your homeserver to follow this account." : "Esta etapa é necessária porque o usuário provavelmente não está registrado no mesmo servidor que você. Nós o redirecionaremos para seu servidor de origem para seguir esta conta.",
"User not found" : "Usuário não encontrado",
"Sorry, we could not find the account of {userId}" : "Não foi possível encontrar a conta de {userId}",
"Nextcloud becomes part of the federated social networks!" : "O Nextcloud torna-se parte de redes sociais federadas!",

44
l10n/pt_PT.js 100644
Wyświetl plik

@ -0,0 +1,44 @@
OC.L10N.register(
"social",
{
"Social" : "Social",
"Open documentation" : "Abrir documentação",
"Social app setup" : "Configuração de aplicação social",
"Finish setup" : "Terminar configuração",
"Home" : "Início",
"Direct messages" : "Mensagens directas",
"Profile" : "Perfil",
"Local timeline" : "Linha temporal local",
"Global timeline" : "Linha temporal global",
"Following" : "A seguir",
"Post publicly" : "Publicar publicamente",
"Post to followers" : "Publicar para seguidores",
"Post to recipients" : "Publicar para destinatários",
"Post unlisted" : "Publicar não listada",
"Direct" : "Directo",
"Post to mentioned users only" : "Publicar apenas para utilizadores mencionados",
"Unlisted" : "Remover da lista",
"Do not post to public timelines" : "Não publicar em linhas temporais públicas",
"Followers" : "Seguidores",
"Post to followers only" : "Publicar apenas para seguidores",
"Public" : "Público",
"Post to public timelines" : "Publicar em linha temporal pública",
"Unfollow" : "Não seguir",
"Follow" : "Seguir",
"posts" : "publicações",
"following" : "a seguir",
"followers" : "seguidores",
"Searching for" : "À procura de",
"No posts found" : "Nenhuma publicação encontrada",
"Posts from people you follow will show up here" : "Publicações de pessoas que segue serão apresentadas aqui",
"No direct messages found" : "nenhuma mensagem directa encontrada",
"Posts directed to you will show up here" : "Publicações para si serão apresentadas aqui",
"No local posts found" : "Nenhuma publicação loca encontrada",
"Posts from other people on this instance will show up here" : "Publicações de outras pessoas nesta instância serão apresentadas aqui",
"No global posts found" : "Nenhuma publicação global encontrada",
"Posts from federated instances will show up here" : "Publicações de instâncias federadas serão apresentadas aqui",
"User not found" : "Utilizador não encontrado",
"Sorry, we could not find the account of {userId}" : "Pedimos desculpa, não conseguimos encontrar a conta com {userId}",
"Follow Nextcloud on mastodon.xyz" : "Siga Nextcloud em mastodon.xyz"
},
"nplurals=2; plural=(n != 1);");

42
l10n/pt_PT.json 100644
Wyświetl plik

@ -0,0 +1,42 @@
{ "translations": {
"Social" : "Social",
"Open documentation" : "Abrir documentação",
"Social app setup" : "Configuração de aplicação social",
"Finish setup" : "Terminar configuração",
"Home" : "Início",
"Direct messages" : "Mensagens directas",
"Profile" : "Perfil",
"Local timeline" : "Linha temporal local",
"Global timeline" : "Linha temporal global",
"Following" : "A seguir",
"Post publicly" : "Publicar publicamente",
"Post to followers" : "Publicar para seguidores",
"Post to recipients" : "Publicar para destinatários",
"Post unlisted" : "Publicar não listada",
"Direct" : "Directo",
"Post to mentioned users only" : "Publicar apenas para utilizadores mencionados",
"Unlisted" : "Remover da lista",
"Do not post to public timelines" : "Não publicar em linhas temporais públicas",
"Followers" : "Seguidores",
"Post to followers only" : "Publicar apenas para seguidores",
"Public" : "Público",
"Post to public timelines" : "Publicar em linha temporal pública",
"Unfollow" : "Não seguir",
"Follow" : "Seguir",
"posts" : "publicações",
"following" : "a seguir",
"followers" : "seguidores",
"Searching for" : "À procura de",
"No posts found" : "Nenhuma publicação encontrada",
"Posts from people you follow will show up here" : "Publicações de pessoas que segue serão apresentadas aqui",
"No direct messages found" : "nenhuma mensagem directa encontrada",
"Posts directed to you will show up here" : "Publicações para si serão apresentadas aqui",
"No local posts found" : "Nenhuma publicação loca encontrada",
"Posts from other people on this instance will show up here" : "Publicações de outras pessoas nesta instância serão apresentadas aqui",
"No global posts found" : "Nenhuma publicação global encontrada",
"Posts from federated instances will show up here" : "Publicações de instâncias federadas serão apresentadas aqui",
"User not found" : "Utilizador não encontrado",
"Sorry, we could not find the account of {userId}" : "Pedimos desculpa, não conseguimos encontrar a conta com {userId}",
"Follow Nextcloud on mastodon.xyz" : "Siga Nextcloud em mastodon.xyz"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

Wyświetl plik

@ -6,6 +6,7 @@ OC.L10N.register(
".well-known/webfinger isn't properly set up!" : ".well-known/webfinger није добро подешен!",
"Open documentation" : "Отвори документацију",
"Social app setup" : "Поставке социјалне апликације",
"ActivityPub requires a fixed URL to make entries unique. Note that this can not be changed later without resetting the Social app." : "ActivityPub захтева фиксан URL да би сви уноси били јединствени. Ово се не може изменити накнадно, без да се ресетује цела апликација Социјалних мрежа.",
"ActivityPub URL base" : "ActivityPub URL основа",
"Finish setup" : "Заврши подешавање",
"The Social app needs to be set up by the server administrator." : "Социјалну апликацију мора да подеси администратор сервера.",
@ -14,6 +15,7 @@ OC.L10N.register(
"Profile" : "Профил",
"Local timeline" : "Локална лајна",
"Global timeline" : "Глобална лајна",
"Following" : "Пратим",
"Post publicly" : "Пошаљи јавно",
"Post to followers" : "Пошаљи пратиоцима",
"Post to recipients" : "Пошаљи примаоцима",
@ -27,13 +29,16 @@ OC.L10N.register(
"Public" : "Јавно",
"Post to public timelines" : "Објављуј на јавне лајне",
"Unfollow" : "Отпрати",
"Following" : "Пратим",
"Follow" : "Прати",
"posts" : "објаве",
"following" : "прати",
"followers" : "пратиоца",
"No accounts found" : "Није пронађен ниједан налог",
"No results found" : "Нема пронађених резултата",
"There were no results for your search:" : "Нема резултата за претрагу:",
"Searching for" : "Тражим",
"Reply" : "Одговори",
"More actions" : "Још радњи",
"Delete post" : "Обриши објаву",
"No posts found" : "Нема објава",
"Posts from people you follow will show up here" : "Објаве од људи које пратите ће се појавити овде",
"No direct messages found" : "Нема директних порука",
@ -42,6 +47,16 @@ OC.L10N.register(
"Posts from other people on this instance will show up here" : "Објаве од других људи са ове инстанце ће се појављивати овде",
"No global posts found" : "Нема јавних објава",
"Posts from federated instances will show up here" : "Објаве се федерисаних инстанци ће се појавити овде",
"No posts found for this tag" : "Нема нађених објава за ову ознаку",
"Follow on Nextcloud Social" : "Запрати преко Некстклауд Социјалне мреже",
"Hello" : "Здраво",
"Please confirm that you want to follow this account:" : "Потврдите да желите следећи налог:",
"You are following this account" : "Пратите овај налог",
"Close" : "Затвори",
"You are going to follow:" : "Запратићете:",
"name@domain of your federation account" : "name@domain Вашег здруженог налога",
"Continue" : "Настави",
"This step is needed as the user is probably not registered on the same server as you are. We will redirect you to your homeserver to follow this account." : "Овај корак је потребан пошто корисник вероватно није регистрован на истом сервери као и Ви. Преусмерићемо Вас на Ваш сервер да запратите овај налог.",
"User not found" : "Корисник није нађен",
"Sorry, we could not find the account of {userId}" : "Нажалост, не можемо да нађемо налог корисника {userId}",
"Nextcloud becomes part of the federated social networks!" : "Некстклауд је постао део федерисаних социјалних мрежа!",

Wyświetl plik

@ -4,6 +4,7 @@
".well-known/webfinger isn't properly set up!" : ".well-known/webfinger није добро подешен!",
"Open documentation" : "Отвори документацију",
"Social app setup" : "Поставке социјалне апликације",
"ActivityPub requires a fixed URL to make entries unique. Note that this can not be changed later without resetting the Social app." : "ActivityPub захтева фиксан URL да би сви уноси били јединствени. Ово се не може изменити накнадно, без да се ресетује цела апликација Социјалних мрежа.",
"ActivityPub URL base" : "ActivityPub URL основа",
"Finish setup" : "Заврши подешавање",
"The Social app needs to be set up by the server administrator." : "Социјалну апликацију мора да подеси администратор сервера.",
@ -12,6 +13,7 @@
"Profile" : "Профил",
"Local timeline" : "Локална лајна",
"Global timeline" : "Глобална лајна",
"Following" : "Пратим",
"Post publicly" : "Пошаљи јавно",
"Post to followers" : "Пошаљи пратиоцима",
"Post to recipients" : "Пошаљи примаоцима",
@ -25,13 +27,16 @@
"Public" : "Јавно",
"Post to public timelines" : "Објављуј на јавне лајне",
"Unfollow" : "Отпрати",
"Following" : "Пратим",
"Follow" : "Прати",
"posts" : "објаве",
"following" : "прати",
"followers" : "пратиоца",
"No accounts found" : "Није пронађен ниједан налог",
"No results found" : "Нема пронађених резултата",
"There were no results for your search:" : "Нема резултата за претрагу:",
"Searching for" : "Тражим",
"Reply" : "Одговори",
"More actions" : "Још радњи",
"Delete post" : "Обриши објаву",
"No posts found" : "Нема објава",
"Posts from people you follow will show up here" : "Објаве од људи које пратите ће се појавити овде",
"No direct messages found" : "Нема директних порука",
@ -40,6 +45,16 @@
"Posts from other people on this instance will show up here" : "Објаве од других људи са ове инстанце ће се појављивати овде",
"No global posts found" : "Нема јавних објава",
"Posts from federated instances will show up here" : "Објаве се федерисаних инстанци ће се појавити овде",
"No posts found for this tag" : "Нема нађених објава за ову ознаку",
"Follow on Nextcloud Social" : "Запрати преко Некстклауд Социјалне мреже",
"Hello" : "Здраво",
"Please confirm that you want to follow this account:" : "Потврдите да желите следећи налог:",
"You are following this account" : "Пратите овај налог",
"Close" : "Затвори",
"You are going to follow:" : "Запратићете:",
"name@domain of your federation account" : "name@domain Вашег здруженог налога",
"Continue" : "Настави",
"This step is needed as the user is probably not registered on the same server as you are. We will redirect you to your homeserver to follow this account." : "Овај корак је потребан пошто корисник вероватно није регистрован на истом сервери као и Ви. Преусмерићемо Вас на Ваш сервер да запратите овај налог.",
"User not found" : "Корисник није нађен",
"Sorry, we could not find the account of {userId}" : "Нажалост, не можемо да нађемо налог корисника {userId}",
"Nextcloud becomes part of the federated social networks!" : "Некстклауд је постао део федерисаних социјалних мрежа!",

Wyświetl plik

@ -5,7 +5,7 @@ OC.L10N.register(
"🎉 Nextcloud becomes part of the federated social networks!" : "🎉 Nextcloud blir en del av federerade sociala nätverk!",
".well-known/webfinger isn't properly set up!" : ".well-known/webfinger är inte korrekt uppsatt!",
"Open documentation" : "Öppna dokumentation",
"Social app setup" : "Social app installation",
"Social app setup" : "Social app-installation",
"ActivityPub requires a fixed URL to make entries unique. Note that this can not be changed later without resetting the Social app." : "ActivityPub kräver en fast URL för att göra poster unika. Observera att detta inte kan ändras senare utan att återställa den sociala appen.",
"ActivityPub URL base" : "ActivityPub URL-bas",
"Finish setup" : "Slutför installationen",
@ -15,6 +15,7 @@ OC.L10N.register(
"Profile" : "Profil",
"Local timeline" : "Lokal tidslinje",
"Global timeline" : "Global tidslinje",
"Following" : "Följer",
"Post publicly" : "Skicka offentligt",
"Post to followers" : "Skicka till följare",
"Post to recipients" : "Skicka till mottagare",
@ -28,13 +29,16 @@ OC.L10N.register(
"Public" : "Publik",
"Post to public timelines" : "Skicka till offentliga tidslinjer",
"Unfollow" : "Sluta följa",
"Following" : "Följer",
"Follow" : "Följ",
"posts" : "Inlägg",
"following" : "följer",
"followers" : "följare",
"No accounts found" : "Inga konton hittades",
"No results found" : "Inga resultat funna",
"There were no results for your search:" : "Det var inga resultat för din sökning:",
"Searching for" : "Sök efter",
"Reply" : "Svara",
"More actions" : "Fler händelser",
"Delete post" : "Radera inlägg",
"No posts found" : "Inga inlägg hittades",
"Posts from people you follow will show up here" : "Inlägg från personer du följer visas här",
"No direct messages found" : "Inga direktmeddelanden hittade",
@ -43,6 +47,16 @@ OC.L10N.register(
"Posts from other people on this instance will show up here" : "Inlägg från andra personer i denna instans visas här",
"No global posts found" : "Inga globala inlägg hittade",
"Posts from federated instances will show up here" : "Inlägg från federerade instanser visas här",
"No posts found for this tag" : "Inga inlägg funna för denna tagg",
"Follow on Nextcloud Social" : "Följ på Nextcloud Social",
"Hello" : "Hej",
"Please confirm that you want to follow this account:" : "Bekräfta att du vill följa detta konto:",
"You are following this account" : "Du följer detta konto",
"Close" : "Stäng",
"You are going to follow:" : "Du kommer att följa:",
"name@domain of your federation account" : "namn@domän på ditt federerade konto",
"Continue" : "Fortsätt",
"This step is needed as the user is probably not registered on the same server as you are. We will redirect you to your homeserver to follow this account." : "Det här steget behövs eftersom användaren förmodligen inte är registrerad på samma server som du är. Vi kommer att omdirigera dig till din server för att följa detta konto.",
"User not found" : "Användaren hittades inte",
"Sorry, we could not find the account of {userId}" : "Tyvärr, vi kunde inte hitta kontot för {userId}",
"Nextcloud becomes part of the federated social networks!" : "Nextcloud blir en del av federerade sociala nätverk!",

Wyświetl plik

@ -3,7 +3,7 @@
"🎉 Nextcloud becomes part of the federated social networks!" : "🎉 Nextcloud blir en del av federerade sociala nätverk!",
".well-known/webfinger isn't properly set up!" : ".well-known/webfinger är inte korrekt uppsatt!",
"Open documentation" : "Öppna dokumentation",
"Social app setup" : "Social app installation",
"Social app setup" : "Social app-installation",
"ActivityPub requires a fixed URL to make entries unique. Note that this can not be changed later without resetting the Social app." : "ActivityPub kräver en fast URL för att göra poster unika. Observera att detta inte kan ändras senare utan att återställa den sociala appen.",
"ActivityPub URL base" : "ActivityPub URL-bas",
"Finish setup" : "Slutför installationen",
@ -13,6 +13,7 @@
"Profile" : "Profil",
"Local timeline" : "Lokal tidslinje",
"Global timeline" : "Global tidslinje",
"Following" : "Följer",
"Post publicly" : "Skicka offentligt",
"Post to followers" : "Skicka till följare",
"Post to recipients" : "Skicka till mottagare",
@ -26,13 +27,16 @@
"Public" : "Publik",
"Post to public timelines" : "Skicka till offentliga tidslinjer",
"Unfollow" : "Sluta följa",
"Following" : "Följer",
"Follow" : "Följ",
"posts" : "Inlägg",
"following" : "följer",
"followers" : "följare",
"No accounts found" : "Inga konton hittades",
"No results found" : "Inga resultat funna",
"There were no results for your search:" : "Det var inga resultat för din sökning:",
"Searching for" : "Sök efter",
"Reply" : "Svara",
"More actions" : "Fler händelser",
"Delete post" : "Radera inlägg",
"No posts found" : "Inga inlägg hittades",
"Posts from people you follow will show up here" : "Inlägg från personer du följer visas här",
"No direct messages found" : "Inga direktmeddelanden hittade",
@ -41,6 +45,16 @@
"Posts from other people on this instance will show up here" : "Inlägg från andra personer i denna instans visas här",
"No global posts found" : "Inga globala inlägg hittade",
"Posts from federated instances will show up here" : "Inlägg från federerade instanser visas här",
"No posts found for this tag" : "Inga inlägg funna för denna tagg",
"Follow on Nextcloud Social" : "Följ på Nextcloud Social",
"Hello" : "Hej",
"Please confirm that you want to follow this account:" : "Bekräfta att du vill följa detta konto:",
"You are following this account" : "Du följer detta konto",
"Close" : "Stäng",
"You are going to follow:" : "Du kommer att följa:",
"name@domain of your federation account" : "namn@domän på ditt federerade konto",
"Continue" : "Fortsätt",
"This step is needed as the user is probably not registered on the same server as you are. We will redirect you to your homeserver to follow this account." : "Det här steget behövs eftersom användaren förmodligen inte är registrerad på samma server som du är. Vi kommer att omdirigera dig till din server för att följa detta konto.",
"User not found" : "Användaren hittades inte",
"Sorry, we could not find the account of {userId}" : "Tyvärr, vi kunde inte hitta kontot för {userId}",
"Nextcloud becomes part of the federated social networks!" : "Nextcloud blir en del av federerade sociala nätverk!",

Wyświetl plik

@ -17,6 +17,7 @@ OC.L10N.register(
"Profile" : "Profil",
"Local timeline" : "Yerel zaman tüneli",
"Global timeline" : "Genel zaman tüneli",
"Following" : "Takip Ediliyor",
"Post publicly" : "Herkese açık olarak gönder",
"Post to followers" : "Takipçilere gönder",
"Post to recipients" : "Alıcılara gönder",
@ -30,13 +31,16 @@ OC.L10N.register(
"Public" : "Herkese açık",
"Post to public timelines" : "Herkese açık zaman tünellerine gönder",
"Unfollow" : "Takibi Bırak",
"Following" : "Takip Ediliyor",
"Follow" : "Takip Et",
"posts" : "ileti",
"following" : "takip edilenler",
"followers" : "takip edenler",
"No accounts found" : "Herhangi bir hesap bulunamadı",
"No results found" : "Herhangi bir sonuç bulunamadı",
"There were no results for your search:" : "Aramanızdan bir sonuç alınamadı:",
"Searching for" : "Şu ifade aranıyor",
"Reply" : "Yanıtla",
"More actions" : "Diğer işlemler",
"Delete post" : "İletiyi sil",
"No posts found" : "Herhangi bir ileti bulunamadı",
"Posts from people you follow will show up here" : "Takip ettiğiniz kişilerin iletileri burada görüntülenir",
"No direct messages found" : "Herhangi bir doğrudan ileti bulunamadı",
@ -45,6 +49,16 @@ OC.L10N.register(
"Posts from other people on this instance will show up here" : "Bu sunucuyu kullanan diğer kişilerin gönderdiği iletiler burada görüntülenir",
"No global posts found" : "Herhangi bir genel ileti bulunamadı",
"Posts from federated instances will show up here" : "Birleşmiş sunuculara gönderilmiş iletiler burada görüntülenir",
"No posts found for this tag" : "Bu etiketi taşıyan bir ileti bulunamadı",
"Follow on Nextcloud Social" : "Nextcloud Sosyal Üzerinde Takip Et",
"Hello" : "Merhaba",
"Please confirm that you want to follow this account:" : "Lütfen şu hesabı takip etmek istediğinizi onaylayın:",
"You are following this account" : "Bu hesabı takip ediyorsunuz",
"Close" : "Kapat",
"You are going to follow:" : "Takip edeceğiniz:",
"name@domain of your federation account" : "Birleşmiş hesabınızın ad@etkialanı bilgisi",
"Continue" : "Devam",
"This step is needed as the user is probably not registered on the same server as you are. We will redirect you to your homeserver to follow this account." : "Bu adım kullanıcının sizinle aynı sunucu üzerinde kayıtlı olmaması durumunda kullanılır. Bu hesabı izleyebilmeniz için sizi kendi sunucunuza yönlendireceğiz.",
"User not found" : "Kullanıcı bulunamadı",
"Sorry, we could not find the account of {userId}" : "Maalesef, {userId} hesabını bulamadık",
"Nextcloud becomes part of the federated social networks!" : "Nextcloud birleşmiş sosyal ağların bir parçası haline geliyor!",

Wyświetl plik

@ -15,6 +15,7 @@
"Profile" : "Profil",
"Local timeline" : "Yerel zaman tüneli",
"Global timeline" : "Genel zaman tüneli",
"Following" : "Takip Ediliyor",
"Post publicly" : "Herkese açık olarak gönder",
"Post to followers" : "Takipçilere gönder",
"Post to recipients" : "Alıcılara gönder",
@ -28,13 +29,16 @@
"Public" : "Herkese açık",
"Post to public timelines" : "Herkese açık zaman tünellerine gönder",
"Unfollow" : "Takibi Bırak",
"Following" : "Takip Ediliyor",
"Follow" : "Takip Et",
"posts" : "ileti",
"following" : "takip edilenler",
"followers" : "takip edenler",
"No accounts found" : "Herhangi bir hesap bulunamadı",
"No results found" : "Herhangi bir sonuç bulunamadı",
"There were no results for your search:" : "Aramanızdan bir sonuç alınamadı:",
"Searching for" : "Şu ifade aranıyor",
"Reply" : "Yanıtla",
"More actions" : "Diğer işlemler",
"Delete post" : "İletiyi sil",
"No posts found" : "Herhangi bir ileti bulunamadı",
"Posts from people you follow will show up here" : "Takip ettiğiniz kişilerin iletileri burada görüntülenir",
"No direct messages found" : "Herhangi bir doğrudan ileti bulunamadı",
@ -43,6 +47,16 @@
"Posts from other people on this instance will show up here" : "Bu sunucuyu kullanan diğer kişilerin gönderdiği iletiler burada görüntülenir",
"No global posts found" : "Herhangi bir genel ileti bulunamadı",
"Posts from federated instances will show up here" : "Birleşmiş sunuculara gönderilmiş iletiler burada görüntülenir",
"No posts found for this tag" : "Bu etiketi taşıyan bir ileti bulunamadı",
"Follow on Nextcloud Social" : "Nextcloud Sosyal Üzerinde Takip Et",
"Hello" : "Merhaba",
"Please confirm that you want to follow this account:" : "Lütfen şu hesabı takip etmek istediğinizi onaylayın:",
"You are following this account" : "Bu hesabı takip ediyorsunuz",
"Close" : "Kapat",
"You are going to follow:" : "Takip edeceğiniz:",
"name@domain of your federation account" : "Birleşmiş hesabınızın ad@etkialanı bilgisi",
"Continue" : "Devam",
"This step is needed as the user is probably not registered on the same server as you are. We will redirect you to your homeserver to follow this account." : "Bu adım kullanıcının sizinle aynı sunucu üzerinde kayıtlı olmaması durumunda kullanılır. Bu hesabı izleyebilmeniz için sizi kendi sunucunuza yönlendireceğiz.",
"User not found" : "Kullanıcı bulunamadı",
"Sorry, we could not find the account of {userId}" : "Maalesef, {userId} hesabını bulamadık",
"Nextcloud becomes part of the federated social networks!" : "Nextcloud birleşmiş sosyal ağların bir parçası haline geliyor!",

23
l10n/zh_CN.js 100644
Wyświetl plik

@ -0,0 +1,23 @@
OC.L10N.register(
"social",
{
"Social" : "社交",
"🎉 Nextcloud becomes part of the federated social networks!" : "🎉 Nextcloud已经成为联合社交网络的一部分",
"Open documentation" : "打开文件",
"Social app setup" : "安装Social应用",
"Finish setup" : "完成安装",
"Home" : "主页",
"Following" : "正在关注",
"Followers" : "关注者",
"Unfollow" : "取消关注",
"Follow" : "关注",
"following" : "正在关注",
"followers" : "关注者",
"Searching for" : "搜索",
"No posts found" : "未找到文章",
"No local posts found" : "没有找到本地文章",
"User not found" : "未找到用户",
"Sorry, we could not find the account of {userId}" : "非常抱歉我们不能查找到这个用户id对应的帐户",
"Follow Nextcloud on mastodon.xyz" : "在mastodon.xyz上关注Nextcloud"
},
"nplurals=1; plural=0;");

21
l10n/zh_CN.json 100644
Wyświetl plik

@ -0,0 +1,21 @@
{ "translations": {
"Social" : "社交",
"🎉 Nextcloud becomes part of the federated social networks!" : "🎉 Nextcloud已经成为联合社交网络的一部分",
"Open documentation" : "打开文件",
"Social app setup" : "安装Social应用",
"Finish setup" : "完成安装",
"Home" : "主页",
"Following" : "正在关注",
"Followers" : "关注者",
"Unfollow" : "取消关注",
"Follow" : "关注",
"following" : "正在关注",
"followers" : "关注者",
"Searching for" : "搜索",
"No posts found" : "未找到文章",
"No local posts found" : "没有找到本地文章",
"User not found" : "未找到用户",
"Sorry, we could not find the account of {userId}" : "非常抱歉我们不能查找到这个用户id对应的帐户",
"Follow Nextcloud on mastodon.xyz" : "在mastodon.xyz上关注Nextcloud"
},"pluralForm" :"nplurals=1; plural=0;"
}

Wyświetl plik

@ -40,7 +40,7 @@ use OCA\Social\Interfaces\Activity\AddInterface;
use OCA\Social\Interfaces\Activity\BlockInterface;
use OCA\Social\Interfaces\Activity\CreateInterface;
use OCA\Social\Interfaces\Activity\DeleteInterface;
use OCA\Social\Interfaces\Activity\FollowInterface;
use OCA\Social\Interfaces\Object\FollowInterface;
use OCA\Social\Interfaces\Activity\LikeInterface;
use OCA\Social\Interfaces\Activity\RejectInterface;
use OCA\Social\Interfaces\Activity\RemoveInterface;
@ -50,6 +50,7 @@ use OCA\Social\Interfaces\Actor\PersonInterface;
use OCA\Social\Interfaces\IActivityPubInterface;
use OCA\Social\Interfaces\Object\DocumentInterface;
use OCA\Social\Interfaces\Object\ImageInterface;
use OCA\Social\Interfaces\Object\AnnounceInterface;
use OCA\Social\Interfaces\Object\NoteInterface;
use OCA\Social\Model\ActivityPub\ACore;
use OCA\Social\Model\ActivityPub\Activity\Accept;
@ -57,13 +58,14 @@ use OCA\Social\Model\ActivityPub\Activity\Add;
use OCA\Social\Model\ActivityPub\Activity\Block;
use OCA\Social\Model\ActivityPub\Activity\Create;
use OCA\Social\Model\ActivityPub\Activity\Delete;
use OCA\Social\Model\ActivityPub\Activity\Follow;
use OCA\Social\Model\ActivityPub\Object\Follow;
use OCA\Social\Model\ActivityPub\Activity\Like;
use OCA\Social\Model\ActivityPub\Activity\Reject;
use OCA\Social\Model\ActivityPub\Activity\Remove;
use OCA\Social\Model\ActivityPub\Activity\Undo;
use OCA\Social\Model\ActivityPub\Activity\Update;
use OCA\Social\Model\ActivityPub\Actor\Person;
use OCA\Social\Model\ActivityPub\Object\Announce;
use OCA\Social\Model\ActivityPub\Object\Document;
use OCA\Social\Model\ActivityPub\Object\Image;
use OCA\Social\Model\ActivityPub\Object\Note;
@ -92,6 +94,9 @@ class AP {
/** @var AddInterface */
public $addInterface;
/** @var AnnounceInterface */
public $announceInterface;
/** @var BlockInterface */
public $blockInterface;
@ -154,6 +159,7 @@ class AP {
try {
$ap->acceptInterface = \OC::$server->query(AcceptInterface::class);
$ap->addInterface = \OC::$server->query(AddInterface::class);
$ap->announceInterface = \OC::$server->query(AnnounceInterface::class);
$ap->blockInterface = \OC::$server->query(BlockInterface::class);
$ap->createInterface = \OC::$server->query(CreateInterface::class);
$ap->deleteInterface = \OC::$server->query(DeleteInterface::class);
@ -196,16 +202,38 @@ class AP {
$item->setParent($parent);
}
try {
$object = $this->getItemFromData($this->getArray('object', $data, []), $item, $level);
$item->setObject($object);
} catch (ItemUnknownException $e) {
}
$this->getObjectFromData($data, $item, $level);
return $item;
}
/**
* @param array $data
* @param ACore $item
* @param int $level
*
* @throws RedundancyLimitException
* @throws SocialAppConfigException
*/
public function getObjectFromData(array $data, ACore &$item, int $level) {
try {
$objectData = $this->getArray('object', $data, []);
if (empty($objectData)) {
$objectId = $this->get('object', $data, '');
if ($objectId !== '') {
// TODO: validate AS_URL
$item->setObjectId($objectId);
}
} else {
$object = $this->getItemFromData($objectData, $item, $level);
$item->setObject($object);
}
} catch (ItemUnknownException $e) {
}
}
/**
* @param array $data
*
@ -239,6 +267,10 @@ class AP {
$item = new Add();
break;
case Announce::TYPE:
$item = new Announce();
break;
case Block::TYPE:
$item = new Block();
break;
@ -332,6 +364,10 @@ class AP {
$interface = $this->addInterface;
break;
case Announce::TYPE:
$service = $this->announceInterface;
break;
case Block::TYPE:
$interface = $this->blockInterface;
break;

Wyświetl plik

@ -37,6 +37,7 @@ use OCA\Social\Service\AccountService;
use OCA\Social\Service\CacheActorService;
use OCA\Social\Service\ConfigService;
use OCA\Social\Service\DocumentService;
use OCA\Social\Service\HashtagService;
use OCA\Social\Service\MiscService;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
@ -46,7 +47,7 @@ class CacheRefresh extends Base {
/** @var AccountService */
private $actorService;
private $accountService;
/** @var CacheActorService */
private $cacheActorService;
@ -54,6 +55,9 @@ class CacheRefresh extends Base {
/** @var DocumentService */
private $documentService;
/** @var HashtagService */
private $hashtagService;
/** @var ConfigService */
private $configService;
@ -64,21 +68,24 @@ class CacheRefresh extends Base {
/**
* CacheUpdate constructor.
*
* @param AccountService $actorService
* @param AccountService $accountService
* @param CacheActorService $cacheActorService
* @param DocumentService $documentService
* @param HashtagService $hashtagService
* @param ConfigService $configService
* @param MiscService $miscService
*/
public function __construct(
AccountService $actorService, CacheActorService $cacheActorService,
DocumentService $documentService, ConfigService $configService, MiscService $miscService
AccountService $accountService, CacheActorService $cacheActorService,
DocumentService $documentService, HashtagService $hashtagService,
ConfigService $configService, MiscService $miscService
) {
parent::__construct();
$this->actorService = $actorService;
$this->accountService = $accountService;
$this->cacheActorService = $cacheActorService;
$this->documentService = $documentService;
$this->hashtagService = $hashtagService;
$this->configService = $configService;
$this->miscService = $miscService;
}
@ -102,10 +109,10 @@ class CacheRefresh extends Base {
*/
protected function execute(InputInterface $input, OutputInterface $output) {
$result = $this->actorService->blindKeyRotation();
$result = $this->accountService->blindKeyRotation();
$output->writeLn($result . ' key pairs refreshed');
$result = $this->actorService->manageCacheLocalActors();
$result = $this->accountService->manageCacheLocalActors();
$output->writeLn($result . ' local accounts regenerated');
$result = $this->cacheActorService->missingCacheRemoteActors();
@ -116,6 +123,9 @@ class CacheRefresh extends Base {
$result = $this->documentService->manageCacheDocuments();
$output->writeLn($result . ' documents cached');
$result = $this->hashtagService->manageHashtags();
$output->writeLn($result . ' hashtags updated');
}

Wyświetl plik

@ -0,0 +1,136 @@
<?php
declare(strict_types=1);
/**
* Nextcloud - Social Support
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Maxence Lange <maxence@artificial-owl.com>
* @copyright 2018, Maxence Lange <maxence@artificial-owl.com>
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\Social\Command;
use Exception;
use OC\Core\Command\Base;
use OCA\Social\Model\ActivityPub\ACore;
use OCA\Social\Model\ActivityPub\Object\Announce;
use OCA\Social\Model\ActivityPub\Stream;
use OCA\Social\Model\Post;
use OCA\Social\Service\AccountService;
use OCA\Social\Service\ActivityService;
use OCA\Social\Service\ConfigService;
use OCA\Social\Service\CurlService;
use OCA\Social\Service\MiscService;
use OCA\Social\Service\NoteService;
use OCA\Social\Service\PostService;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
class NoteBoost extends Base {
/** @var ConfigService */
private $configService;
/** @var ActivityService */
private $activityService;
/** @var NoteService */
private $noteService;
/** @var AccountService */
private $accountService;
/** @var PostService */
private $postService;
/** @var CurlService */
private $curlService;
/** @var MiscService */
private $miscService;
/**
* NoteCreate constructor.
*
* @param ActivityService $activityService
* @param AccountService $accountService
* @param NoteService $noteService
* @param PostService $postService
* @param CurlService $curlService
* @param ConfigService $configService
* @param MiscService $miscService
*/
public function __construct(
ActivityService $activityService, AccountService $accountService,
NoteService $noteService, PostService $postService, CurlService $curlService,
ConfigService $configService, MiscService $miscService
) {
parent::__construct();
$this->activityService = $activityService;
$this->noteService = $noteService;
$this->accountService = $accountService;
$this->postService = $postService;
$this->curlService = $curlService;
$this->configService = $configService;
$this->miscService = $miscService;
}
/**
*
*/
protected function configure() {
parent::configure();
$this->setName('social:note:boost')
->addArgument('userid', InputArgument::REQUIRED, 'userId of the author')
->addArgument('note', InputArgument::REQUIRED, 'Note to boost')
->setDescription('Boost a note');
}
/**
* @param InputInterface $input
* @param OutputInterface $output
*
* @throws Exception
*/
protected function execute(InputInterface $input, OutputInterface $output) {
$userId = $input->getArgument('userid');
$noteId = $input->getArgument('note');
$actor = $this->accountService->getActorFromUserId($userId);
$this->noteService->setViewer($actor);
$token = $this->noteService->createBoost($actor, $noteId, $activity);
echo 'object: ' . json_encode($activity, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\n";
echo 'token: ' . $token . "\n";
}
}

Wyświetl plik

@ -47,6 +47,7 @@ use Symfony\Component\Console\Output\OutputInterface;
class NoteCreate extends Base {
/** @var ConfigService */
private $configService;
@ -54,7 +55,7 @@ class NoteCreate extends Base {
private $activityService;
/** @var AccountService */
private $actorService;
private $accountService;
/** @var PostService */
private $postService;
@ -70,21 +71,21 @@ class NoteCreate extends Base {
* NoteCreate constructor.
*
* @param ActivityService $activityService
* @param AccountService $actorService
* @param AccountService $accountService
* @param PostService $postService
* @param CurlService $curlService
* @param ConfigService $configService
* @param MiscService $miscService
*/
public function __construct(
ActivityService $activityService, AccountService $actorService,
ActivityService $activityService, AccountService $accountService,
PostService $postService, CurlService $curlService,
ConfigService $configService, MiscService $miscService
) {
parent::__construct();
$this->activityService = $activityService;
$this->actorService = $actorService;
$this->accountService = $accountService;
$this->postService = $postService;
$this->curlService = $curlService;
$this->configService = $configService;
@ -108,6 +109,10 @@ class NoteCreate extends Base {
'type', 'y', InputOption::VALUE_OPTIONAL,
'type: public (default), followers, unlisted, direct'
)
->addOption(
'hashtag', 'g', InputOption::VALUE_OPTIONAL,
'hashtag, without the leading #'
)
->addArgument('userid', InputArgument::REQUIRED, 'userId of the author')
->addArgument('content', InputArgument::REQUIRED, 'content of the post')
->setDescription('Create a new note');
@ -125,14 +130,17 @@ class NoteCreate extends Base {
$userId = $input->getArgument('userid');
$content = $input->getArgument('content');
$to = $input->getOption('to');
$hashtag = $input->getOption('hashtag');
$replyTo = $input->getOption('replyTo');
$type = $input->getOption('type');
$post = new Post($userId);
$actor = $this->accountService->getActorFromUserId($userId);
$post = new Post($actor);
$post->setContent($content);
$post->setType(($type === null) ? '' : $type);
$post->setReplyTo(($replyTo === null) ? '' : $replyTo);
$post->addTo(($to === null) ? '' : $to);
$post->setHashtags(($hashtag === null) ? [] : [$hashtag]);
$token = $this->postService->createPost($post, $activity);

Wyświetl plik

@ -36,7 +36,8 @@ use OCA\Social\Exceptions\SocialAppConfigException;
use OCA\Social\Service\ActivityService;
use OCA\Social\Service\ConfigService;
use OCA\Social\Service\MiscService;
use OCA\Social\Service\QueueService;
use OCA\Social\Service\RequestQueueService;
use OCA\Social\Service\StreamQueueService;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
@ -47,8 +48,11 @@ class QueueProcess extends Base {
/** @var ActivityService */
private $activityService;
/** @var QueueService */
private $queueService;
/** @var StreamQueueService */
private $streamQueueService;
/** @var RequestQueueService */
private $requestQueueService;
/** @var ConfigService */
private $configService;
@ -61,18 +65,21 @@ class QueueProcess extends Base {
* NoteCreate constructor.
*
* @param ActivityService $activityService
* @param QueueService $queueService
* @param RequestQueueService $requestQueueService
* @param StreamQueueService $streamQueueService
* @param ConfigService $configService
* @param MiscService $miscService
*/
public function __construct(
ActivityService $activityService, QueueService $queueService, ConfigService $configService,
ActivityService $activityService, RequestQueueService $requestQueueService,
StreamQueueService $streamQueueService, ConfigService $configService,
MiscService $miscService
) {
parent::__construct();
$this->activityService = $activityService;
$this->queueService = $queueService;
$this->requestQueueService = $requestQueueService;
$this->streamQueueService = $streamQueueService;
$this->configService = $configService;
$this->miscService = $miscService;
}
@ -94,14 +101,24 @@ class QueueProcess extends Base {
*/
protected function execute(InputInterface $input, OutputInterface $output) {
$requests = $this->queueService->getRequestStandby($total = 0);
$output->writeLn('processing requests queue');
$this->processRequestQueue($output);
$output->writeLn('found a total of ' . $total . ' requests in the queue');
$output->writeLn('processing stream queue');
$this->processStreamQueue($output);
}
private function processRequestQueue(OutputInterface $output) {
$total = 0;
$requests = $this->requestQueueService->getRequestStandby($total);
$output->writeLn('- found a total of ' . $total . ' requests in the queue');
if ($total === 0) {
return;
}
$output->writeLn(sizeof($requests) . ' are processable at this time');
$output->writeLn('- ' . sizeof($requests) . ' are processable at this time');
if (sizeof($requests) === 0) {
return;
}
@ -119,5 +136,27 @@ class QueueProcess extends Base {
$output->writeLn('done');
}
}
private function processStreamQueue(OutputInterface $output) {
$total = 0;
$items = $this->streamQueueService->getRequestStandby($total);
$output->writeLn('- found a total of ' . $total . ' not cached object in the queue');
if ($total === 0) {
return;
}
$output->writeLn('- ' . sizeof($items) . ' are processable at this time');
if (sizeof($items) === 0) {
return;
}
foreach ($items as $item) {
$output->write('.');
$this->streamQueueService->manageStreamQueue($item);
}
$output->writeLn('done');
}
}

Wyświetl plik

@ -34,7 +34,7 @@ use Exception;
use OC\Core\Command\Base;
use OCA\Social\Service\ConfigService;
use OCA\Social\Service\MiscService;
use OCA\Social\Service\QueueService;
use OCA\Social\Service\RequestQueueService;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
@ -46,8 +46,8 @@ class QueueStatus extends Base {
/** @var ConfigService */
private $configService;
/** @var QueueService */
private $queueService;
/** @var RequestQueueService */
private $requestQueueService;
/** @var MiscService */
private $miscService;
@ -56,16 +56,16 @@ class QueueStatus extends Base {
/**
* NoteCreate constructor.
*
* @param QueueService $queueService
* @param RequestQueueService $requestQueueService
* @param ConfigService $configService
* @param MiscService $miscService
*/
public function __construct(
QueueService $queueService, ConfigService $configService, MiscService $miscService
RequestQueueService $requestQueueService, ConfigService $configService, MiscService $miscService
) {
parent::__construct();
$this->queueService = $queueService;
$this->requestQueueService = $requestQueueService;
$this->configService = $configService;
$this->miscService = $miscService;
}
@ -98,7 +98,7 @@ class QueueStatus extends Base {
throw new Exception('As of today, --token is mandatory');
}
$requests = $this->queueService->getRequestFromToken($token);
$requests = $this->requestQueueService->getRequestFromToken($token);
foreach ($requests as $request) {
$output->writeLn(json_encode($request));

Wyświetl plik

@ -31,6 +31,8 @@ namespace OCA\Social\Controller;
use daita\MySmallPhpTools\Traits\Nextcloud\TNCDataResponse;
use daita\MySmallPhpTools\Traits\TAsync;
use daita\MySmallPhpTools\Traits\TStringTools;
use Exception;
use OC\AppFramework\Http;
use OCA\Social\AppInfo\Application;
@ -42,6 +44,7 @@ use OCA\Social\Service\FollowService;
use OCA\Social\Service\ImportService;
use OCA\Social\Service\MiscService;
use OCA\Social\Service\SignatureService;
use OCA\Social\Service\StreamQueueService;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\Response;
use OCP\IRequest;
@ -51,6 +54,8 @@ class ActivityPubController extends Controller {
use TNCDataResponse;
use TStringTools;
use TAsync;
/** @var SocialPubController */
@ -62,6 +67,9 @@ class ActivityPubController extends Controller {
/** @var SignatureService */
private $signatureService;
/** @var StreamQueueService */
private $streamQueueService;
/** @var ImportService */
private $importService;
@ -79,6 +87,7 @@ class ActivityPubController extends Controller {
* @param SocialPubController $socialPubController
* @param CacheActorService $cacheActorService
* @param SignatureService $signatureService
* @param StreamQueueService $streamQueueService
* @param ImportService $importService
* @param FollowService $followService
* @param MiscService $miscService
@ -86,13 +95,15 @@ class ActivityPubController extends Controller {
public function __construct(
IRequest $request, SocialPubController $socialPubController,
CacheActorService $cacheActorService, SignatureService $signatureService,
ImportService $importService, FollowService $followService, MiscService $miscService
StreamQueueService $streamQueueService, ImportService $importService,
FollowService $followService, MiscService $miscService
) {
parent::__construct(Application::APP_NAME, $request);
$this->socialPubController = $socialPubController;
$this->cacheActorService = $cacheActorService;
$this->signatureService = $signatureService;
$this->streamQueueService = $streamQueueService;
$this->importService = $importService;
$this->followService = $followService;
$this->miscService = $miscService;
@ -178,7 +189,11 @@ class ActivityPubController extends Controller {
} catch (ItemUnknownException $e) {
}
return $this->success([]);
$this->async();
$this->streamQueueService->cacheStreamByToken($activity->getRequestToken());
// or it will feed the logs.
exit();
} catch (SignatureIsGoneException $e) {
return $this->fail($e, [], Http::STATUS_GONE, false);
} catch (Exception $e) {
@ -220,7 +235,11 @@ class ActivityPubController extends Controller {
} catch (ItemUnknownException $e) {
}
return $this->success([]);
$this->async();
$this->streamQueueService->cacheStreamByToken($activity->getRequestToken());
// or it will feed the logs.
exit();
} catch (SignatureIsGoneException $e) {
return $this->fail($e, [], Http::STATUS_GONE);
} catch (Exception $e) {

Wyświetl plik

@ -38,7 +38,7 @@ use OCA\Social\Exceptions\AccountDoesNotExistException;
use OCA\Social\Exceptions\InvalidResourceException;
use OCA\Social\Model\ActivityPub\ACore;
use OCA\Social\Model\ActivityPub\Actor\Person;
use OCA\Social\Model\ActivityPub\Object\Note;
use OCA\Social\Model\ActivityPub\Stream;
use OCA\Social\Model\Post;
use OCA\Social\Service\AccountService;
use OCA\Social\Service\CacheActorService;
@ -47,6 +47,7 @@ use OCA\Social\Service\FollowService;
use OCA\Social\Service\MiscService;
use OCA\Social\Service\NoteService;
use OCA\Social\Service\PostService;
use OCA\Social\Service\SearchService;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\DataResponse;
@ -82,6 +83,9 @@ class LocalController extends Controller {
/** @var NoteService */
private $noteService;
/** @var SearchService */
private $searchService;
/** @var AccountService */
private $accountService;
@ -106,14 +110,15 @@ class LocalController extends Controller {
* @param FollowService $followService
* @param PostService $postService
* @param NoteService $noteService
* @param SearchService $searchService
* @param DocumentService $documentService
* @param MiscService $miscService
*/
public function __construct(
IRequest $request, $userId, AccountService $accountService,
CacheActorService $cacheActorService, FollowService $followService,
PostService $postService, NoteService $noteService, DocumentService $documentService,
MiscService $miscService
PostService $postService, NoteService $noteService, SearchService $searchService,
DocumentService $documentService, MiscService $miscService
) {
parent::__construct(Application::APP_NAME, $request);
@ -121,6 +126,7 @@ class LocalController extends Controller {
$this->cacheActorService = $cacheActorService;
$this->accountService = $accountService;
$this->noteService = $noteService;
$this->searchService = $searchService;
$this->postService = $postService;
$this->followService = $followService;
$this->documentService = $documentService;
@ -139,12 +145,15 @@ class LocalController extends Controller {
*/
public function postCreate(array $data): DataResponse {
try {
$post = new Post($this->userId);
$actor = $this->accountService->getActorFromUserId($this->userId);
$post = new Post($actor);
$post->setContent($this->get('content', $data, ''));
$post->setReplyTo($this->get('replyTo', $data, ''));
$post->setTo($this->getArray('to', $data, []));
$post->addTo($this->get('to', $data, ''));
$post->setType($this->get('type', $data, Note::TYPE_PUBLIC));
$post->setType($this->get('type', $data, Stream::TYPE_PUBLIC));
$post->setHashtags($this->getArray('hashtags', $data, []));
/** @var ACore $activity */
$token = $this->postService->createPost($post, $activity);
@ -188,6 +197,34 @@ class LocalController extends Controller {
/**
* Create a new boost.
*
* @NoAdminRequired
*
* @param string $postId
*
* @return DataResponse
*/
public function postBoost(string $postId): DataResponse {
try {
$this->initViewer(true);
$token = $this->noteService->createBoost($this->viewer, $postId, $announce);
return $this->success(
[
'boost' => $announce,
'token' => $token
]
);
} catch (Exception $e) {
return $this->fail($e);
}
}
/**
* @NoCSRFRequired
* @NoAdminRequired
*
* @param int $since
@ -208,7 +245,6 @@ class LocalController extends Controller {
/**
* @NoCSRFRequired
* @NoAdminRequired
*
* @param int $since
@ -292,6 +328,30 @@ class LocalController extends Controller {
}
}
/**
* Get timeline
*
* @NoAdminRequired
*
* @param string $hashtag
* @param int $since
* @param int $limit
*
* @return DataResponse
*/
public function streamTag(string $hashtag, int $since = 0, int $limit = 5): DataResponse {
try {
$this->initViewer(true);
$posts = $this->noteService->getStreamLocalTag($this->viewer, $hashtag, $since, $limit);
return $this->success($posts);
} catch (Exception $e) {
return $this->fail($e);
}
}
/**
* Get timeline
*
@ -324,6 +384,7 @@ class LocalController extends Controller {
try {
$actor = $this->accountService->getActorFromUserId($this->userId);
$this->followService->followAccount($actor, $account);
$this->accountService->cacheLocalActorDetailCount($actor);
return $this->success([]);
} catch (Exception $e) {
@ -343,6 +404,7 @@ class LocalController extends Controller {
try {
$actor = $this->accountService->getActorFromUserId($this->userId);
$this->followService->unfollowAccount($actor, $account);
$this->accountService->cacheLocalActorDetailCount($actor);
return $this->success([]);
} catch (Exception $e) {
@ -397,9 +459,9 @@ class LocalController extends Controller {
$this->initViewer();
$actor = $this->accountService->getActorFromUserId($this->userId);
$followers = $this->followService->getFollowing($actor);
$following = $this->followService->getFollowing($actor);
return $this->success($followers);
return $this->success($following);
} catch (Exception $e) {
return $this->fail($e);
}
@ -577,6 +639,30 @@ class LocalController extends Controller {
}
/** // TODO - remove this tag
*
* @NoCSRFRequired
* @NoAdminRequired
*
* @param string $search
*
* @return DataResponse
* @throws Exception
*/
public function search(string $search): DataResponse {
$search = trim($search);
$this->initViewer();
$result = [
'accounts' => $this->searchService->searchAccounts($search),
'hashtags' => $this->searchService->searchHashtags($search),
'content' => $this->searchService->searchStreamContent($search)
];
return $this->success($result);
}
/**
* @NoAdminRequired
*
@ -610,13 +696,19 @@ class LocalController extends Controller {
*/
private function initViewer(bool $exception = false) {
if (!isset($this->userId)) {
if ($exception) {
throw new AccountDoesNotExistException('userId not defined');
}
return;
}
try {
$this->viewer = $this->accountService->getActorFromUserId($this->userId, true);
$this->followService->setViewerId($this->viewer->getId());
$this->cacheActorService->setViewerId($this->viewer->getId());
$this->noteService->setViewer($this->viewer);
$this->followService->setViewer($this->viewer);
$this->cacheActorService->setViewer($this->viewer);
} catch (Exception $e) {
if ($exception) {
throw new AccountDoesNotExistException();

Wyświetl plik

@ -0,0 +1,188 @@
<?php
declare(strict_types=1);
/**
* Nextcloud - Social Support
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Maxence Lange <maxence@artificial-owl.com>
* @copyright 2018, Maxence Lange <maxence@artificial-owl.com>
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\Social\Controller;
use daita\MySmallPhpTools\Exceptions\ArrayNotFoundException;
use daita\MySmallPhpTools\Traits\Nextcloud\TNCDataResponse;
use daita\MySmallPhpTools\Traits\TArrayTools;
use Exception;
use OCA\Social\AppInfo\Application;
use OCA\Social\Exceptions\RetrieveAccountFormatException;
use OCA\Social\Service\AccountService;
use OCA\Social\Service\CacheActorService;
use OCA\Social\Service\CurlService;
use OCA\Social\Service\MiscService;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\Response;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\IRequest;
use OCP\IUserManager;
use OCP\IUserSession;
class OStatusController extends Controller {
use TNCDataResponse;
use TArrayTools;
/** @var CacheActorService */
private $cacheActorService;
/** @var AccountService */
private $accountService;
/** @var CurlService */
private $curlService;
/** @var MiscService */
private $miscService;
/** @var IUserManager */
private $userSession;
/**
* OStatusController constructor.
*
* @param IRequest $request
* @param CacheActorService $cacheActorService
* @param AccountService $accountService
* @param CurlService $curlService
* @param MiscService $miscService
*/
public function __construct(
IRequest $request, CacheActorService $cacheActorService, AccountService $accountService,
CurlService $curlService, MiscService $miscService, IUserSession $userSession
) {
parent::__construct(Application::APP_NAME, $request);
$this->cacheActorService = $cacheActorService;
$this->accountService = $accountService;
$this->curlService = $curlService;
$this->miscService = $miscService;
$this->userSession = $userSession;
}
/**
* @NoCSRFRequired
* @NoAdminRequired
*
* @param string $uri
*
* @return Response
*/
public function subscribe(string $uri): Response {
try {
$actor = $this->cacheActorService->getFromAccount($uri);
$user = $this->userSession->getUser();
if ($user === null) {
return $this->fail('Failed to retrieve current user');
}
return new TemplateResponse('social', 'ostatus', [
'serverData' => [
'account' => $actor->getAccount(),
'currentUser' => [
'uid' => $user->getUID(),
'displayName' => $user->getDisplayName(),
]
]
], 'guest');
} catch (Exception $e) {
return $this->fail($e);
}
}
/**
* @NoCSRFRequired
* @NoAdminRequired
* @PublicPage
*
* @param string $local
* @return Response
*/
public function followRemote(string $local): Response {
try {
$following = $this->accountService->getActor($local);
return new TemplateResponse('social', 'ostatus', [
'serverData' => [
'local' => $local,
'account' => $following->getAccount()
]
], 'guest');
} catch (\Exception $e) {
return $this->fail($e);
}
}
/**
* @NoCSRFRequired
* @NoAdminRequired
* @PublicPage
*
* @param string $local
* @param string $account
*
* @return Response
*/
public function getLink(string $local, string $account): Response {
try {
$following = $this->accountService->getActor($local);
$result = $this->curlService->webfingerAccount($account);
try {
$link = $this->extractArray(
'rel', 'http://ostatus.org/schema/1.0/subscribe',
$this->getArray('links', $result)
);
} catch (ArrayNotFoundException $e) {
throw new RetrieveAccountFormatException();
}
$template = $this->get('template', $link, '');
$url = str_replace('{uri}', $following->getAccount(), $template);
return $this->success(['url' => $url]);
} catch (Exception $e) {
return $this->fail($e);
}
}
}

Wyświetl plik

@ -36,7 +36,7 @@ use OCA\Social\Exceptions\SocialAppConfigException;
use OCA\Social\Model\RequestQueue;
use OCA\Social\Service\ActivityService;
use OCA\Social\Service\MiscService;
use OCA\Social\Service\QueueService;
use OCA\Social\Service\RequestQueueService;
use OCP\AppFramework\Controller;
use OCP\IRequest;
@ -51,8 +51,8 @@ class QueueController extends Controller {
use TAsync;
/** @var QueueService */
private $queueService;
/** @var RequestQueueService */
private $requestQueueService;
/** @var ActivityService */
private $activityService;
@ -65,17 +65,17 @@ class QueueController extends Controller {
* QueueController constructor.
*
* @param IRequest $request
* @param QueueService $queueService
* @param RequestQueueService $requestQueueService
* @param ActivityService $activityService
* @param MiscService $miscService
*/
public function __construct(
IRequest $request, QueueService $queueService, ActivityService $activityService,
IRequest $request, RequestQueueService $requestQueueService, ActivityService $activityService,
MiscService $miscService
) {
parent::__construct(Application::APP_NAME, $request);
$this->queueService = $queueService;
$this->requestQueueService = $requestQueueService;
$this->activityService = $activityService;
$this->miscService = $miscService;
}
@ -87,8 +87,8 @@ class QueueController extends Controller {
*
* @param string $token
*/
public function asyncWithToken(string $token) {
$requests = $this->queueService->getRequestFromToken($token, RequestQueue::STATUS_STANDBY);
public function asyncForRequest(string $token) {
$requests = $this->requestQueueService->getRequestFromToken($token, RequestQueue::STATUS_STANDBY);
if (!empty($requests)) {
$this->async();

Wyświetl plik

@ -38,6 +38,7 @@ use OCA\Social\Service\AccountService;
use OCA\Social\Service\CacheActorService;
use OCA\Social\Service\ConfigService;
use OCA\Social\Service\DocumentService;
use OCA\Social\Service\HashtagService;
use OCA\Social\Service\MiscService;
use OCP\AppFramework\QueryException;
@ -59,6 +60,9 @@ class Cache extends TimedJob {
/** @var DocumentService */
private $documentService;
/** @var HashtagService */
private $hashtagService;
/** @var ConfigService */
private $configService;
@ -86,6 +90,7 @@ class Cache extends TimedJob {
$this->accountService = $c->query(AccountService::class);
$this->cacheActorService = $c->query(CacheActorService::class);
$this->documentService = $c->query(DocumentService::class);
$this->hashtagService = $c->query(HashtagService::class);
$this->configService = $c->query(ConfigService::class);
$this->miscService = $c->query(MiscService::class);
@ -113,6 +118,11 @@ class Cache extends TimedJob {
$this->documentService->manageCacheDocuments();
} catch (Exception $e) {
}
try {
$this->hashtagService->manageHashtags();
} catch (Exception $e) {
}
}

Wyświetl plik

@ -36,7 +36,8 @@ use OCA\Social\AppInfo\Application;
use OCA\Social\Exceptions\SocialAppConfigException;
use OCA\Social\Service\ActivityService;
use OCA\Social\Service\MiscService;
use OCA\Social\Service\QueueService;
use OCA\Social\Service\RequestQueueService;
use OCA\Social\Service\StreamQueueService;
use OCP\AppFramework\QueryException;
@ -51,8 +52,11 @@ class Queue extends TimedJob {
/** @var ActivityService */
private $activityService;
/** @var QueueService */
private $queueService;
/** @var RequestQueueService */
private $requestQueueService;
/** @var StreamQueueService */
private $streamQueueService;
/** @var MiscService */
private $miscService;
@ -75,18 +79,20 @@ class Queue extends TimedJob {
$app = new Application();
$c = $app->getContainer();
$this->queueService = $c->query(QueueService::class);
$this->requestQueueService = $c->query(RequestQueueService::class);
$this->streamQueueService = $c->query(StreamQueueService::class);
$this->activityService = $c->query(ActivityService::class);
$this->miscService = $c->query(MiscService::class);
$this->manageQueue();
$this->manageRequestQueue();
$this->manageStreamQueue();
}
/**
*/
private function manageQueue() {
$requests = $this->queueService->getRequestStandby();
private function manageRequestQueue() {
$requests = $this->requestQueueService->getRequestStandby();
$this->activityService->manageInit();
foreach ($requests as $request) {
@ -99,5 +105,15 @@ class Queue extends TimedJob {
}
private function manageStreamQueue() {
$items = $this->streamQueueService->getRequestStandby($total);
foreach ($items as $item) {
$this->streamQueueService->manageStreamQueue($item);
}
}
}

Wyświetl plik

@ -114,8 +114,10 @@ class CacheActorsRequest extends CacheActorsRequestBuilder {
* insert cache about an Actor in database.
*
* @param Person $actor
*
* @return int
*/
public function update(Person $actor) {
public function update(Person $actor): int {
if ($actor->getCreation() > 0) {
$dTime = new DateTime();
@ -155,7 +157,8 @@ class CacheActorsRequest extends CacheActorsRequestBuilder {
$qb->set('icon_id', $qb->createNamedParameter($iconId));
$this->limitToIdString($qb, $actor->getId());
$qb->execute();
return $qb->execute();
}
@ -247,6 +250,7 @@ class CacheActorsRequest extends CacheActorsRequestBuilder {
$this->searchInAccount($qb, $search);
$this->leftJoinCacheDocuments($qb, 'icon_id');
$this->leftJoinDetails($qb);
$this->limitResults($qb, 25);
$accounts = [];
$cursor = $qb->execute();

Wyświetl plik

@ -37,7 +37,7 @@ use Doctrine\DBAL\Query\QueryBuilder;
use Exception;
use OCA\Social\Exceptions\InvalidResourceException;
use OCA\Social\Model\ActivityPub\Object\Document;
use OCA\Social\Model\ActivityPub\Activity\Follow;
use OCA\Social\Model\ActivityPub\Object\Follow;
use OCA\Social\Model\ActivityPub\Object\Image;
use OCA\Social\Model\ActivityPub\Actor\Person;
use OCA\Social\Service\ConfigService;
@ -58,12 +58,15 @@ class CoreRequestBuilder {
const TABLE_SERVER_ACTORS = 'social_server_actors';
const TABLE_SERVER_NOTES = 'social_server_notes';
const TABLE_SERVER_HASHTAGS = 'social_server_hashtags';
const TABLE_SERVER_FOLLOWS = 'social_server_follows';
const TABLE_CACHE_ACTORS = 'social_cache_actors';
const TABLE_CACHE_DOCUMENTS = 'social_cache_documents';
const TABLE_QUEUE_STREAM = 'social_queue_stream';
/** @var IDBConnection */
protected $dbConnection;
@ -77,8 +80,8 @@ class CoreRequestBuilder {
/** @var string */
protected $defaultSelectAlias;
/** @var string */
private $viewerId = '';
/** @var Person */
protected $viewer = null;
/**
@ -98,17 +101,10 @@ class CoreRequestBuilder {
/**
* @return string
* @param Person $viewer
*/
public function getViewerId(): string {
return $this->viewerId;
}
/**
* @param string $viewerId
*/
public function setViewerId(string $viewerId) {
$this->viewerId = $viewerId;
public function setViewer(Person $viewer) {
$this->viewer = $viewer;
}
@ -145,6 +141,17 @@ class CoreRequestBuilder {
}
/**
* Limit the request to the ActivityId
*
* @param IQueryBuilder $qb
* @param string $activityId
*/
protected function limitToActivityId(IQueryBuilder &$qb, string $activityId) {
$this->limitToDBField($qb, 'activity_id', $activityId, false);
}
/**
* Limit the request to the Preferred Username
*
@ -189,6 +196,39 @@ class CoreRequestBuilder {
$this->limitToDBField($qb, 'token', $token);
}
/**
* Limit the results to a given number
*
* @param IQueryBuilder $qb
* @param int $limit
*/
protected function limitResults(IQueryBuilder $qb, int $limit) {
$qb->setMaxResults($limit);
}
/**
* Limit the request to the ActorId
*
* @param IQueryBuilder $qb
* @param string $hashtag
*/
protected function limitToHashtag(IQueryBuilder &$qb, string $hashtag) {
$this->limitToDBField($qb, 'hashtag', $hashtag, false);
}
/**
* Limit the request to the ActorId
*
* @param IQueryBuilder $qb
* @param string $hashtag
*/
protected function searchInHashtag(IQueryBuilder &$qb, string $hashtag) {
$dbConn = $this->dbConnection;
$this->searchInDBField($qb, 'hashtag', '%' . $dbConn->escapeLikeParameter($hashtag) . '%');
}
/**
* Limit the request to the ActorId
@ -494,6 +534,27 @@ class CoreRequestBuilder {
}
/**
* @param IQueryBuilder $qb
* @param int $timestamp
* @param string $field
*/
protected function limitToSince(IQueryBuilder $qb, int $timestamp, string $field) {
$dTime = new \DateTime();
$dTime->setTimestamp($timestamp);
$expr = $qb->expr();
$pf = ($qb->getType() === QueryBuilder::SELECT) ? $this->defaultSelectAlias . '.' : '';
$field = $pf . $field;
$orX = $expr->orX();
$orX->add($expr->gte($field, $qb->createNamedParameter($dTime, IQueryBuilder::PARAM_DATE)));
$qb->andWhere($orX);
}
/**
* @param IQueryBuilder $qb
* @param string $field
@ -666,8 +727,7 @@ class CoreRequestBuilder {
return;
}
$viewerId = $this->getViewerId();
if ($viewerId === '') {
if ($this->viewer === null) {
return;
}
@ -688,7 +748,7 @@ class CoreRequestBuilder {
$andX->add(
$expr->eq(
$func->lower($prefix . '_f.actor_id'),
$func->lower($qb->createNamedParameter($viewerId))
$func->lower($qb->createNamedParameter($this->viewer->getId()))
)
);
} else {
@ -700,7 +760,7 @@ class CoreRequestBuilder {
$andX->add(
$expr->eq(
$func->lower($prefix . '_f.object_id'),
$func->lower($qb->createNamedParameter($viewerId))
$func->lower($qb->createNamedParameter($this->viewer->getId()))
)
);
}
@ -764,24 +824,25 @@ class CoreRequestBuilder {
* @param array $data
*/
protected function assignDetails(Person $actor, array $data) {
if ($this->getViewerId() !== '') {
try {
$this->parseFollowLeftJoin($data, 'as_follower');
$actor->addDetailBool('following', true);
} catch (InvalidResourceException $e) {
$actor->addDetailBool('following', false);
}
try {
$this->parseFollowLeftJoin($data, 'as_followed');
$actor->addDetailBool('followed', true);
} catch (InvalidResourceException $e) {
$actor->addDetailBool('followed', false);
}
$actor->setCompleteDetails(true);
if ($this->viewer === null) {
return;
}
try {
$this->parseFollowLeftJoin($data, 'as_follower');
$actor->addDetailBool('following', true);
} catch (InvalidResourceException $e) {
$actor->addDetailBool('following', false);
}
try {
$this->parseFollowLeftJoin($data, 'as_followed');
$actor->addDetailBool('followed', true);
} catch (InvalidResourceException $e) {
$actor->addDetailBool('followed', false);
}
$actor->setCompleteDetails(true);
}

Wyświetl plik

@ -34,7 +34,7 @@ namespace OCA\Social\Db;
use daita\MySmallPhpTools\Traits\TArrayTools;
use DateTime;
use OCA\Social\Exceptions\FollowDoesNotExistException;
use OCA\Social\Model\ActivityPub\Activity\Follow;
use OCA\Social\Model\ActivityPub\Object\Follow;
use OCP\DB\QueryBuilder\IQueryBuilder;

Wyświetl plik

@ -33,7 +33,7 @@ namespace OCA\Social\Db;
use daita\MySmallPhpTools\Traits\TArrayTools;
use OCA\Social\Exceptions\InvalidResourceException;
use OCA\Social\Model\ActivityPub\Activity\Follow;
use OCA\Social\Model\ActivityPub\Object\Follow;
use OCP\DB\QueryBuilder\IQueryBuilder;

Wyświetl plik

@ -0,0 +1,145 @@
<?php
declare(strict_types=1);
/**
* Nextcloud - Social Support
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Maxence Lange <maxence@artificial-owl.com>
* @copyright 2018, Maxence Lange <maxence@artificial-owl.com>
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\Social\Db;
use daita\MySmallPhpTools\Traits\TArrayTools;
use DateTime;
use OCA\Social\Exceptions\FollowDoesNotExistException;
use OCA\Social\Exceptions\HashtagDoesNotExistException;
use OCA\Social\Model\ActivityPub\Activity\Follow;
use OCP\DB\QueryBuilder\IQueryBuilder;
/**
* Class HashtagsRequest
*
* @package OCA\Social\Db
*/
class HashtagsRequest extends HashtagsRequestBuilder {
use TArrayTools;
/**
* Insert a new Hashtag.
*
* @param string $hashtag
* @param array $trend
*/
public function save(string $hashtag, array $trend) {
$qb = $this->getHashtagsInsertSql();
$qb->setValue('hashtag', $qb->createNamedParameter($hashtag))
->setValue('trend', $qb->createNamedParameter(json_encode($trend)));
$qb->execute();
}
/**
* Insert a new Hashtag.
*
* @param string $hashtag
* @param array $trend
*/
public function update(string $hashtag, array $trend) {
$qb = $this->getHashtagsUpdateSql();
$qb->set('trend', $qb->createNamedParameter(json_encode($trend)));
$this->limitToHashtag($qb, $hashtag);
$qb->execute();
}
/**
* @return array
*/
public function getAll(): array {
$qb = $this->getHashtagsSelectSql();
$hashtags = [];
$cursor = $qb->execute();
while ($data = $cursor->fetch()) {
$hashtags[] = $this->parseHashtagsSelectSql($data);
}
$cursor->closeCursor();
return $hashtags;
}
/**
* @param string $hashtag
*
* @return array
* @throws HashtagDoesNotExistException
*/
public function getHashtag(string $hashtag): array {
$qb = $this->getHashtagsSelectSql();
$this->limitToHashtag($qb, $hashtag);
$cursor = $qb->execute();
$data = $cursor->fetch();
$cursor->closeCursor();
if ($data === false) {
throw new HashtagDoesNotExistException();
}
return $this->parseHashtagsSelectSql($data);
}
/**
* @param string $hashtag
*
* @return array
*/
public function searchHashtags(string $hashtag): array {
$qb = $this->getHashtagsSelectSql();
$this->searchInHashtag($qb, $hashtag);
$this->limitResults($qb, 25);
$hashtags = [];
$cursor = $qb->execute();
while ($data = $cursor->fetch()) {
$hashtags[] = $this->parseHashtagsSelectSql($data);
}
$cursor->closeCursor();
return $hashtags;
}
}

Wyświetl plik

@ -0,0 +1,121 @@
<?php
declare(strict_types=1);
/**
* Nextcloud - Social Support
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Maxence Lange <maxence@artificial-owl.com>
* @copyright 2018, Maxence Lange <maxence@artificial-owl.com>
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\Social\Db;
use daita\MySmallPhpTools\Traits\TArrayTools;
use OCA\Social\Exceptions\InvalidResourceException;
use OCA\Social\Model\ActivityPub\Activity\Follow;
use OCP\DB\QueryBuilder\IQueryBuilder;
/**
* Class HashtagsRequestBuilder
*
* @package OCA\Social\Db
*/
class HashtagsRequestBuilder extends CoreRequestBuilder {
use TArrayTools;
/**
* Base of the Sql Insert request
*
* @return IQueryBuilder
*/
protected function getHashtagsInsertSql(): IQueryBuilder {
$qb = $this->dbConnection->getQueryBuilder();
$qb->insert(self::TABLE_SERVER_HASHTAGS);
return $qb;
}
/**
* Base of the Sql Update request
*
* @return IQueryBuilder
*/
protected function getHashtagsUpdateSql(): IQueryBuilder {
$qb = $this->dbConnection->getQueryBuilder();
$qb->update(self::TABLE_SERVER_HASHTAGS);
return $qb;
}
/**
* Base of the Sql Select request for Shares
*
* @return IQueryBuilder
*/
protected function getHashtagsSelectSql(): IQueryBuilder {
$qb = $this->dbConnection->getQueryBuilder();
/** @noinspection PhpMethodParametersCountMismatchInspection */
$qb->select('h.hashtag', 'h.trend')
->from(self::TABLE_SERVER_HASHTAGS, 'h');
$this->defaultSelectAlias = 'h';
return $qb;
}
/**
* Base of the Sql Delete request
*
* @return IQueryBuilder
*/
protected function getHashtagsDeleteSql(): IQueryBuilder {
$qb = $this->dbConnection->getQueryBuilder();
$qb->delete(self::TABLE_SERVER_HASHTAGS);
return $qb;
}
/**
* @param array $data
*
* @return array
*/
protected function parseHashtagsSelectSql($data): array {
return [
'hashtag' => $this->get('hashtag', $data, ''),
'trend' => $this->getArray('trend', $data, [])
];
}
}

Wyświetl plik

@ -30,12 +30,14 @@ declare(strict_types=1);
namespace OCA\Social\Db;
use daita\MySmallPhpTools\Model\Cache;
use DateTime;
use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
use OCA\Social\Exceptions\NoteNotFoundException;
use OCA\Social\Model\ActivityPub\ACore;
use OCA\Social\Model\ActivityPub\Actor\Person;
use OCA\Social\Model\ActivityPub\Object\Note;
use OCA\Social\Model\ActivityPub\Stream;
use OCA\Social\Service\ConfigService;
use OCA\Social\Service\MiscService;
use OCP\DB\QueryBuilder\IQueryBuilder;
@ -59,57 +61,36 @@ class NotesRequest extends NotesRequestBuilder {
/**
* Insert a new Note in the database.
*
* @param Note $note
* @param Stream $stream
*/
public function save(Note $note) {
$dTime = new DateTime();
$dTime->setTimestamp($note->getPublishedTime());
public function save(Stream $stream) {
$qb = $this->saveStream($stream);
$qb = $this->getNotesInsertSql();
$qb->setValue('id', $qb->createNamedParameter($note->getId()))
->setValue('type', $qb->createNamedParameter($note->getType()))
->setValue('to', $qb->createNamedParameter($note->getTo()))
->setValue(
'to_array', $qb->createNamedParameter(
json_encode($note->getToArray(), JSON_UNESCAPED_SLASHES)
)
)
->setValue(
'cc', $qb->createNamedParameter(
json_encode($note->getCcArray(), JSON_UNESCAPED_SLASHES)
)
)
->setValue(
'bcc', $qb->createNamedParameter(
json_encode($note->getBccArray()), JSON_UNESCAPED_SLASHES
)
)
->setValue('content', $qb->createNamedParameter($note->getContent()))
->setValue('summary', $qb->createNamedParameter($note->getSummary()))
->setValue(
if ($stream->getType() === Note::TYPE) {
/** @var Note $stream */
$qb->setValue(
'hashtags', $qb->createNamedParameter(json_encode($stream->getHashtags()))
)
->setValue(
'attachments', $qb->createNamedParameter(
json_encode($note->getAttachments(), JSON_UNESCAPED_SLASHES)
)
)
->setValue('published', $qb->createNamedParameter($note->getPublished()))
->setValue(
'published_time', $qb->createNamedParameter($dTime, IQueryBuilder::PARAM_DATE)
)
->setValue('attributed_to', $qb->createNamedParameter($note->getAttributedTo()))
->setValue('in_reply_to', $qb->createNamedParameter($note->getInReplyTo()))
->setValue('source', $qb->createNamedParameter($note->getSource()))
->setValue(
'instances', $qb->createNamedParameter(
json_encode($note->getInstancePaths(), JSON_UNESCAPED_SLASHES)
)
)
->setValue('local', $qb->createNamedParameter(($note->isLocal()) ? '1' : '0'))
->setValue(
'creation',
$qb->createNamedParameter(new DateTime('now'), IQueryBuilder::PARAM_DATE)
);
}
$qb->execute();
}
/**
* @param Stream $stream
* @param Cache $cache
*/
public function updateCache(Stream $stream, Cache $cache) {
$qb = $this->getNotesUpdateSql();
$qb->set('cache', $qb->createNamedParameter(json_encode($cache, JSON_UNESCAPED_SLASHES)));
$this->limitToIdString($qb, $stream->getId());
try {
$qb->execute();
@ -120,11 +101,12 @@ class NotesRequest extends NotesRequestBuilder {
/**
* @param string $id
* @param bool $asViewer
*
* @return Note
* @throws NoteNotFoundException
*/
public function getNoteById(string $id): Note {
public function getNoteById(string $id, bool $asViewer = false): Note {
if ($id === '') {
throw new NoteNotFoundException();
};
@ -132,6 +114,36 @@ class NotesRequest extends NotesRequestBuilder {
$qb = $this->getNotesSelectSql();
$this->limitToIdString($qb, $id);
if ($asViewer) {
$this->limitToViewer($qb);
}
$cursor = $qb->execute();
$data = $cursor->fetch();
$cursor->closeCursor();
if ($data === false) {
throw new NoteNotFoundException('Post not found');
}
return $this->parseNotesSelectSql($data);
}
/**
* @param string $id
*
* @return Note
* @throws NoteNotFoundException
*/
public function getNoteByActivityId(string $id): Note {
if ($id === '') {
throw new NoteNotFoundException();
};
$qb = $this->getNotesSelectSql();
$this->limitToActivityId($qb, $id);
$cursor = $qb->execute();
$data = $cursor->fetch();
$cursor->closeCursor();
@ -315,6 +327,64 @@ class NotesRequest extends NotesRequestBuilder {
}
/**
* Should returns:
* - All public post related to a tag (not yet)
* - direct message related to a tag (not yet)
* - message to followers related to a tag (not yet)
*
* @param Person $actor
* @param string $hashtag
* @param int $since
* @param int $limit
*
* @return array
*/
public function getStreamTag(Person $actor, string $hashtag, int $since = 0, int $limit = 5
): array {
$qb = $this->getNotesSelectSql();
$on = $this->exprJoinFollowing($qb, $actor);
$on->add($this->exprLimitToRecipient($qb, ACore::CONTEXT_PUBLIC, false));
$on->add($this->exprLimitToRecipient($qb, $actor->getId(), true));
$qb->join($this->defaultSelectAlias, CoreRequestBuilder::TABLE_SERVER_FOLLOWS, 'f', $on);
$qb->andWhere($this->exprValueWithinJsonFormat($qb, 'hashtags', '' . $hashtag));
$this->limitPaginate($qb, $since, $limit);
$this->leftJoinCacheActors($qb, 'attributed_to');
$notes = [];
$cursor = $qb->execute();
while ($data = $cursor->fetch()) {
$notes[] = $this->parseNotesSelectSql($data);
}
$cursor->closeCursor();
return $notes;
}
/**
* @param int $since
*
* @return Note[]
*/
public function getNotesSince(int $since): array {
$qb = $this->getNotesSelectSql();
$this->limitToSince($qb, $since, 'published_time');
$notes = [];
$cursor = $qb->execute();
while ($data = $cursor->fetch()) {
$notes[] = $this->parseNotesSelectSql($data);
}
$cursor->closeCursor();
return $notes;
}
/**
* @param string $id
*/
@ -325,5 +395,77 @@ class NotesRequest extends NotesRequestBuilder {
$qb->execute();
}
/**
* @param string $actorId
*/
public function deleteByAuthor(string $actorId) {
$qb = $this->getNotesDeleteSql();
$this->limitToAttributedTo($qb, $actorId);
$qb->execute();
}
/**
* Insert a new Note in the database.
*
* @param Stream $note
*
* @return IQueryBuilder
*/
public function saveStream(Stream $note): IQueryBuilder {
$dTime = new DateTime();
$dTime->setTimestamp($note->getPublishedTime());
$cache = '[]';
if ($note->gotCache()) {
$cache = json_encode($note->getCache(), JSON_UNESCAPED_SLASHES);
}
$qb = $this->getNotesInsertSql();
$qb->setValue('id', $qb->createNamedParameter($note->getId()))
->setValue('type', $qb->createNamedParameter($note->getType()))
->setValue('to', $qb->createNamedParameter($note->getTo()))
->setValue(
'to_array', $qb->createNamedParameter(
json_encode($note->getToArray(), JSON_UNESCAPED_SLASHES)
)
)
->setValue(
'cc', $qb->createNamedParameter(
json_encode($note->getCcArray(), JSON_UNESCAPED_SLASHES)
)
)
->setValue(
'bcc', $qb->createNamedParameter(
json_encode($note->getBccArray()), JSON_UNESCAPED_SLASHES
)
)
->setValue('content', $qb->createNamedParameter($note->getContent()))
->setValue('summary', $qb->createNamedParameter($note->getSummary()))
->setValue('published', $qb->createNamedParameter($note->getPublished()))
->setValue(
'published_time', $qb->createNamedParameter($dTime, IQueryBuilder::PARAM_DATE)
)
->setValue('attributed_to', $qb->createNamedParameter($note->getAttributedTo()))
->setValue('in_reply_to', $qb->createNamedParameter($note->getInReplyTo()))
->setValue('source', $qb->createNamedParameter($note->getSource()))
->setValue('object_id', $qb->createNamedParameter($note->getObjectId()))
->setValue('cache', $qb->createNamedParameter($cache))
->setValue(
'instances', $qb->createNamedParameter(
json_encode($note->getInstancePaths(), JSON_UNESCAPED_SLASHES)
)
)
->setValue('local', $qb->createNamedParameter(($note->isLocal()) ? '1' : '0'))
->setValue(
'creation',
$qb->createNamedParameter(new DateTime('now'), IQueryBuilder::PARAM_DATE)
);
return $qb;
}
}

Wyświetl plik

@ -33,6 +33,7 @@ namespace OCA\Social\Db;
use daita\MySmallPhpTools\Traits\TArrayTools;
use Doctrine\DBAL\Query\QueryBuilder;
use OCA\Social\Exceptions\InvalidResourceException;
use OCA\Social\Model\ActivityPub\ACore;
use OCA\Social\Model\ActivityPub\Actor\Person;
use OCA\Social\Model\ActivityPub\Object\Note;
use OCA\Social\Model\InstancePath;
@ -80,11 +81,13 @@ class NotesRequestBuilder extends CoreRequestBuilder {
$qb = $this->dbConnection->getQueryBuilder();
/** @noinspection PhpMethodParametersCountMismatchInspection */
$qb->select(
'sn.id', 'sn.type', 'sn.to', 'sn.to_array', 'sn.cc', 'sn.bcc', 'sn.content',
'sn.summary', 'sn.attachments', 'sn.published', 'sn.published_time', 'sn.attributed_to',
'sn.in_reply_to', 'sn.source', 'sn.local', 'sn.instances', 'sn.creation'
)
$qb->selectDistinct('sn.id')
->addSelect(
'sn.type', 'sn.to', 'sn.to_array', 'sn.cc', 'sn.bcc', 'sn.content',
'sn.summary', 'sn.attachments', 'sn.published', 'sn.published_time', 'sn.cache', 'sn.object_id',
'sn.attributed_to', 'sn.in_reply_to', 'sn.source', 'sn.local', 'sn.instances',
'sn.creation'
)
->from(self::TABLE_SERVER_NOTES, 'sn');
$this->defaultSelectAlias = 'sn';
@ -122,6 +125,19 @@ class NotesRequestBuilder extends CoreRequestBuilder {
}
/**
* @param IQueryBuilder $qb
*/
protected function limitToViewer(IQueryBuilder $qb) {
$actor = $this->viewer;
$on = $this->exprJoinFollowing($qb, $actor, false);
$on->add($this->exprLimitToRecipient($qb, ACore::CONTEXT_PUBLIC, false));
$on->add($this->exprLimitToRecipient($qb, $actor->getId(), true));
$qb->join($this->defaultSelectAlias, CoreRequestBuilder::TABLE_SERVER_FOLLOWS, 'f', $on);
}
/**
* @param IQueryBuilder $qb
* @param Person $actor
@ -131,12 +147,29 @@ class NotesRequestBuilder extends CoreRequestBuilder {
return;
}
$on = $this->exprJoinFollowing($qb, $actor);
$qb->join($this->defaultSelectAlias, CoreRequestBuilder::TABLE_SERVER_FOLLOWS, 'f', $on);
}
/**
* @param IQueryBuilder $qb
* @param Person $actor
*
* @param bool $followers
*
* @return ICompositeExpression
*/
protected function exprJoinFollowing(IQueryBuilder $qb, Person $actor, bool $followers = true) {
$expr = $qb->expr();
$func = $qb->func();
$pf = $this->defaultSelectAlias . '.';
$on = $expr->orX();
$on->add($this->exprLimitToRecipient($qb, $actor->getFollowers(), false));
if ($followers) {
$on->add($this->exprLimitToRecipient($qb, $actor->getFollowers(), false));
}
// list of possible recipient as a follower (to, to_array, cc, ...)
$recipientFields = $expr->orX();
@ -152,7 +185,7 @@ class NotesRequestBuilder extends CoreRequestBuilder {
$crossFollows->add($this->exprLimitToDBFieldInt($qb, 'accepted', 1, 'f'));
$on->add($crossFollows);
$qb->join($this->defaultSelectAlias, CoreRequestBuilder::TABLE_SERVER_FOLLOWS, 'f', $on);
return $on;
}

Wyświetl plik

@ -63,7 +63,7 @@ class RequestQueueRequest extends RequestQueueRequestBuilder {
* @param RequestQueue $queue
*/
public function create(RequestQueue $queue) {
$qb = $this->getQueueInsertSql();
$qb = $this->getRequestQueueInsertSql();
$qb->setValue('token', $qb->createNamedParameter($queue->getToken()))
->setValue('author', $qb->createNamedParameter($queue->getAuthor()))
->setValue('activity', $qb->createNamedParameter($queue->getActivity()))
@ -85,14 +85,14 @@ class RequestQueueRequest extends RequestQueueRequestBuilder {
* @return RequestQueue[]
*/
public function getStandby(): array {
$qb = $this->getQueueSelectSql();
$qb = $this->getRequestQueueSelectSql();
$this->limitToStatus($qb, RequestQueue::STATUS_STANDBY);
$qb->orderBy('id', 'asc');
$requests = [];
$cursor = $qb->execute();
while ($data = $cursor->fetch()) {
$requests[] = $this->parseQueueSelectSql($data);
$requests[] = $this->parseRequestQueueSelectSql($data);
}
$cursor->closeCursor();
@ -109,7 +109,7 @@ class RequestQueueRequest extends RequestQueueRequestBuilder {
* @return RequestQueue[]
*/
public function getFromToken(string $token, int $status = -1): array {
$qb = $this->getQueueSelectSql();
$qb = $this->getRequestQueueSelectSql();
$this->limitToToken($qb, $token);
if ($status > -1) {
@ -121,7 +121,7 @@ class RequestQueueRequest extends RequestQueueRequestBuilder {
$requests = [];
$cursor = $qb->execute();
while ($data = $cursor->fetch()) {
$requests[] = $this->parseQueueSelectSql($data);
$requests[] = $this->parseRequestQueueSelectSql($data);
}
$cursor->closeCursor();
@ -135,7 +135,7 @@ class RequestQueueRequest extends RequestQueueRequestBuilder {
* @throws QueueStatusException
*/
public function setAsRunning(RequestQueue &$queue) {
$qb = $this->getQueueUpdateSql();
$qb = $this->getRequestQueueUpdateSql();
$qb->set('status', $qb->createNamedParameter(RequestQueue::STATUS_RUNNING))
->set(
'last',
@ -160,7 +160,7 @@ class RequestQueueRequest extends RequestQueueRequestBuilder {
* @throws QueueStatusException
*/
public function setAsSuccess(RequestQueue &$queue) {
$qb = $this->getQueueUpdateSql();
$qb = $this->getRequestQueueUpdateSql();
$qb->set('status', $qb->createNamedParameter(RequestQueue::STATUS_SUCCESS));
$this->limitToId($qb, $queue->getId());
$this->limitToStatus($qb, RequestQueue::STATUS_RUNNING);
@ -176,12 +176,12 @@ class RequestQueueRequest extends RequestQueueRequestBuilder {
/**
* @param RequestQueue $queue >ll
* @param RequestQueue $queue
*
* @throws QueueStatusException
*/
public function setAsFailure(RequestQueue &$queue) {
$qb = $this->getQueueUpdateSql();
$qb = $this->getRequestQueueUpdateSql();
$func = $qb->func();
$expr = $qb->expr();
@ -201,7 +201,7 @@ class RequestQueueRequest extends RequestQueueRequestBuilder {
public function delete(RequestQueue $queue) {
$qb = $this->getQueueDeleteSql();
$qb = $this->getRequestQueueDeleteSql();
$this->limitToId($qb, $queue->getId());
$qb->execute();

Wyświetl plik

@ -45,7 +45,7 @@ class RequestQueueRequestBuilder extends CoreRequestBuilder {
*
* @return IQueryBuilder
*/
protected function getQueueInsertSql(): IQueryBuilder {
protected function getRequestQueueInsertSql(): IQueryBuilder {
$qb = $this->dbConnection->getQueryBuilder();
$qb->insert(self::TABLE_REQUEST_QUEUE);
@ -58,7 +58,7 @@ class RequestQueueRequestBuilder extends CoreRequestBuilder {
*
* @return IQueryBuilder
*/
protected function getQueueUpdateSql(): IQueryBuilder {
protected function getRequestQueueUpdateSql(): IQueryBuilder {
$qb = $this->dbConnection->getQueryBuilder();
$qb->update(self::TABLE_REQUEST_QUEUE);
@ -71,7 +71,7 @@ class RequestQueueRequestBuilder extends CoreRequestBuilder {
*
* @return IQueryBuilder
*/
protected function getQueueSelectSql(): IQueryBuilder {
protected function getRequestQueueSelectSql(): IQueryBuilder {
$qb = $this->dbConnection->getQueryBuilder();
/** @noinspection PhpMethodParametersCountMismatchInspection */
@ -92,7 +92,7 @@ class RequestQueueRequestBuilder extends CoreRequestBuilder {
*
* @return IQueryBuilder
*/
protected function getQueueDeleteSql(): IQueryBuilder {
protected function getRequestQueueDeleteSql(): IQueryBuilder {
$qb = $this->dbConnection->getQueryBuilder();
$qb->delete(self::TABLE_REQUEST_QUEUE);
@ -105,7 +105,7 @@ class RequestQueueRequestBuilder extends CoreRequestBuilder {
*
* @return RequestQueue
*/
protected function parseQueueSelectSql($data): RequestQueue {
protected function parseRequestQueueSelectSql($data): RequestQueue {
$queue = new RequestQueue();
$queue->importFromDatabase($data);

Wyświetl plik

@ -0,0 +1,189 @@
<?php
declare(strict_types=1);
/**
* Nextcloud - Social Support
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Maxence Lange <maxence@artificial-owl.com>
* @copyright 2018, Maxence Lange <maxence@artificial-owl.com>
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\Social\Db;
use DateTime;
use OCA\Social\Exceptions\QueueStatusException;
use OCA\Social\Model\StreamQueue;
use OCP\DB\QueryBuilder\IQueryBuilder;
/**
* Class StreamQueueRequest
*
* @package OCA\Social\Db
*/
class StreamQueueRequest extends StreamQueueRequestBuilder {
/**
* create a new Queue in the database.
*
* @param StreamQueue $queue
*/
public function create(StreamQueue $queue) {
$qb = $this->getStreamQueueInsertSql();
$qb->setValue('token', $qb->createNamedParameter($queue->getToken()))
->setValue('stream_id', $qb->createNamedParameter($queue->getStreamId()))
->setValue('type', $qb->createNamedParameter($queue->getType()))
->setValue('status', $qb->createNamedParameter($queue->getStatus()))
->setValue('tries', $qb->createNamedParameter($queue->getTries()));
$qb->execute();
}
/**
* return Queue from database based on the status=0
*
* @return StreamQueue[]
*/
public function getStandby(): array {
$qb = $this->getStreamQueueSelectSql();
$this->limitToStatus($qb, StreamQueue::STATUS_STANDBY);
$qb->orderBy('id', 'asc');
$requests = [];
$cursor = $qb->execute();
while ($data = $cursor->fetch()) {
$requests[] = $this->parseStreamQueueSelectSql($data);
}
$cursor->closeCursor();
return $requests;
}
/**
* return Queue from database based on the token
*
* @param string $token
*
* @return StreamQueue[]
*/
public function getFromToken(string $token): array {
$qb = $this->getStreamQueueSelectSql();
$this->limitToToken($qb, $token);
$queue = [];
$cursor = $qb->execute();
while ($data = $cursor->fetch()) {
$queue[] = $this->parseStreamQueueSelectSql($data);
}
$cursor->closeCursor();
return $queue;
}
/**
* @param StreamQueue $queue
*
* @throws QueueStatusException
*/
public function setAsRunning(StreamQueue &$queue) {
$qb = $this->getStreamQueueUpdateSql();
$qb->set('status', $qb->createNamedParameter(StreamQueue::STATUS_RUNNING))
->set(
'last',
$qb->createNamedParameter(new DateTime('now'), IQueryBuilder::PARAM_DATE)
);
$this->limitToId($qb, $queue->getId());
$this->limitToStatus($qb, StreamQueue::STATUS_STANDBY);
$count = $qb->execute();
if ($count === 0) {
throw new QueueStatusException();
}
$queue->setStatus(StreamQueue::STATUS_RUNNING);
}
/**
* @param StreamQueue $queue
*
* @throws QueueStatusException
*/
public function setAsSuccess(StreamQueue &$queue) {
$qb = $this->getStreamQueueUpdateSql();
$qb->set('status', $qb->createNamedParameter(StreamQueue::STATUS_SUCCESS));
$this->limitToId($qb, $queue->getId());
$this->limitToStatus($qb, StreamQueue::STATUS_RUNNING);
$count = $qb->execute();
if ($count === 0) {
throw new QueueStatusException();
}
$queue->setStatus(StreamQueue::STATUS_SUCCESS);
}
/**
* @param StreamQueue $queue
*
* @throws QueueStatusException
*/
public function setAsFailure(StreamQueue &$queue) {
$qb = $this->getStreamQueueUpdateSql();
$func = $qb->func();
$expr = $qb->expr();
$qb->set('status', $qb->createNamedParameter(StreamQueue::STATUS_STANDBY))
->set('tries', $func->add('tries', $expr->literal(1)));
$this->limitToId($qb, $queue->getId());
$this->limitToStatus($qb, StreamQueue::STATUS_RUNNING);
$count = $qb->execute();
if ($count === 0) {
throw new QueueStatusException();
}
$queue->setStatus(StreamQueue::STATUS_SUCCESS);
}
/**
* @param StreamQueue $queue
*/
public function delete(StreamQueue $queue) {
$qb = $this->getStreamQueueDeleteSql();
$this->limitToId($qb, $queue->getId());
$qb->execute();
}
}

Wyświetl plik

@ -0,0 +1,116 @@
<?php
declare(strict_types=1);
/**
* Nextcloud - Social Support
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Maxence Lange <maxence@artificial-owl.com>
* @copyright 2018, Maxence Lange <maxence@artificial-owl.com>
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\Social\Db;
use daita\MySmallPhpTools\Traits\TArrayTools;
use OCA\Social\Model\RequestQueue;
use OCA\Social\Model\StreamQueue;
use OCP\DB\QueryBuilder\IQueryBuilder;
class StreamQueueRequestBuilder extends CoreRequestBuilder {
use TArrayTools;
/**
* Base of the Sql Insert request
*
* @return IQueryBuilder
*/
protected function getStreamQueueInsertSql(): IQueryBuilder {
$qb = $this->dbConnection->getQueryBuilder();
$qb->insert(self::TABLE_QUEUE_STREAM);
return $qb;
}
/**
* Base of the Sql Update request
*
* @return IQueryBuilder
*/
protected function getStreamQueueUpdateSql(): IQueryBuilder {
$qb = $this->dbConnection->getQueryBuilder();
$qb->update(self::TABLE_QUEUE_STREAM);
return $qb;
}
/**
* Base of the Sql Select request for Shares
*
* @return IQueryBuilder
*/
protected function getStreamQueueSelectSql(): IQueryBuilder {
$qb = $this->dbConnection->getQueryBuilder();
/** @noinspection PhpMethodParametersCountMismatchInspection */
$qb->select(
'qs.id', 'qs.token', 'qs.stream_id', 'qs.type', 'qs.status', 'qs.tries', 'qs.last'
)
->from(self::TABLE_QUEUE_STREAM, 'qs');
$this->defaultSelectAlias = 'qs';
return $qb;
}
/**
* Base of the Sql Delete request
*
* @return IQueryBuilder
*/
protected function getStreamQueueDeleteSql(): IQueryBuilder {
$qb = $this->dbConnection->getQueryBuilder();
$qb->delete(self::TABLE_QUEUE_STREAM);
return $qb;
}
/**
* @param array $data
*
* @return StreamQueue
*/
protected function parseStreamQueueSelectSql($data): StreamQueue {
$queue = new StreamQueue();
$queue->importFromDatabase($data);
return $queue;
}
}

Wyświetl plik

@ -0,0 +1,8 @@
<?php
namespace OCA\Social\Exceptions;
class HashtagDoesNotExistException extends \Exception {
}

Wyświetl plik

@ -72,11 +72,13 @@ class DeleteInterface implements IActivityPubInterface {
$types = ['Note', 'Person'];
foreach ($types as $type) {
try {
$item->checkOrigin($item->getObjectId());
$interface = AP::$activityPub->getInterfaceForItem($type);
$object = $interface->getItemById($item->getObjectId());
$interface->delete($object);
return;
} catch (InvalidOriginException $e) {
} catch (ItemNotFoundException $e) {
} catch (ItemUnknownException $e) {
}
@ -88,8 +90,10 @@ class DeleteInterface implements IActivityPubInterface {
$object = $item->getObject();
try {
$item->checkOrigin($object->getId());
$interface = AP::$activityPub->getInterfaceForItem($object);
$interface->delete($object);
} catch (InvalidOriginException $e) {
} catch (ItemUnknownException $e) {
}
}

Wyświetl plik

@ -33,11 +33,13 @@ namespace OCA\Social\Interfaces\Actor;
use daita\MySmallPhpTools\Traits\TArrayTools;
use OCA\Social\Db\CacheActorsRequest;
use OCA\Social\Db\NotesRequest;
use OCA\Social\Exceptions\CacheActorDoesNotExistException;
use OCA\Social\Exceptions\InvalidOriginException;
use OCA\Social\Exceptions\ItemNotFoundException;
use OCA\Social\Interfaces\IActivityPubInterface;
use OCA\Social\Model\ActivityPub\ACore;
use OCA\Social\Model\ActivityPub\Activity\Delete;
use OCA\Social\Model\ActivityPub\Activity\Update;
use OCA\Social\Model\ActivityPub\Actor\Person;
use OCA\Social\Service\ActorService;
@ -59,6 +61,9 @@ class PersonInterface implements IActivityPubInterface {
/** @var CacheActorsRequest */
private $cacheActorsRequest;
/** @var NotesRequest */
private $notesRequest;
/** @var ActorService */
private $actorService;
@ -73,15 +78,17 @@ class PersonInterface implements IActivityPubInterface {
* UndoService constructor.
*
* @param CacheActorsRequest $cacheActorsRequest
* @param NotesRequest $notesRequest
* @param ActorService $actorService
* @param ConfigService $configService
* @param MiscService $miscService
*/
public function __construct(
CacheActorsRequest $cacheActorsRequest, ActorService $actorService,
ConfigService $configService, MiscService $miscService
CacheActorsRequest $cacheActorsRequest, NotesRequest $notesRequest,
ActorService $actorService, ConfigService $configService, MiscService $miscService
) {
$this->cacheActorsRequest = $cacheActorsRequest;
$this->notesRequest = $notesRequest;
$this->actorService = $actorService;
$this->configService = $configService;
$this->miscService = $miscService;
@ -141,36 +148,40 @@ class PersonInterface implements IActivityPubInterface {
*/
public function activity(Acore $activity, ACore $item) {
/** @var Person $item */
$activity->checkOrigin($item->getId());
if ($activity->getType() === Update::TYPE) {
$activity->checkOrigin($item->getId());
$item->setCreation($activity->getOriginCreationTime());
try {
$current = $this->cacheActorsRequest->getFromId($item->getId());
if ($current->getCreation() < $activity->getOriginCreationTime()) {
$this->cacheActorsRequest->update($item);
}
} catch (CacheActorDoesNotExistException $e) {
$this->cacheActorsRequest->save($item);
}
$this->updateActor($item, $activity);
}
}
/**
* @param ACore $item
*
* @throws InvalidOriginException
*/
public function delete(ACore $item) {
$item->checkOrigin(($item->getId()));
/** @var Person $item */
$this->cacheActorsRequest->deleteFromId($item->getId());
$this->notesRequest->deleteByAuthor($item->getId());
}
/**
* @param Person $actor
* @param ACore $activity
*/
private function updateActor(Person $actor, ACore $activity) {
$actor->setCreation($activity->getOriginCreationTime());
try {
$current = $this->cacheActorsRequest->getFromId($actor->getId());
if ($current->getCreation() < $activity->getOriginCreationTime()) {
$this->cacheActorsRequest->update($actor);
}
} catch (CacheActorDoesNotExistException $e) {
$this->cacheActorsRequest->save($actor);
}
}
}

Wyświetl plik

@ -0,0 +1,149 @@
<?php
declare(strict_types=1);
/**
* Nextcloud - Social Support
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Maxence Lange <maxence@artificial-owl.com>
* @copyright 2018, Maxence Lange <maxence@artificial-owl.com>
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\Social\Interfaces\Object;
use OCA\Social\Db\NotesRequest;
use OCA\Social\Exceptions\InvalidOriginException;
use OCA\Social\Exceptions\ItemNotFoundException;
use OCA\Social\Exceptions\NoteNotFoundException;
use OCA\Social\Interfaces\IActivityPubInterface;
use OCA\Social\Model\ActivityPub\ACore;
use OCA\Social\Model\ActivityPub\Object\Announce;
use OCA\Social\Model\ActivityPub\Stream;
use OCA\Social\Model\StreamQueue;
use OCA\Social\Service\MiscService;
use OCA\Social\Service\StreamQueueService;
/**
* Class AnnounceInterface
*
* @package OCA\Social\Interfaces\Object
*/
class AnnounceInterface implements IActivityPubInterface {
/** @var NotesRequest */
private $notesRequest;
/** @var StreamQueueService */
private $streamQueueService;
/** @var MiscService */
private $miscService;
/**
* AnnounceInterface constructor.
*
* @param NotesRequest $notesRequest
* @param StreamQueueService $streamQueueService
* @param MiscService $miscService
*/
public function __construct(
NotesRequest $notesRequest, StreamQueueService $streamQueueService, MiscService $miscService
) {
$this->notesRequest = $notesRequest;
$this->streamQueueService = $streamQueueService;
$this->miscService = $miscService;
}
/**
* @param ACore $activity
* @param ACore $item
*/
public function activity(Acore $activity, ACore $item) {
/** Stream $item */
// TODO: Manage Undo Activity
$this->miscService->log('activity: ' . json_encode($activity));
}
/**
* @param ACore $item
*
* @throws InvalidOriginException
*/
public function processIncomingRequest(ACore $item) {
/** @var Stream $item */
$item->checkOrigin($item->getId());
$this->save($item);
}
/**
* @param ACore $item
*/
public function processResult(ACore $item) {
}
/**
* @param string $id
*
* @return ACore
* @throws ItemNotFoundException
*/
public function getItemById(string $id): ACore {
throw new ItemNotFoundException();
}
/**
* @param ACore $item
*/
public function save(ACore $item) {
/** @var Announce $item */
try {
$this->notesRequest->getNoteById($item->getId());
} catch (NoteNotFoundException $e) {
$objectId = $item->getObjectId();
$item->addCacheItem($objectId);
$this->notesRequest->save($item);
$this->streamQueueService->generateStreamQueue(
$item->getRequestToken(), StreamQueue::TYPE_CACHE, $item->getId()
);
}
}
/**
* @param ACore $item
*/
public function delete(ACore $item) {
}
}

Wyświetl plik

@ -28,7 +28,7 @@ declare(strict_types=1);
*/
namespace OCA\Social\Interfaces\Activity;
namespace OCA\Social\Interfaces\Object;
use daita\MySmallPhpTools\Exceptions\MalformedArrayException;
@ -39,6 +39,7 @@ use OCA\Social\Exceptions\FollowDoesNotExistException;
use OCA\Social\Exceptions\InvalidOriginException;
use OCA\Social\Exceptions\InvalidResourceException;
use OCA\Social\Exceptions\ItemNotFoundException;
use OCA\Social\Exceptions\ItemUnknownException;
use OCA\Social\Exceptions\RedundancyLimitException;
use OCA\Social\Exceptions\RequestContentException;
use OCA\Social\Exceptions\RequestNetworkException;
@ -46,20 +47,25 @@ use OCA\Social\Exceptions\RequestResultNotJsonException;
use OCA\Social\Exceptions\RequestResultSizeException;
use OCA\Social\Exceptions\RequestServerException;
use OCA\Social\Exceptions\SocialAppConfigException;
use OCA\Social\Exceptions\ItemUnknownException;
use OCA\Social\Interfaces\IActivityPubInterface;
use OCA\Social\Model\ActivityPub\ACore;
use OCA\Social\Model\ActivityPub\Activity\Accept;
use OCA\Social\Model\ActivityPub\Activity\Follow;
use OCA\Social\Model\ActivityPub\Activity\Reject;
use OCA\Social\Model\ActivityPub\Activity\Undo;
use OCA\Social\Model\ActivityPub\Object\Follow;
use OCA\Social\Model\InstancePath;
use OCA\Social\Service\AccountService;
use OCA\Social\Service\ActivityService;
use OCA\Social\Service\CacheActorService;
use OCA\Social\Service\ConfigService;
use OCA\Social\Service\MiscService;
/**
* Class FollowInterface
*
* @package OCA\Social\Interfaces\Object
*/
class FollowInterface implements IActivityPubInterface {
@ -69,6 +75,9 @@ class FollowInterface implements IActivityPubInterface {
/** @var CacheActorService */
private $cacheActorService;
/** @var AccountService */
private $accountService;
/** @var ActivityService */
private $activityService;
@ -84,16 +93,19 @@ class FollowInterface implements IActivityPubInterface {
*
* @param FollowsRequest $followsRequest
* @param CacheActorService $cacheActorService
* @param AccountService $accountService
* @param ActivityService $activityService
* @param ConfigService $configService
* @param MiscService $miscService
*/
public function __construct(
FollowsRequest $followsRequest, CacheActorService $cacheActorService,
ActivityService $activityService, ConfigService $configService, MiscService $miscService
AccountService $accountService, ActivityService $activityService,
ConfigService $configService, MiscService $miscService
) {
$this->followsRequest = $followsRequest;
$this->cacheActorService = $cacheActorService;
$this->accountService = $accountService;
$this->activityService = $activityService;
$this->configService = $configService;
$this->miscService = $miscService;
@ -128,8 +140,12 @@ class FollowInterface implements IActivityPubInterface {
$this->activityService->request($accept);
$this->followsRequest->accepted($follow);
$actor = $this->cacheActorService->getFromId($follow->getObjectId());
$this->accountService->cacheLocalActorDetailCount($actor);
} catch (Exception $e) {
}
}
@ -155,9 +171,8 @@ class FollowInterface implements IActivityPubInterface {
$follow->checkOrigin($follow->getActorId());
try {
$knownFollow = $this->followsRequest->getByPersons(
$follow->getActorId(), $follow->getObjectId()
);
$knownFollow =
$this->followsRequest->getByPersons($follow->getActorId(), $follow->getObjectId());
if ($knownFollow->getId() === $follow->getId() && !$knownFollow->isAccepted()) {
$this->confirmFollowRequest($follow);

Wyświetl plik

@ -134,10 +134,9 @@ class NoteInterface implements IActivityPubInterface {
if ($activity->getType() === Create::TYPE) {
$activity->checkOrigin($item->getId());
$activity->checkOrigin($item->getAttributedTo());
$item->setActivityId($activity->getId());
$this->save($item);
}
}

Wyświetl plik

@ -0,0 +1,157 @@
<?php
declare(strict_types=1);
/**
* Nextcloud - Social Support
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Maxence Lange <maxence@artificial-owl.com>
* @copyright 2018, Maxence Lange <maxence@artificial-owl.com>
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\Social\Migration;
use Closure;
use Doctrine\DBAL\DBALException;
use Doctrine\DBAL\Schema\SchemaException;
use Doctrine\DBAL\Types\Type;
use OCA\Social\Db\CoreRequestBuilder;
use OCP\DB\ISchemaWrapper;
use OCP\IDBConnection;
use OCP\Migration\IOutput;
use OCP\Migration\SimpleMigrationStep;
/**
* Class Version0001Date20190121153145
*
* @package OCA\Social\Migration
*/
class Version0002Date20190121153145 extends SimpleMigrationStep {
/** @var IDBConnection */
private $connection;
/**
* @param IDBConnection $connection
*/
public function __construct(IDBConnection $connection) {
$this->connection = $connection;
}
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
*
* @return ISchemaWrapper
* @throws SchemaException
* @throws DBALException
*/
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options
): ISchemaWrapper {
/** @var ISchemaWrapper $schema */
$schema = $schemaClosure();
$table = $schema->getTable(CoreRequestBuilder::TABLE_SERVER_NOTES);
if (!$table->hasColumn('cache')) {
$table->addColumn('cache', Type::TEXT, ['notnull' => false]);
}
$table = $schema->getTable(CoreRequestBuilder::TABLE_SERVER_NOTES);
if (!$table->hasColumn('activity_id')) {
$table->addColumn('activity_id', Type::STRING, ['notnull' => false, 'length' => 1000]);
}
$table = $schema->getTable(CoreRequestBuilder::TABLE_SERVER_NOTES);
if (!$table->hasColumn('object_id')) {
$table->addColumn('object_id', Type::STRING, ['notnull' => false, 'length' => 1000]);
}
if (!$schema->hasTable(CoreRequestBuilder::TABLE_QUEUE_STREAM)) {
$table = $schema->createTable(CoreRequestBuilder::TABLE_QUEUE_STREAM);
$table->addColumn(
'id', 'bigint', [
'autoincrement' => true,
'notnull' => true,
'length' => 11,
'unsigned' => true,
]
);
$table->addColumn(
'token', 'string', [
'notnull' => true,
'length' => 63,
]
);
$table->addColumn(
'stream_id', 'string', [
'notnull' => true,
'length' => 255,
]
);
$table->addColumn(
'type', 'string', [
'notnull' => true,
'length' => 31,
]
);
$table->addColumn(
'status', 'smallint', [
'notnull' => false,
'length' => 1,
'default' => 0,
]
);
$table->addColumn(
'tries', 'smallint', [
'notnull' => false,
'length' => 2,
'default' => 0,
]
);
$table->addColumn(
'last', 'datetime', [
'notnull' => false,
]
);
$table->setPrimaryKey(['id']);
}
return $schema;
}
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
*/
public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options) {
}
}

Wyświetl plik

@ -0,0 +1,109 @@
<?php
declare(strict_types=1);
/**
* Nextcloud - Social Support
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Maxence Lange <maxence@artificial-owl.com>
* @copyright 2018, Maxence Lange <maxence@artificial-owl.com>
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\Social\Migration;
use Closure;
use Doctrine\DBAL\DBALException;
use Doctrine\DBAL\Schema\SchemaException;
use Doctrine\DBAL\Types\Type;
use OCA\Social\Db\CoreRequestBuilder;
use OCP\DB\ISchemaWrapper;
use OCP\IDBConnection;
use OCP\Migration\IOutput;
use OCP\Migration\SimpleMigrationStep;
/**
* Class Version0002Date20190201000001
*
* @package OCA\Social\Migration
*/
class Version0002Date20190201000001 extends SimpleMigrationStep {
/** @var IDBConnection */
private $connection;
/**
* @param IDBConnection $connection
*/
public function __construct(IDBConnection $connection) {
$this->connection = $connection;
}
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
*
* @return ISchemaWrapper
* @throws SchemaException
* @throws DBALException
*/
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options
): ISchemaWrapper {
/** @var ISchemaWrapper $schema */
$schema = $schemaClosure();
if (!$schema->hasTable(CoreRequestBuilder::TABLE_SERVER_HASHTAGS)) {
$table = $schema->createTable(CoreRequestBuilder::TABLE_SERVER_HASHTAGS);
$table->addColumn('hashtag', 'string', ['notnull' => false, 'length' => 63]);
$table->addColumn(
'trend', 'string', ['notnull' => false, 'length' => 500]
);
$table->setPrimaryKey(['hashtag']);
}
$table = $schema->getTable(CoreRequestBuilder::TABLE_SERVER_NOTES);
if (!$table->hasColumn('hashtags')) {
$table->addColumn(
'hashtags', Type::STRING, ['notnull' => false, 'default' => '[]', 'length' => 1000]
);
}
return $schema;
}
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
*/
public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options) {
}
}

Wyświetl plik

@ -0,0 +1,154 @@
<?php
declare(strict_types=1);
/**
* Nextcloud - Social Support
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Maxence Lange <maxence@artificial-owl.com>
* @copyright 2018, Maxence Lange <maxence@artificial-owl.com>
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\Social\Migration;
use Closure;
use Doctrine\DBAL\DBALException;
use Doctrine\DBAL\Schema\SchemaException;
use Doctrine\DBAL\Types\Type;
use OCA\Social\Db\CoreRequestBuilder;
use OCP\DB\ISchemaWrapper;
use OCP\IDBConnection;
use OCP\Migration\IOutput;
use OCP\Migration\SimpleMigrationStep;
/**
* Class Version0002Date20190226000001
*
* @package OCA\Social\Migration
*/
class Version0002Date20190226000001 extends SimpleMigrationStep {
/** @var IDBConnection */
private $connection;
/** @var array */
public static $editToChar1000 = [
[CoreRequestBuilder::TABLE_CACHE_ACTORS, 'id'],
[CoreRequestBuilder::TABLE_CACHE_ACTORS, 'following'],
[CoreRequestBuilder::TABLE_CACHE_ACTORS, 'followers'],
[CoreRequestBuilder::TABLE_CACHE_ACTORS, 'inbox'],
[CoreRequestBuilder::TABLE_CACHE_ACTORS, 'shared_inbox'],
[CoreRequestBuilder::TABLE_CACHE_ACTORS, 'outbox'],
[CoreRequestBuilder::TABLE_CACHE_ACTORS, 'featured'],
[CoreRequestBuilder::TABLE_CACHE_ACTORS, 'url'],
[CoreRequestBuilder::TABLE_CACHE_ACTORS, 'icon_id'],
[CoreRequestBuilder::TABLE_CACHE_DOCUMENTS, 'id'],
[CoreRequestBuilder::TABLE_CACHE_DOCUMENTS, 'url'],
[CoreRequestBuilder::TABLE_CACHE_DOCUMENTS, 'local_copy'],
[CoreRequestBuilder::TABLE_REQUEST_QUEUE, 'author'],
[CoreRequestBuilder::TABLE_SERVER_ACTORS, 'id'],
[CoreRequestBuilder::TABLE_SERVER_FOLLOWS, 'id'],
[CoreRequestBuilder::TABLE_SERVER_FOLLOWS, 'actor_id'],
[CoreRequestBuilder::TABLE_SERVER_FOLLOWS, 'object_id'],
[CoreRequestBuilder::TABLE_SERVER_FOLLOWS, 'follow_id'],
[CoreRequestBuilder::TABLE_SERVER_NOTES, 'id'],
[CoreRequestBuilder::TABLE_SERVER_NOTES, 'to'],
[CoreRequestBuilder::TABLE_SERVER_NOTES, 'attributed_to'],
[CoreRequestBuilder::TABLE_SERVER_NOTES, 'in_reply_to']
];
/** @var array */
public static $editToText = [
[CoreRequestBuilder::TABLE_CACHE_ACTORS, 'public_key'],
[CoreRequestBuilder::TABLE_REQUEST_QUEUE, 'instance'],
[CoreRequestBuilder::TABLE_SERVER_ACTORS, 'public_key'],
[CoreRequestBuilder::TABLE_SERVER_ACTORS, 'private_key']
];
/**
* @param IDBConnection $connection
*/
public function __construct(IDBConnection $connection) {
$this->connection = $connection;
}
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
*
* @return ISchemaWrapper
* @throws SchemaException
* @throws DBALException
*/
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options
): ISchemaWrapper {
/** @var ISchemaWrapper $schema */
$schema = $schemaClosure();
foreach (array_merge(self::$editToText, self::$editToChar1000) as $edit) {
list($tableName, $field) = $edit;
$table = $schema->getTable($tableName);
if ($table->hasColumn($field . '_copy')) {
continue;
}
$table->addColumn($field . '_copy', Type::TEXT, ['notnull' => false]);
}
return $schema;
}
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
*/
public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options) {
foreach (array_merge(self::$editToText, self::$editToChar1000) as $edit) {
list($tableName, $field) = $edit;
$qb = $this->connection->getQueryBuilder();
$qb->update($tableName)
->set($field . '_copy', $field)
->execute();
}
}
}

Wyświetl plik

@ -0,0 +1,79 @@
<?php
declare(strict_types=1);
/**
* Nextcloud - Social Support
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Maxence Lange <maxence@artificial-owl.com>
* @copyright 2018, Maxence Lange <maxence@artificial-owl.com>
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\Social\Migration;
use Closure;
use Doctrine\DBAL\Schema\SchemaException;
use OCP\DB\ISchemaWrapper;
use OCP\Migration\IOutput;
use OCP\Migration\SimpleMigrationStep;
/**
* Class Version0002Date20190226000002
*
* @package OCA\Social\Migration
*/
class Version0002Date20190226000002 extends SimpleMigrationStep {
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
*
* @return ISchemaWrapper
* @throws SchemaException
*/
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options
): ISchemaWrapper {
/** @var ISchemaWrapper $schema */
$schema = $schemaClosure();
$edits = array_merge(
Version0002Date20190226000001::$editToText,
Version0002Date20190226000001::$editToChar1000
);
foreach ($edits as $edit) {
list($tableName, $field) = $edit;
$table = $schema->getTable($tableName);
if ($table->hasColumn($field) && $table->hasColumn($field . '_copy')) {
$table->dropColumn($field);
}
}
return $schema;
}
}

Wyświetl plik

@ -0,0 +1,128 @@
<?php
declare(strict_types=1);
/**
* Nextcloud - Social Support
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Maxence Lange <maxence@artificial-owl.com>
* @copyright 2018, Maxence Lange <maxence@artificial-owl.com>
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\Social\Migration;
use Closure;
use Doctrine\DBAL\DBALException;
use Doctrine\DBAL\Schema\SchemaException;
use Doctrine\DBAL\Types\Type;
use OCP\DB\ISchemaWrapper;
use OCP\IDBConnection;
use OCP\Migration\IOutput;
use OCP\Migration\SimpleMigrationStep;
/**
* Class Version0002Date20190226000003
*
* @package OCA\Social\Migration
*/
class Version0002Date20190226000003 extends SimpleMigrationStep {
/** @var IDBConnection */
private $connection;
/**
* @param IDBConnection $connection
*/
public function __construct(IDBConnection $connection) {
$this->connection = $connection;
}
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
*
* @return ISchemaWrapper
* @throws SchemaException
* @throws DBALException
*/
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options
): ISchemaWrapper {
/** @var ISchemaWrapper $schema */
$schema = $schemaClosure();
// -> TEXT
foreach (Version0002Date20190226000001::$editToText as $edit) {
list($tableName, $field) = $edit;
$table = $schema->getTable($tableName);
if ($table->hasColumn($field)) {
continue;
}
$table->addColumn($field, Type::TEXT, ['notnull' => false]);
}
// -> VARCHAR(4000)
foreach (Version0002Date20190226000001::$editToChar1000 as $edit) {
list($tableName, $field) = $edit;
$table = $schema->getTable($tableName);
if ($table->hasColumn($field)) {
continue;
}
$table->addColumn($field, Type::STRING, ['notnull' => false, 'length' => 1000]);
}
return $schema;
}
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
*/
public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options) {
$edits = array_merge(
Version0002Date20190226000001::$editToText,
Version0002Date20190226000001::$editToChar1000
);
foreach ($edits as $edit) {
list($table, $field) = $edit;
$qb = $this->connection->getQueryBuilder();
$qb->update($table)
->set($field, $field . '_copy')
->execute();
}
}
}

Wyświetl plik

@ -0,0 +1,81 @@
<?php
declare(strict_types=1);
/**
* Nextcloud - Social Support
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Maxence Lange <maxence@artificial-owl.com>
* @copyright 2018, Maxence Lange <maxence@artificial-owl.com>
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\Social\Migration;
use Closure;
use Doctrine\DBAL\DBALException;
use Doctrine\DBAL\Schema\SchemaException;
use OCP\DB\ISchemaWrapper;
use OCP\Migration\IOutput;
use OCP\Migration\SimpleMigrationStep;
/**
* Class Version0002Date20190226000004
*
* @package OCA\Social\Migration
*/
class Version0002Date20190226000004 extends SimpleMigrationStep {
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
*
* @return ISchemaWrapper
* @throws SchemaException
* @throws DBALException
*/
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options
): ISchemaWrapper {
/** @var ISchemaWrapper $schema */
$schema = $schemaClosure();
$edits = array_merge(
Version0002Date20190226000001::$editToText,
Version0002Date20190226000001::$editToChar1000
);
foreach ($edits as $edit) {
list($tableName, $field) = $edit;
$table = $schema->getTable($tableName);
if ($table->hasColumn($field) && $table->hasColumn($field . '_copy')) {
$table->dropColumn($field . '_copy');
}
}
return $schema;
}
}

Wyświetl plik

@ -32,6 +32,7 @@ namespace OCA\Social\Model\ActivityPub;
use daita\MySmallPhpTools\Traits\TArrayTools;
use daita\MySmallPhpTools\Traits\TPathTools;
use daita\MySmallPhpTools\Traits\TStringTools;
use JsonSerializable;
use OCA\Social\Exceptions\ActivityCantBeVerifiedException;
use OCA\Social\Exceptions\InvalidOriginException;
@ -45,6 +46,7 @@ class ACore extends Item implements JsonSerializable {
use TArrayTools;
use TStringTools;
use TPathTools;
@ -59,11 +61,15 @@ class ACore extends Item implements JsonSerializable {
const AS_USERNAME = 5;
const AS_ACCOUNT = 6;
const AS_STRING = 7;
const AS_TAGS = 10;
/** @var null Item */
private $parent = null;
/** @var string */
private $requestToken = '';
/** @var array */
private $entries = [];
@ -92,6 +98,30 @@ class ACore extends Item implements JsonSerializable {
}
/**
* @return string
*/
public function getRequestToken(): string {
if ($this->isRoot()) {
return $this->requestToken;
} else {
return $this->getRoot()
->getRequestToken();
}
}
/**
* @param string $token
*
* @return ACore
*/
public function setRequestToken(string $token): ACore {
$this->requestToken = $token;
return $this;
}
/**
* @param ACore $parent
*
@ -237,12 +267,7 @@ class ACore extends Item implements JsonSerializable {
$base = $this->withoutEndSlash($this->withBeginSlash($base));
}
$uuid = sprintf(
'%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand(0, 0xffff), mt_rand(0, 0xffff),
mt_rand(0, 0xffff), mt_rand(0, 0xfff) | 0x4000, mt_rand(0, 0x3fff) | 0x8000,
mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
);
$uuid = $this->uuid();
$this->setId($url . $base . '/' . $uuid);
}
@ -449,7 +474,11 @@ class ACore extends Item implements JsonSerializable {
$result = [];
foreach ($values as $value) {
try {
$result[] = $this->validateEntryString($as, $value);
if (is_array($value)) {
$result[] = $this->validateEntryArray($as, $value);
} else {
$result[] = $this->validateEntryString($as, $value);
}
} catch (InvalidResourceEntryException $e) {
}
}
@ -461,13 +490,14 @@ class ACore extends Item implements JsonSerializable {
/**
* // TODO - better checks
*
* @param $as
* @param $value
* @param int $as
* @param string $value
* @param bool $exception
*
* @return string
* @throws InvalidResourceEntryException
*/
public function validateEntryString(int $as, string $value): string {
public function validateEntryString(int $as, string $value, bool $exception = true): string {
switch ($as) {
case self::AS_ID:
if (parse_url($value) !== false) {
@ -502,12 +532,41 @@ class ACore extends Item implements JsonSerializable {
$value = strip_tags($value);
return $value;
default:
break;
}
throw new InvalidResourceEntryException($as . ' ' . $value);
if ($exception) {
throw new InvalidResourceEntryException($as . ' ' . $value);
} else {
return '';
}
}
/**
* @param int $as
* @param array $values
*
* @return array
* @throws InvalidResourceEntryException
*/
public function validateEntryArray(int $as, array $values): array {
switch ($as) {
case self::AS_TAGS:
return [
'type' => $this->validateEntryString(
self::AS_TYPE, $this->get('type', $values, ''), false
),
'href' => $this->validateEntryString(
self::AS_URL, $this->get('href', $values, ''), false
),
'name' => $this->validateEntryString(
self::AS_STRING, $this->get('name', $values, ''), false
)
];
}
throw new InvalidResourceEntryException($as . ' ' . json_encode($values));
}
@ -524,6 +583,7 @@ class ACore extends Item implements JsonSerializable {
$this->setPublished($this->validate(self::AS_DATE, 'published', $data, ''));
$this->setActorId($this->validate(self::AS_ID, 'actor', $data, ''));
$this->setObjectId($this->validate(self::AS_ID, 'object', $data, ''));
$this->setTags($this->validateArray(self::AS_TAGS, 'tag', $data, []));
}
@ -609,7 +669,10 @@ class ACore extends Item implements JsonSerializable {
$this->addEntryBool('local', $this->isLocal());
}
return $this->getEntries();
$result = $this->getEntries();
$this->cleanArray($result);
return $result;
}
}

Wyświetl plik

@ -30,6 +30,7 @@ declare(strict_types=1);
namespace OCA\Social\Model\ActivityPub;
use daita\MySmallPhpTools\Traits\TArrayTools;
use OCA\Social\Model\ActivityPub\Actor\Person;
use OCA\Social\Model\InstancePath;
@ -37,6 +38,9 @@ use OCA\Social\Model\InstancePath;
class Item {
use TArrayTools;
/** @var string */
private $urlSocial = '';
@ -502,10 +506,23 @@ class Item {
}
/**
* @param string $type
*
* @return array
*/
public function getTags(): array {
return $this->tags;
public function getTags(string $type = ''): array {
if ($type === '') {
return $this->tags;
}
$result = [];
foreach ($this->tags as $tag) {
if ($this->get('type', $tag, '') === $type) {
$result[] = $tag;
}
}
return $result;
}
/**

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