diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index a29b31a04..000000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,49 +0,0 @@ -version: 2.1 - -executors: - docker: - working_directory: /tmp/workspace - docker: - - image: docker:latest - -jobs: - docker: - parameters: - with_deploy: - type: boolean - default: false - executor: docker - steps: - - checkout - - setup_remote_docker: - version: 19.03.13 - - run: - name: Build - command: | - docker build -t misskey/misskey . - - when: - condition: <> - steps: - - run: - name: Deploy - command: | - if [ "$DOCKERHUB_USERNAME$DOCKERHUB_PASSWORD" ] - then - apk update && apk add jq - docker tag misskey/misskey misskey/misskey:$(cat package.json | jq -r .version) - docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_PASSWORD - docker push -a misskey/misskey - else - echo -e '\033[0;33mAborted deploying to Docker Hub\033[0;39m' - fi - -workflows: - version: 2 - docker: - jobs: - - docker: - name: auto-build - with_deploy: true - filters: - branches: - only: master diff --git a/.circleci/misskey/default.yml b/.circleci/misskey/default.yml deleted file mode 100644 index ae18a841b..000000000 --- a/.circleci/misskey/default.yml +++ /dev/null @@ -1,12 +0,0 @@ -url: 'http://misskey.local' -port: 8080 -db: - host: localhost - port: 5432 - db: test-misskey - user: postgres - pass: '' -redis: - host: localhost - port: 6379 -id: aid diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index 2a41c12c7..000000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1,38 +0,0 @@ -# PATH OWNERS -/.autogen/ @acid-chicken -/.circleci/ @syuilo @acid-chicken -/.config/ @syuilo @AyaMorisawa @mei23 @acid-chicken @rinsuki -# /.config/mongo_initdb_example.js @khws4v1 -/.github/ @syuilo @AyaMorisawa @acid-chicken -/.vscode/ @acid-chicken -/assets/ @syuilo # @tamaina -/docs/ @syuilo -/docs/*.en.md @AyaMorisawa # @skid9000 -# /docs/*.fr.md @BoFFire -# /docs/docker.*.md @khws4v1 -/locales/ @syuilo -/src/ @syuilo @AyaMorisawa @mei23 @acid-chicken @rinsuki -# /src/crypto_key.cc @akihikodaki -# /src/crypto_key.d.ts @akihikodaki -/.dockerignore @syuilo # @khws4v1 -/.editorconfig @syuilo @AyaMorisawa -/.eslintrc @syuilo -/.gitattributes @syuilo -/.gitignore @syuilo -/.npmrc @syuilo -/.vsls.json @AyaMorisawa -/CHANGELOG.md @syuilo -/CODE_OF_CONDUCT.md @syuilo -/CONTRIBUTING.md @syuilo -/Dockerfile @syuilo @AyaMorisawa @acid-chicken # @khws4v1 -/LICENSE @syuilo -/README.md @syuilo @AyaMorisawa @acid-chicken # @nikhiljha -# /binding.gyp @akihikodaki -/crowdin.yml @syuilo -# /docker-compose.yml @khws4v1 -/gulpfile.ts @syuilo @AyaMorisawa -/jsconfig.json @syuilo @AyaMorisawa -/package.json @syuilo @AyaMorisawa -/tsconfig.json @syuilo @AyaMorisawa -/tslint.json @syuilo @AyaMorisawa -/webpack.config.ts @syuilo @AyaMorisawa diff --git a/.circleci/misskey/test.yml b/.github/misskey/test.yml similarity index 100% rename from .circleci/misskey/test.yml rename to .github/misskey/test.yml diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 000000000..0b3bbc186 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,21 @@ +name: Lint + +on: + push: + branches: + - master + - develop + pull_request: + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + submodules: true + - uses: actions/setup-node@v1 + with: + node-version: 12.x + - run: yarn install + - run: yarn lint diff --git a/.github/workflows/nodejs.yml b/.github/workflows/test.yml similarity index 55% rename from .github/workflows/nodejs.yml rename to .github/workflows/test.yml index a91572ad7..045d20980 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/test.yml @@ -1,4 +1,5 @@ -name: Node.js CI +name: Test + on: push: branches: @@ -7,12 +8,12 @@ on: pull_request: jobs: - build_and_test: + mocha: runs-on: ubuntu-latest strategy: matrix: - node-version: [14.x, 16.x] + node-version: [16.x] services: postgres: @@ -44,16 +45,43 @@ jobs: - name: Build run: yarn build - name: Test - run: yarn test + run: yarn mocha - lint: + e2e: runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [16.x] + + services: + postgres: + image: postgres:12.2-alpine + ports: + - 54312:5432 + env: + POSTGRES_DB: test-misskey + POSTGRES_HOST_AUTH_METHOD: trust + redis: + image: redis:4.0-alpine + ports: + - 56312:6379 + steps: - uses: actions/checkout@v2 with: submodules: true - - uses: actions/setup-node@v1 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 with: - node-version: 12.x - - run: yarn install - - run: yarn lint + node-version: ${{ matrix.node-version }} + - name: Install dependencies + run: yarn install + - name: Check yarn.lock + run: git diff --exit-code yarn.lock + - name: Copy Configure + run: cp test/test.yml .config + - name: Build + run: yarn build + - name: Test + run: yarn e2e diff --git a/CHANGELOG.md b/CHANGELOG.md index 13dccdc38..6847049bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,18 @@ --> +## 12.95.0 (2021/10/31) + +### Improvements +- スレッドミュート機能 + +### Bugfixes +- リレー向けのActivityが一部実装で除外されてしまうことがあるのを修正 +- 削除したノートやユーザーがリモートから参照されると復活することがあるのを修正 +- クライアント: ページ編集時のドロップダウンメニューなどが動作しない問題を修正 +- クライアント: コントロールパネルのカスタム絵文字タブが切り替わらないように見える問題を修正 +- API: ユーザー情報の hasUnreadChannel が常に false になっている問題を修正 + ## 12.94.1 (2021/10/25) ### Improvements diff --git a/README.md b/README.md index ce0aa0941..a60f71cac 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,6 @@
-[![CircleCI](https://img.shields.io/circleci/project/github/misskey-dev/misskey.svg?style=for-the-badge&logo=circleci)](https://circleci.com/gh/misskey-dev/misskey) [![Dependencies](https://img.shields.io/david/misskey-dev/misskey.svg?style=for-the-badge&logo=npm)](https://david-dm.org/misskey-dev/misskey) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=for-the-badge&logo=github)](http://makeapullrequest.com) [![Awesome Humane Tech](https://raw.githubusercontent.com/humanetech-community/awesome-humane-tech/main/humane-tech-badge.svg?sanitize=true)](https://github.com/humanetech-community/awesome-humane-tech) diff --git a/cypress.json b/cypress.json index f2c02689e..e858e480b 100644 --- a/cypress.json +++ b/cypress.json @@ -1,3 +1,3 @@ { - "baseUrl": "http://localhost" + "baseUrl": "http://localhost:61812" } diff --git a/cypress/integration/basic.js b/cypress/integration/basic.js index 182f70ff6..a754f41b9 100644 --- a/cypress/integration/basic.js +++ b/cypress/integration/basic.js @@ -128,7 +128,8 @@ describe('After user signup', () => { cy.get('[data-cy-signin-username] input').type('alice'); cy.get('[data-cy-signin-password] input').type('alice1234{enter}'); - cy.contains('アカウントが凍結されています'); + // TODO: cypressにブラウザの言語指定できる機能が実装され次第英語のみテストするようにする + cy.contains(/アカウントが凍結されています|This account has been suspended due to/gi); }); }); diff --git a/locales/ar-SA.yml b/locales/ar-SA.yml index d7f038393..71626224a 100644 --- a/locales/ar-SA.yml +++ b/locales/ar-SA.yml @@ -1,5 +1,6 @@ --- _lang_: "العربية" +headlineMisskey: "شبكة مرتبطة بالملاحظات" introMisskey: "اهلا بك! ميسكي هو منصة تدوين مصغر لا مركزية ومفتوحة المصدر.\nيمكنك مشاركة \"ملاحظات\" عن ما يجري حولك، وإخبار الجميع عن نفسك 📡\nتسمح لك \"الانفعالات\" بتعبير عن شعورك حول ملاحظات الآخرين 👍\nاكتشف عالمًا جديدًا 🚀" monthAndDay: "{day}/{month}" search: "البحث" @@ -12,6 +13,7 @@ ok: " حسناً" gotIt: "فهِمت" cancel: " إلغاء" enterUsername: "أدخِل إسم مسخدم" +renotedBy: "أعاد {user} نشر ملاحظة" noNotes: "لم يتم العثور على أية ملاحظات" noNotifications: "ليس هناك أية اشعارات" instance: "مثيل الخادم" @@ -26,7 +28,7 @@ login: "لِج" loggingIn: "جارٍ تسجيل الدخول" logout: "الخروج" signup: "أنشئ حسابًا" -uploading: "عملية الإرسال جارية" +uploading: "يرفع..." save: "حفظ" users: "المستخدمون" addUser: "اضافة مستخدم" @@ -37,7 +39,7 @@ favorited: "تمت الإضافة إلى المفضلة." alreadyFavorited: "تمت إضافته بالفعل إلى المفضلة." cantFavorite: "تعذرت الإضافة إلى المفضلة." pin: "دبّسها على الصفحة الشخصية" -unpin: "ألغ تثبيتها من ملفك الشخصي" +unpin: "ألغ تدبيسها من ملفك الشخصي" copyContent: "انسخ المحتوى" copyLink: "انسخ الرابط" delete: "حذف" @@ -63,13 +65,14 @@ files: "الملفات" download: "تنزيل" driveFileDeleteConfirm: "أمتأكد من حذف ملف {name}؟ كل الملاحظات المُرفق بها هذا الملف ستحذف." unfollowConfirm: "أمتأكد من إلغاء متابعة {name}؟" +exportRequested: "قد تستغرق عملية التصدير بعض الوقت. بمجرد الانتهاء ستتم إضافة الملف الناتج إلى قرص التخزين." importRequested: "يستغرق الاستيراد بعض الوقت" lists: "القوائم" noLists: "ليس لديك أية قائمة" note: "ملاحظة" notes: "الملاحظات" following: "المتابَعون" -followers: "المتابِعين" +followers: "المتابِعون" followsYou: "يتابعك" createList: "إنشاء قائمة" manageLists: "إدارة القوائم" @@ -82,7 +85,7 @@ serverIsDead: "الخادم لا يستجيب، حاول بعد قليل" youShouldUpgradeClient: "حدّث الصفحة لعرضها." enterListName: "اسم القائمة" privacy: "الخصوصية" -makeFollowManuallyApprove: "القبول يدويا طلبات الإشتراك" +makeFollowManuallyApprove: "قبول طلبات الإشتراك يدويا" defaultNoteVisibility: "مدى الرؤية الافتراضي" follow: "تابِع" followRequest: "طلب اشتراك" @@ -90,7 +93,11 @@ followRequests: "طلبات الإشتراك" unfollow: "إلغاء الاشتراك" followRequestPending: "طلبات الإشتراك المعلّقة" enterEmoji: "أدخل إيموجي" +renote: "أعد النشر" unrenote: "إلغاء مشاركة الملاحظة" +renoted: "أُعيد نشره" +cantRenote: "لا يمكن إعادة نشر الملاحظة" +cantReRenote: "لا يمكنك إعادة نشر ملاحظة معاد نشرها" quote: "اقتبس" pinnedNote: "ملاحظة مدبسة" pinned: "دبّسها على الصفحة الشخصية" @@ -99,9 +106,12 @@ clickToShow: "اضغط للعرض" sensitive: "محتوى حساس" add: "إضافة" reaction: "تفاعل" +reactionSettingDescription: "اختر التفاعلات المفضلة التي تريد تثبيتها في منتقي التفاعلات." +reactionSettingDescription2: "اسحب لإعادة التنظيم ، انقر للحذف ، استخدم \"+\" للإضافة." rememberNoteVisibility: "تذكر إعدادت مدى رؤية الملاحظات" attachCancel: "أزل المرفق" markAsSensitive: "علّمه كمحتوى حساس" +unmarkAsSensitive: "ألغ تعيينه كمحتوى حساس" enterFileName: "ادخل اسم الملف" mute: "اكتم" unmute: "إلغاء الكتم" @@ -111,8 +121,12 @@ suspend: "علِق" unsuspend: "ألغ التعليق" blockConfirm: "أمتأكد من حجب هذا الحساب؟" unblockConfirm: "أمتأكد من إلغاء حجب هذا الحساب؟" +suspendConfirm: "أمتأكد من تعليق الحساب؟" +unsuspendConfirm: "أمتأكد من إلغاء تعليق؟" selectList: "اختر قائمة" selectAntenna: "اختر هوائيًا" +selectWidget: "اختر ودجة" +editWidgets: "عدّل الودجات" editWidgetsExit: "تم" customEmojis: "إيموجي مخصص" emoji: "الوجوه التعبيرية" @@ -122,6 +136,10 @@ emojiUrl: "رابط الوجه التعبيري" addEmoji: "إضافة إيموجي" settingGuide: "الإعدادات المستحسنة" cacheRemoteFiles: "خزن مؤقتا الملفات البعيدة" +flagAsBot: "علّمه كحساب آلي" +flagAsBotDescription: "فعّل هذا الخيار إذا كان هذا الحساب يُدار عبر برمجية. إذا فُعل فسيكون بمثابة علامة للمطورين الآخرين لتجنب سلاسل لا متناعية من التفاعل بين حسابات الآلية وضبط أنظمة ميسكي للتعامل مع هذا الحساب كروبوت." +flagAsCat: "علّم هذا الحساب كحساب قط" +flagAsCatDescription: "فعّل هذا الخيار لوضع علامة على الحساب لتوضيح أنه حساب قط." autoAcceptFollowed: "اقبل طلبات المتابعة تلقائيا من الحسابات المتابَعة" addAccount: "أضف حساباً" loginFailed: "فشل الولوج" @@ -165,6 +183,9 @@ statistics: "الإحصائيات" clearQueue: "تفريغ قائمة الإنتظار" clearQueueConfirmTitle: "أتريد مسح الطابور؟" clearCachedFiles: "امسح التخزين المؤقت" +clearCachedFilesConfirm: "أتريد حذف التخزين المؤقت للملفات البعيدة؟" +blockedInstances: "المثلاء المحجوبون" +blockedInstancesDescription: "قائمة بالمثلاء التي تريد حظرها بحيث كل نطاق في سطر لوحده. بعد إدراجهم لن يتمكنوا من التفاعل مع هذا المثيل." muteAndBlock: "تم كتمها / تم حجبها" mutedUsers: "الحسابات التي تم كتمها" blockedUsers: "الحسابات التي تم حظرها" @@ -191,7 +212,7 @@ usernameOrUserId: "اسم المستخدم أو معرّفه" noSuchUser: "لم يُعثَر على المستخدم" lookup: "البحث" announcements: "الإعلانات" -imageUrl: "عنوان URL للصورة" +imageUrl: "رابط الصورة" remove: "حذف" removed: "تم حذفه بنجاح" removeAreYouSure: "متأكد من أنك تريد حذف {x}؟" @@ -199,11 +220,11 @@ deleteAreYouSure: "متأكد من أنك تريد حذف {x}؟" resetAreYouSure: "هل تريد إعادة التعيين؟" saved: "تم حفظه" messaging: "المحادثة" -upload: "تحميل" +upload: "ارفع" fromDrive: "من المخزن" -fromUrl: "من عنوان URL" -uploadFromUrl: "التحميل عبر URL" -uploadFromUrlDescription: "رابط الملف المراد تحميله " +fromUrl: "عبر رابط" +uploadFromUrl: "ارفع عبر رابط" +uploadFromUrlDescription: "رابط الملف المراد رفعه" uploadFromUrlRequested: "الرفع مطلوب" uploadFromUrlMayTakeTime: "سيستغرق بعض الوقت لاتمام الرفع " explore: "استكشاف" @@ -248,7 +269,7 @@ unableToDelete: "لا يمكن حذفه" inputNewFileName: "ادخل الإسم الجديد للملف" inputNewFolderName: "ادخل الإسم الجديد للمجلد" hasChildFilesOrFolders: "الان الملف غير فارغ. لا يمكن حذفه" -copyUrl: "انسخ عنوان URL" +copyUrl: "انسخ الرابط" rename: "إعادة التسمية" avatar: "الصورة الرمزية" banner: "الصورة الرأسية" @@ -267,7 +288,7 @@ instanceName: "اسم مثيل الخادم" instanceDescription: "وصف مثيل الخادم" maintainerName: "المدير" maintainerEmail: "عنوان بريد المدير الإلكتروني" -tosUrl: "عنوان URL لشروط الخدمة" +tosUrl: "رابط صفحة شروط الخدمة" thisYear: "هذا العام" thisMonth: "هذا الشهر" today: "اليوم" @@ -289,10 +310,10 @@ iconUrl: "رابط الأيقونة" bannerUrl: "رابط صورة اللافتة" backgroundImageUrl: "رابط صورة الخلفية" basicInfo: "المعلومات الأساسية " -pinnedUsers: "المستخدمون المثبتون" -pinnedUsersDescription: "قائمة المستخدمين المثبتين في لسان \"استكشف\" ، اجعل كل اسم مستخدم في سطر لوحده." -pinnedPages: "الصفحات المثبتة" -pinnedPagesDescription: "أدخل مسار الصفحات التي تريد تثبيتها في أعلى هذا الموقع، اجعل كل مسار في سطر لوحده." +pinnedUsers: "المستخدمون المدبسون" +pinnedUsersDescription: "قائمة المستخدمين المدبسين في لسان \"استكشف\" ، اجعل كل اسم مستخدم في سطر لوحده." +pinnedPages: "الصفحات المدبسة" +pinnedPagesDescription: "أدخل مسار الصفحات التي تريد تدبيسها في أعلى هذا الموقع، اجعل كل مسار في سطر لوحده." pinnedNotes: "ملاحظة مدبسة" hcaptchaSiteKey: "مفتاح الموقع" hcaptchaSecretKey: "المفتاح السري" @@ -310,9 +331,11 @@ withFileAntenna: "ملاحظات تحوي ملفات فقط" caseSensitive: "حساسية حالة الأحرف" withReplies: "بالردود" notesAndReplies: "الملاحظات والردود" -withFiles: "بالمرفقات" +withFiles: "ذات مرفقات" silence: "اكتم" +silenceConfirm: "أمتأكد من كتم هذا المستخدم؟" unsilence: "إلغاء الكتم" +unsilenceConfirm: "أمتأكد من إلغاء كتم هذا المستخدم؟" popularUsers: "المستخدمون الشائعون" recentlyUpdatedUsers: "أصحاب النشاطات الأخيرة" recentlyRegisteredUsers: "المستخدمون المنضمون حديثًا" @@ -339,14 +362,20 @@ newPasswordIs: "كلمتك السرية الجديدة هي {password}" reduceUiAnimation: "قلص تأثيرات الواجهة" share: "شارِك" notFound: "غير موجود" +notFoundDescription: "تعذر العثور على صفحة يقود إليها هذا الرابط." +uploadFolder: "المجلد الافتراضي للرفع" cacheClear: "مسح ذاكرة التخزين المؤقت" markAsReadAllNotifications: "وضع جميع الإشعارات كأنها مقروءة" +markAsReadAllUnreadNotes: "علّم جميع الملاحظات كمقروءة" +markAsReadAllTalkMessages: "علّم جميع الرسائل كمقروءة" help: "المساعدة" inputMessageHere: "اكتب رسالتك هنا" close: "اغلق" group: "الفريق" groups: "الفِرَق" createGroup: "انشئ فريقًا" +ownedGroups: "مجموعات المالك" +joinedGroups: "المجموعات المنضم إليها" invites: "دعوة" groupName: "اسم الفريق" members: "الأعضاء" @@ -360,13 +389,18 @@ next: "التالية" retype: "أعد الكتابة" noteOf: "ملاحظات {user}" inviteToGroup: "دعوة إلى فريق" +maxNoteTextLength: "حد عدد المحارف لكل ملاحظة" +quoteAttached: "اِقتُبسَ" noMessagesYet: "ليس هناك رسائل بعد" newMessageExists: "لقد تلقيت رسالة جديدة" +onlyOneFileCanBeAttached: "يمكنك إرفاق ملف واحد بالرسالة" +signinRequired: "رجاءً لِج" invitations: "دعوة" invitationCode: "رمز الدعوة" checking: "التحقق جارٍ" available: "متوفر" unavailable: "غير متوفر" +usernameInvalidFormat: "يمكنك استخدام A-z، a-z، 0-9، _" tooShort: "قصير جدًا" tooLong: "طويل جدًا" weakPassword: "الكلمة السرية ضعيفة" @@ -375,11 +409,15 @@ strongPassword: "الكلمة السرية قوية" passwordMatched: "التطابق صحيح!" passwordNotMatched: "غير متطابقتان" signinWith: "الولوج عبر {x}" +signinFailed: "فشل الولوج، خطأ في اسم المستخدم أو كلمة المرور." or: "أو" +language: "اللغة" uiLanguage: "لغة واجهة المستخدم" +groupInvited: "دُعيت إلى مجموعة" aboutX: "عن {x}" useOsNativeEmojis: "استخدم الإيموجيات الخاصة بنظام التشغيل" youHaveNoGroups: "لا تمتلك أية فِرَق" +joinOrCreateGroup: "احصل على دعوة لمجموعة أو أنشئ واحدة." noHistory: "السجل فارغ" signinHistory: "تاريخ تسجيل الدخول" doing: "انتظر لحظة" @@ -387,8 +425,10 @@ category: "الفئات" tags: "الوسوم" docSource: "مصدر هذا المستند" createAccount: "أنشئ حسابًا" +existingAccount: "الحسابات الموجودة" regenerate: "أعِد التوليد" fontSize: "حجم الخط" +noFollowRequests: "ليس لديك طلبات متابعة معلقة" openImageInNewTab: "إفتح الصورة بصفحة جديدة" dashboard: "لوحة التحكم" local: "المحلي" @@ -429,13 +469,17 @@ nothing: "لا يوجد شيء هنا" lastUsedDate: "آخر استخدام" state: "الحالة" sort: "ترتيب حسب" +ascendingOrder: "تصاعدي" +descendingOrder: "تنازلي" output: "الخارجة" updateRemoteUser: "تحديث المعلومات عن المستخدم البعيد" deleteAllFiles: "حذف كافة الملفات" deleteAllFilesConfirm: "أتريد حذف كل الملفات؟" -removeAllFollowing: "ألغ متابعة كل المتابِعين" +removeAllFollowing: "ألغ متابعة كل المتابَعين" userSuspended: "تم تعليق هذا المستخدم." userSilenced: "تم إسكات هذا المستخدم." +yourAccountSuspendedTitle: "هذا الحساب معلق" +menu: "القائمة" addItem: "إضافة عنصر" rooms: "الغرفة" relays: "المُرَحلات" @@ -443,9 +487,15 @@ addRelay: "إضافة مُرحّل" addedRelays: "المرحلات التي تم إضافتها" deletedNote: "ملاحظة محذوفة" invisibleNote: "ملاحظة مخفية" +enableInfiniteScroll: "فعّل التمرير المتواصل" +visibility: "الظهور" poll: "استطلاع رأي" useCw: "إخفاء المحتوى" +enablePlayer: "افتح مشغل الفيديو" +disablePlayer: "أغلق مشغل الفيديو" themeEditor: "مصمم القوالب" +description: "الوصف" +leaveConfirm: "لديك تغييرات غير محفوظة. أتريد المتابعة دون حفظها؟" manage: "إدارة " plugins: "الإضافات" width: "العرض" @@ -453,12 +503,14 @@ height: "الإرتفاع" large: "كبير" medium: "متوسط" small: "صغير" +generateAccessToken: "ولّد رمز الوصول" permission: "أذونات" enableAll: "تشغيل الكل" disableAll: "تعطيل الكل" tokenRequested: "منح حق الوصول إلى الحساب" notificationType: "أنواع الإشعارات" edit: "التعديل" +emailServer: "خادم البريد الإلكتروني" email: "البريد الإلكتروني " emailAddress: "عنوان البريد الالكتروني" smtpHost: "المضيف" @@ -469,6 +521,12 @@ makeActive: "تفعيل" display: "المظهر" copy: "نسخ" metrics: "المقاييس" +channel: "القنوات" +create: "أنشئ" +notificationSetting: "إعدادات التنبيهات" +notificationSettingDesc: "اختر نوع التنبيهات المراد عرضها" +other: "منوعات" +regenerateLoginToken: "أعد توليد الرمز" fileIdOrUrl: "معرف الملف أو رابط" chatOpenBehavior: "سلوك نفاذة المحادثة عند فتحها" behavior: "السلوك" @@ -476,7 +534,7 @@ sample: "مثال" abuseReports: "البلاغات" reportAbuse: "البلاغات" reportAbuseOf: "أبلغ عن {name}" -fillAbuseReportDescription: "أكتب بالتفصيل سبب الإبلاغ، إذا كنت تبلغ عن ملاحظة أرفق رابط لها." +fillAbuseReportDescription: "أكتب بالتفصيل سبب البلاغ، إذا كنت تبلغ عن ملاحظة أرفق رابط لها." abuseReported: "أُرسل البلاغ، شكرًا لك" send: "أرسل" abuseMarkAsResolved: "علّم البلاغ كمحلول" @@ -494,7 +552,9 @@ manageAccessTokens: "إدارة رموز الوصول" accountInfo: "معلومات الحساب" notesCount: "عدد الملاحظات" repliesCount: "عدد الردود المرسلة" +renotesCount: "عدد الملاحظات المعاد نشرها (المرسلة)" repliedCount: "عدد الردود المستلمة" +renotedCount: "عدد الملاحظات المعاد نشرها (المستلمة)" followingCount: "عدد الحسابات المتابَعة" followersCount: "عدد المتابِعين" sentReactionsCount: "عدد الانفعالات المرسلة" @@ -503,33 +563,141 @@ pollVotesCount: "عدد الاستطلاعات المرسلة" pollVotedCount: "عدد الاستطلاعات المستلمة" yes: "نعم" no: "لا" +driveFilesCount: "عدد الملفات في قرص التخزين" +useSystemFont: "استخدم الخط الافتراضية للنظام" +experimentalFeatures: "ميّزات اختبارية" +developer: "المطور" clearCache: "امسح التخزين المؤقت" currentVersion: "الإصدار الحالي" latestVersion: "آخر نسخة مستقرة" usageAmount: "الإستخدام" capacity: "السعة" inUse: "مستخدم" +useReactionPickerForContextMenu: "افتح منتقي التفاعلات عند التقر بالزر الأيمن" +typingUsers: "{users} يكتب(ون)..." +jumpToSpecifiedDate: "انتقل إلى التاريخ المحدد" +showingPastTimeline: "أنت تستعرض حاليًا خيطًا زمنيًا قديمًا" +markAllAsRead: "علّم الكل كمقروء" +goBack: "رجوع" +unlikeConfirm: "أتريد إلغاء إعجابك؟" +fullView: "ملء الشاشة" +quitFullView: "اخرج من وضع ملء للشاشة" +addDescription: "أضف وصفًا" info: "عن" +userInfo: "معلومات المستخدم" +unknown: "مجهول" +onlineStatus: "الحالة" +hideOnlineStatus: "اخف الحالة" +online: "متصل" +active: "نشط" +offline: "غير متصل" +notRecommended: "غير مستحسن" +botProtection: "الحماية من الحسابات الآلية" +instanceBlocking: "المثيلات المحجوبة" +selectAccount: "اختر حسابًا" +enabled: "مفعّل" +disabled: "معطّل" +quickAction: "الإجراءات السّريعة" user: "المستخدمون" administration: "إدارة " +accounts: "الحسابات" +switch: "بدّل" +noBotProtectionWarning: "لم تضبط الحماية من الحسابات الآلية" +configure: "اضبط" postToGallery: "انشر في المعرض" gallery: "المعرض" +recentPosts: "المشاركات الحديثة" +shareWithNote: "شاركه في ملاحظة" +ads: "الإعلانات" expiration: "ينتهي استطلاع الرأي في" +priority: "الأولوية" +high: "عالية" middle: "متوسط" +low: "منخفضة" +emailNotConfiguredWarning: "لم تعيّن بريدًا إلكترونيًا" +ratio: "النسبة" +previewNoteText: "اعرض معاينة" +customCss: "CSS مخصصة" global: "الشامل" +squareAvatars: "اعرض شكل الصور الرمزية كمربعات" sent: "أرسل" +received: "اُستلم" +searchResult: "نتائج البحث" +hashtags: "الوسوم" +learnMore: "راجع المزيد" +misskeyUpdated: "حُدث ميسكي!" +whatIsNew: "اعرض التغييرات" +translate: "ترجم" +translatedFrom: "تُرجم من {x}" +accountDeletionInProgress: "حذف الحساب جارٍ" +usernameInfo: "الاسم الذي يميزك عن بافي مستخدمي هذا الخادم، يمكنك استخدام الحروف اللاتينية (a~z, A~Z) والأرقام (0~9) والشرطة السفلية (_). لا يمكنك تغييره بعد تسجيله." +lastCommunication: "آخر تواصل" +itsOn: "مفعّل" +itsOff: "معطّل" +emailRequiredForSignup: "عنوان البريد الإلكتروني إلزامي للتسجيل" +filter: "رشّح" +controlPanel: "لوحة التحكم" +manageAccounts: "إدارة الحسابات" +makeReactionsPublic: "اجعل سجل التفاعلات علنيًا" +makeReactionsPublicDescription: "هذا سيجعل قائمة تفاعلاتك مرئية للعلن." +classic: "تقليدي" _docs: admin: "إدارة " +_gallery: + unlike: "أزل الإعجاب" _email: _follow: title: "يتابعك" +_registry: + keys: "المفاتيح" + domain: "النّطاق" + createKey: "أنشئ مفتاحًا" +_aboutMisskey: + about: "ميسكي هو برمجية مفتوحة المصدر يطورها syuilo منذ 2014." + contributors: "المساهم الرئيسي" + allContributors: "كل المساهمين" + source: "الشفرة المصدرية" + translation: "ترجم ميسكي" + donate: "تبرع لميسكي" + morePatrons: "نحن نقدر الدعم الذي قدمه العديد من الأشخاص الذين لم نذكرهم. شكرًا لكم 🥰" + patrons: "الداعمون" +_nsfw: + force: "اخف كل الوسائط" _mfm: mention: "أشر الى" + hashtag: "الوسوم" + url: "الرابط" + urlDescription: "يمكن عرض الروابط" + link: "رابط" + bold: "عريض" + small: "صغير" quote: "اقتبس" emoji: "إيموجي مخصص" search: "البحث" _reversi: + gameSettings: "إعدادات اللعبة" + chooseBoard: "اختر اللوح" + blackOrWhite: "أسود/أبيض" + blackIs: "{name} سيلعب بالأسود" + botSettings: "خيارات الحسابات الآلية" + waitingBoth: "استعد" + ready: "جاهز" + cancelReady: "ألغ الجهوزية" + opponentTurn: "دور الخصم" + myTurn: "دورك" + turnOf: "دور {name}" + pastTurnOf: "دور {name}" + surrender: "استسلم" + drawn: "تعادل" + won: "فاز {name}" + black: "أسود" + white: "أبيض" total: "المجموع" + turnCount: "الدور {count}" + myGames: "جولاتي" + allGames: "كل الجولات" + ended: "انتهت" + playing: "يُلعب الآن" _channel: featured: "المتداوَلة" _menuDisplay: @@ -539,11 +707,15 @@ _theme: install: "تنصيب قالب" manage: "إدارة القوالب" code: "شيفرة القالب" + description: "الوصف" installed: "تم تنصيب {name}" make: "إنشاء قالب" alpha: "الشفافية" keys: + link: "رابط" + hashtag: "وسم" mention: "أشر الى" + renote: "أعد النشر" messageBg: "خلفية المحادثة" _sfx: note: "الملاحظات" @@ -569,11 +741,35 @@ _time: _tutorial: title: "كيف تستخدم Misskey" step1_1: "مرحبًا!" + step1_2: "تدعى هذه الصفحة 'الخيط الزمني' وهي تحوي ملاحظات الأشخاص الذي تتابعهم مرتبة حسب تاريخ نشرها." + step1_3: "خيطك الزمني فارغ حاليًا بما أنك لا تتابع أي شخص ولم تنشر أي ملاحظة." + step2_1: "لننهي إعداد ملفك الشخصي قبل كتابة ملاحظة أو متابعة أشخاص." + step3_1: "هل أنهيت إعداد حسابك؟" + step3_2: "إذا تاليًا للنشر ملاحظة. أنقر على أيقونة القلم في أعلى الشاشة" + step5_3: "لمتابعة مستخدمين ادخل ملفهم الشخصي بالنقر على صورتهم الشخصية ثم اضغط زر 'تابع'." _2fa: registerKey: "تسجيل مفتاح أمان جديد" _permissions: + "read:account": "اعرض معلومات حسابك" "write:account": "تعديل معلومات حسابك" + "read:blocks": "اعرض قائمة المستخدمين المحجوبين" + "write:blocks": "عدّل قائمة المستخدمين المحجوبين" + "read:drive": "تصفح قرص التخزين" + "write:drive": "احذف أو عدّل محتويات قرص التخزين" + "read:favorites": "اعرض المفضلة" + "write:favorites": "عدّل المفضلة" "read:notifications": "اظهر الإشعارات" + "read:reactions": "اعرض تفاعلاتك" + "write:reactions": "عدّل تفاعلاتك" + "write:votes": "صوّت" + "read:pages": "اعرض صفحاتك" + "write:pages": "عدّل أو احذف صفحاتك" + "read:user-groups": "اعرض مجموعات المستخدمين" + "write:user-groups": "عدّل أو احذف مجموعات المستخدمين" + "read:gallery": "اعرض المعرض" + "write:gallery": "عدّل المعرض" +_auth: + shareAccess: "أتريد التفويض لـ \"{name}\" بالوصول لحسابك؟" _weekday: sunday: "الأحد" monday: "الإثنين" @@ -624,39 +820,74 @@ _poll: _visibility: public: "للعامة" home: "الرئيسي" - followers: "المتابِعين" + followers: "المتابِعون" specified: "مباشرة" localOnly: "المحلي فقط" _postForm: replyPlaceholder: "رد على هذه الملاحظة…" quotePlaceholder: "اقتبس هذه الملاحظة…" + channelPlaceholder: "انشر في قناة..." + _placeholders: + c: "ما الذي تفكر فيه؟" + d: "ما الذي تريد قوله؟" + e: "أكتب..." _profile: name: "الإسم" username: "اسم المستخدم" + description: "السيرة" youCanIncludeHashtags: "يمكنك أيضًا إضافة وسوم إلى نبذتك التعريفية." + metadata: "معلومات إضافية" + metadataEdit: "عدّل المعلومات الإضافية" + metadataDescription: "يُمكنك عرض 4 حقول معلومات في ملفك الشخصي" + metadataLabel: "التسمية" + metadataContent: "المحتوى" + changeAvatar: "غيّر الصورة الرمزية" + changeBanner: "غيّر اللافتة" _exportOrImport: allNotes: "كل الملاحظات" followingList: "المتابَعون" - muteList: "اكتم" - blockingList: "احجب" + muteList: "المستخدمون المكتومون" + blockingList: "المستخدمون المحجوبون" userLists: "القوائم" _charts: usersTotal: "مجموع عدد المستخدمين والمستخدمات" activeUsers: "المستخدمون النشطون" + notesTotal: "إجمالي الملاحظات" _timelines: home: "الرئيسي" local: "المحلي" social: "الاجتماعي" global: "الشامل" _rooms: + leaveConfirm: "لديك تغييرات غير محفوظة. أتريد المتابعة دون حفظها؟" + chooseImage: "اختر صورة" + roomType: "نوع الغرفة" _roomType: default: "افتراضي" + washitsu: "الأسلوب الياباني" _furnitures: + milk: "علبة حليب" + bed: "سرير" + low-table: "طاولة قصيرة" + desk: "مكتب" + chair: "كرسي" + chair2: "كرسي 2" + pc: "حاسوب" monitor: "شاشة التحكم" banknote: "أوراق نقدية" _pages: + viewPage: "اعرض صفحاتك" + like: "أعجبني" + unlike: "أزل الإعجاب" + my: "صفحاتي" blocks: image: "الصور" + _post: + text: "المحتوى" + _button: + _action: + _dialog: + content: "المحتوى" script: categories: list: "القوائم" @@ -685,9 +916,11 @@ _notification: youGotMessagingMessageFromUser: "لقد تلقيت رسالة مِن {name}" youGotMessagingMessageFromGroup: "لقد أرسِلَت رسالة إلى الفريق {name}" youWereFollowed: "يتابعك" + youWereInvitedToGroup: "دُعيت إلى مجموعة" _types: follow: "المتابَعون" mention: "أشر الى" + renote: "أعد النشر" quote: "اقتبس" reaction: "تفاعل" _deck: diff --git a/locales/de-DE.yml b/locales/de-DE.yml index 81fb263a7..311500e85 100644 --- a/locales/de-DE.yml +++ b/locales/de-DE.yml @@ -799,6 +799,8 @@ manageAccounts: "Benutzerkonten verwalten" makeReactionsPublic: "Reaktionsverlauf veröffentlichen" makeReactionsPublicDescription: "Jeder wird die Liste deiner gesendeten Reaktionen einsehen können." classic: "Classic" +muteThread: "Thread stummschalten" +unmuteThread: "Threadstummschaltung aufheben" _signup: almostThere: "Fast geschafft" emailAddressInfo: "Bitte gib deine Email-Adresse ein." diff --git a/locales/en-US.yml b/locales/en-US.yml index 6d2961ce3..36d0a48ea 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -800,6 +800,8 @@ manageAccounts: "Manage Accounts" makeReactionsPublic: "Set reaction history to public" makeReactionsPublicDescription: "This will make the list of all your past reactions publicly visible." classic: "Classic" +muteThread: "Mute thread" +unmuteThread: "Unmute thread" _signup: almostThere: "Almost there" emailAddressInfo: "Please enter your email address." diff --git a/locales/eo-UY.yml b/locales/eo-UY.yml index 0733f0e47..88bf7ab2f 100644 --- a/locales/eo-UY.yml +++ b/locales/eo-UY.yml @@ -543,6 +543,7 @@ learnMore: "Lernu pli" translate: "Traduki" translatedFrom: "Tradukita el {x}" controlPanel: "Ŝaltpodio" +classic: "Klasika" _docs: continueReading: "Legi plu" features: "Funkcioj" diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index dbb0bf166..1326369f8 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -800,6 +800,8 @@ manageAccounts: "アカウントを管理" makeReactionsPublic: "リアクション一覧を公開する" makeReactionsPublicDescription: "あなたがしたリアクション一覧を誰でも見れるようにします。" classic: "クラシック" +muteThread: "スレッドをミュート" +unmuteThread: "スレッドのミュートを解除" _signup: almostThere: "ほとんど完了です" diff --git a/migration/1635500777168-note-thread-mute.ts b/migration/1635500777168-note-thread-mute.ts new file mode 100644 index 000000000..aed10d18d --- /dev/null +++ b/migration/1635500777168-note-thread-mute.ts @@ -0,0 +1,26 @@ +import {MigrationInterface, QueryRunner} from "typeorm"; + +export class noteThreadMute1635500777168 implements MigrationInterface { + name = 'noteThreadMute1635500777168' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`CREATE TABLE "note_thread_muting" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "threadId" character varying(256) NOT NULL, CONSTRAINT "PK_ec5936d94d1a0369646d12a3a47" PRIMARY KEY ("id"))`); + await queryRunner.query(`CREATE INDEX "IDX_29c11c7deb06615076f8c95b80" ON "note_thread_muting" ("userId") `); + await queryRunner.query(`CREATE INDEX "IDX_c426394644267453e76f036926" ON "note_thread_muting" ("threadId") `); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_ae7aab18a2641d3e5f25e0c4ea" ON "note_thread_muting" ("userId", "threadId") `); + await queryRunner.query(`ALTER TABLE "note" ADD "threadId" character varying(256)`); + await queryRunner.query(`CREATE INDEX "IDX_d4ebdef929896d6dc4a3c5bb48" ON "note" ("threadId") `); + await queryRunner.query(`ALTER TABLE "note_thread_muting" ADD CONSTRAINT "FK_29c11c7deb06615076f8c95b80a" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "note_thread_muting" DROP CONSTRAINT "FK_29c11c7deb06615076f8c95b80a"`); + await queryRunner.query(`DROP INDEX "public"."IDX_d4ebdef929896d6dc4a3c5bb48"`); + await queryRunner.query(`ALTER TABLE "note" DROP COLUMN "threadId"`); + await queryRunner.query(`DROP INDEX "public"."IDX_ae7aab18a2641d3e5f25e0c4ea"`); + await queryRunner.query(`DROP INDEX "public"."IDX_c426394644267453e76f036926"`); + await queryRunner.query(`DROP INDEX "public"."IDX_29c11c7deb06615076f8c95b80"`); + await queryRunner.query(`DROP TABLE "note_thread_muting"`); + } + +} diff --git a/package.json b/package.json index f0bdd0049..868722392 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "misskey", - "version": "12.94.1", + "version": "12.95.0", "codename": "indigo", "repository": { "type": "git", @@ -28,8 +28,9 @@ "lint": "tslint 'src/**/*.ts'", "cy:open": "cypress open", "cy:run": "cypress run", - "e2e": "start-server-and-test start:test http://localhost cy:run", - "test": "cross-env TS_NODE_FILES=true TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT=\"./test/tsconfig.json\" mocha", + "e2e": "start-server-and-test start:test http://localhost:61812 cy:run", + "mocha": "cross-env TS_NODE_FILES=true TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT=\"./test/tsconfig.json\" mocha", + "test": "npm run mocha", "format": "gulp format" }, "resolutions": { diff --git a/src/client/components/forgot-password.vue b/src/client/components/forgot-password.vue index cb2380f48..7fcf9aa72 100644 --- a/src/client/components/forgot-password.vue +++ b/src/client/components/forgot-password.vue @@ -7,21 +7,21 @@ > -
-
- + +
+ - + - {{ $ts.send }} + {{ $ts.send }}
-
+
{{ $ts._forgotPassword.ifNoEmail }}
@@ -69,3 +69,16 @@ export default defineComponent({ } }); + + diff --git a/src/client/components/form/select.vue b/src/client/components/form/select.vue index 9efaf0269..363b3515f 100644 --- a/src/client/components/form/select.vue +++ b/src/client/components/form/select.vue @@ -150,26 +150,26 @@ export default defineComponent({ }); }; - for (const optionOrOptgroup of options) { - if (optionOrOptgroup.type === 'optgroup') { - const optgroup = optionOrOptgroup; - menu.push({ - type: 'label', - text: optgroup.props.label, - }); - for (const option of optgroup.children) { + const scanOptions = (options: VNode[]) => { + for (const vnode of options) { + if (vnode.type === 'optgroup') { + const optgroup = vnode; + menu.push({ + type: 'label', + text: optgroup.props.label, + }); + scanOptions(optgroup.children); + } else if (Array.isArray(vnode.children)) { // 何故かフラグメントになってくることがある + const fragment = vnode; + scanOptions(fragment.children); + } else { + const option = vnode; pushOption(option); } - } else if (Array.isArray(optionOrOptgroup.children)) { // 何故かフラグメントになってくることがある - const fragment = optionOrOptgroup; - for (const option of fragment.children) { - pushOption(option); - } - } else { - const option = optionOrOptgroup; - pushOption(option); } - } + }; + + scanOptions(options); os.popupMenu(menu, container.value, { width: container.value.offsetWidth, diff --git a/src/client/components/google.vue b/src/client/components/google.vue index 6d8ae0b5b..be724f038 100644 --- a/src/client/components/google.vue +++ b/src/client/components/google.vue @@ -10,7 +10,12 @@ import { defineComponent } from 'vue'; import * as os from '@client/os'; export default defineComponent({ - props: ['q'], + props: { + q: { + type: String, + required: true, + } + }, data() { return { query: null, @@ -21,10 +26,7 @@ export default defineComponent({ }, methods: { search() { - const engine = this.$store.state.webSearchEngine || - 'https://www.google.com/search?q={{query}}'; - const url = engine.replace('{{query}}', this.query) - window.open(url, '_blank'); + window.open(`https://www.google.com/search?q=${this.query}`, '_blank'); } } }); diff --git a/src/client/components/media-video.vue b/src/client/components/media-video.vue index 44367ee99..4d4a55165 100644 --- a/src/client/components/media-video.vue +++ b/src/client/components/media-video.vue @@ -11,6 +11,7 @@ :title="video.name" preload="none" controls + @contextmenu.stop > - - {{ $ts.you }} + @{{ username }} @{{ toUnicode(host) }} - + @{{ username }} @{{ toUnicode(host) }} @@ -17,10 +16,11 @@