1
0
mirror of https://github.com/Kovah/LinkAce.git synced 2025-04-21 07:22:20 +02:00

Merge remote-tracking branch 'origin/1.x' into 2.x

This commit is contained in:
Kovah 2024-07-17 11:41:44 +02:00
commit b76b6a9eb4
No known key found for this signature in database
GPG Key ID: AAAA031BA9830D7B
42 changed files with 1768 additions and 1013 deletions

View File

@ -50,7 +50,7 @@ jobs:
run: composer install --prefer-dist --no-progress --no-suggest
- name: Test & publish code coverage
uses: paambaati/codeclimate-action@v5.0.0
uses: paambaati/codeclimate-action@v8.0.0
env:
CC_TEST_REPORTER_ID: ${{secrets.CC_TEST_REPORTER_ID}}
with:

View File

@ -26,8 +26,8 @@ jobs:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_TOKEN }}
- name: Login to DockerHub
uses: docker/login-action@v2
- name: Login to GitHub Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
@ -37,16 +37,36 @@ jobs:
id: prep
run: |
DOCKER_IMAGE=linkace/linkace
DOCKER_IMAGE_GITUHB=ghcr.io/kovah/linkace
DOCKER_IMAGE_GITHUB=ghcr.io/kovah/linkace
MAJOR_VERSION=1.x
VERSION=${GITHUB_REF#refs/tags/}
TAGS="${DOCKER_IMAGE}:${VERSION},${DOCKER_IMAGE_GITUHB}:${VERSION}"
TAGS="${DOCKER_IMAGE}:${VERSION},${DOCKER_IMAGE}:${MAJOR_VERSION},${DOCKER_IMAGE}:latest,${DOCKER_IMAGE_GITHUB}:${VERSION},${DOCKER_IMAGE_GITHUB}:${MAJOR_VERSION},${DOCKER_IMAGE_GITHUB}:latest"
echo "tags=${TAGS}" >> $GITHUB_OUTPUT
- name: Build and push Docker image
uses: docker/build-push-action@v5
- name: Build and push advanced image
uses: docker/build-push-action@v6
with:
context: .
file: ./resources/docker/dockerfiles/release-multiplatform.Dockerfile
platforms: linux/amd64,linux/arm64,linux/arm/v7
push: true
tags: ${{ steps.prep.outputs.tags }}
- name: Prepare simple tags
id: prep-simple
run: |
DOCKER_IMAGE=linkace/linkace
DOCKER_IMAGE_GITHUB=ghcr.io/kovah/linkace
VERSION=${GITHUB_REF#refs/tags/}
MAJOR_VERSION=1.x
TAGS="${DOCKER_IMAGE}:${VERSION}-php-nginx,${DOCKER_IMAGE}:${MAJOR_VERSION}-php-nginx,${DOCKER_IMAGE}:php-nginx,${DOCKER_IMAGE}:${VERSION}-simple,${DOCKER_IMAGE}:${MAJOR_VERSION}-simple,${DOCKER_IMAGE}:simple,${DOCKER_IMAGE_GITHUB}:${VERSION}-php-nginx,${DOCKER_IMAGE_GITHUB}:${MAJOR_VERSION}-php-nginx,${DOCKER_IMAGE_GITHUB}:php-nginx,${DOCKER_IMAGE_GITHUB}:${VERSION}-simple,${DOCKER_IMAGE_GITHUB}:${MAJOR_VERSION}-simple,${DOCKER_IMAGE_GITHUB}:simple"
echo "tags=${TAGS}" >> $GITHUB_OUTPUT
- name: Build and push simple image
uses: docker/build-push-action@v6
with:
context: .
file: ./resources/docker/dockerfiles/release-multiplatform-simple.Dockerfile
platforms: linux/amd64,linux/arm64,linux/arm/v7
push: true
tags: ${{ steps.prep-simple.outputs.tags }}

View File

@ -1,50 +1,55 @@
# :construction: Contribution
If you want to contribute to the project please open a [ticket](https://github.com/Kovah/LinkAce/issues) first and
describe what you want to do or what your idea is. Maybe there already is an existing ticket for your or a very similar
If you want to contribute to the project please open an [issue](https://github.com/Kovah/LinkAce/issues) first and
describe what you want to do or what your idea is. Maybe there already is an existing issue for your or a very similar
topic.
I may decline contributions for features that may not fit into the application, so please make sure to talk to me before
starting to code.
## Contribution Guidelines
* Always use the `dev` branch to work on the application. The dev branch will contain the latest version of the app
while the `main` branch contains the stable version (which may be outdated in terms of development).
* Consider using a separate branch if you are working on a larger feature.
* LinkAce uses two primary branches for the different major versions:
* `1.x`
* `2.x`
* Those two branches hold the latest nightly (i.e. possibly unstable) code for the respective version. The latest stable
version is accessible through the releases section and the corresponding tag.
* Use the appropriate branch as a starting point for your contribution. Then open a pull request with your changes.
* Reference the issue number in your commits please.
* When opening a pull request, link to your ticket and describe what you did to solve the problem.
* When opening a pull request, link to your issue and describe what you did to solve the problem.
---
## Development
### Minimum Requirements
* [Docker](https://www.docker.com/products/docker-desktop) _or_ PHP 7.4
* [Node](https://nodejs.org/en/) (16 LTS)
* [Docker](https://www.docker.com/products/docker-desktop)/[Podman](https://podman.io/docs/installation) _or_ a [currently-supported PHP version](https://www.php.net/supported-versions.php)
* For Podman, you also need to `apt`, `dnf`, or otherwise install [`podman-compose`](https://github.com/containers/podman-compose)
* [Node](https://nodejs.org/en/) (20 LTS)
### 1. Basic Setup
The following steps assume that you are using Docker for development, which I highly encourage. If you use other ways to work with PHP projects you must adapt the commands to your system. Clone the repository to your machine and run the following commands to start the Docker container system:
The following steps assume that you are using Docker or Podman for development, which I highly encourage. If you use
other ways to work with PHP projects you must adapt the commands to your system. If you want to use Podman, simply
replace the word `docker` with `podman` in each command. Clone the repository to your machine and run the following
commands to start the Docker container system:
```bash
cp .env.docker .env
docker-compose up -d --build
docker compose up -d --build
```
Now, install all dependencies from inside the PHP container:
```bash
docker exec -it linkace-php composer install
docker compose exec -it php composer install
docker exec -it linkace-php php artisan key:generate
docker compose exec -it php php artisan key:generate
```
Last step: compile all assets. Node 16 LTS is the minimum version required and recommended to use. You may use either NPM or Yarn for installing the asset dependencies.
Last step: compile all assets. Node 16 LTS is the minimum version required and recommended to use. You may use either
NPM or Yarn for installing the asset dependencies.
```bash
npm install
@ -54,10 +59,11 @@ npm run dev
#### 2. Working with the Artisan command line
I recommend using the Artisan command line tool in the PHP container only, to make sure that the same environment is used. To do so, use the following example command:
I recommend using the Artisan command line tool in the PHP container only, to make sure that the same environment is
used. To do so, use the following example command:
```bash
docker exec -it linkace-php php artisan migrate
docker compose exec -it php php artisan migrate
```
#### 3. Registering a new user
@ -65,23 +71,25 @@ docker exec -it linkace-php php artisan migrate
Currently, you can do this by using the command line:
```bash
docker exec -it linkace-php php artisan registeruser [user name] [user email]
docker compose exec -it php php artisan registeruser [user name] [user email]
```
## Tests
You can run existing tests with the following command:
```bash
docker exec -it linkace-php composer run lint
docker exec -it linkace-php composer run test
docker compose exec -it php composer run lint
docker compose exec -it php composer run test
```
---
## LinkAce Base Docker image
The Base image for LinkAce contains several packages and PHP extensions needed by LinkAce. It shortens the build time of the release images. This step is not needed by any developer working on LinkAce and is just a documentation for maintainers.
The Base image for LinkAce contains several packages and PHP extensions needed by LinkAce. It shortens the build time of
the release images. This step is not needed by any developer working on LinkAce and is just a documentation for
maintainers.
```bash
docker buildx build --push --platform "linux/amd64,linux/arm64,linux/arm/v7" -t linkace/base-image:php-8.3-alpine -f resources/docker/dockerfiles/release-base.Dockerfile .

View File

@ -7,8 +7,8 @@
<p align="center"><b>Your self-hosted bookmark archive.</b></p>
<p align="center">
<a href="https://twitter.com/LinkAceApp"><img src="https://img.shields.io/twitter/url?label=%40LinkAceApp&style=social&url=https%3A%2F%2Ftwitter.com%2FLinkAceApp" alt="Follow LinkAce on Twitter"></a>
<a href="https://hub.docker.com/r/linkace/linkace"><img src="https://img.shields.io/badge/Docker-linkace%2Flinkace-2596EC.svg" alt="Docker Repository"></a>
<a href="https://twitter.com/LinkAceApp"><img src="https://img.shields.io/badge/X.com%2FLinkAceApp-black" alt="Follow LinkAce on X.com"></a>
<a href="https://mastodon.social/@linkace"><img src="https://img.shields.io/badge/%40linkace%40mastodon.social-6364ff" alt="Follow LinkAce on Mastodon"></a>
<a href="https://github.com/Kovah/LinkAce/releases"><img src="https://img.shields.io/github/v/release/kovah/linkace?label=Latest%20Release" alt="Latest Release"></a>
<a href="https://opensource.org/licenses/GPL-3.0"><img src="https://img.shields.io/github/license/kovah/linkace.svg" alt="License"></a>
</p>
@ -40,7 +40,7 @@ It provides a long-term archive to store links to websites, media files or anyth
* Save links with automatic title and description generation.
* Automated link monitoring informs you when any links become unavailable or were moved.
* Automated backups of saved sites via the [Internet Archive](https://web.archive.org/).
* Automated archiving of saved sites via the [Internet Archive](https://web.archive.org/).
* Organize bookmarks with the help of lists and tags.
* A full REST API offers access to all features of LinkAce from other apps and services.
* LinkAce is also [available on Zapier](https://zapier.com/apps/linkace/integrations) and integrates with over 2500+ applications.
@ -74,7 +74,7 @@ LinkAce provides multiple ways of installing it on your server. The complete doc
I built LinkAce to solve my own problem, and I now offer my solution and code without charging any money. I spent a lot of my free time building this application, so I won't offer any *free* personal support, customization or installation help. If you need help please visit the [community discussions](https://github.com/Kovah/LinkAce/discussions) and post your issue there.
You can get personal and dedicated support by **becoming a supporter on [Open Collective](https://opencollective.com/linkace), [Patreon](https://www.patreon.com/Kovah) or [Github](https://github.com/sponsors/Kovah)**. :star:
:star: You can get personal and dedicated support by **becoming a supporter on [Open Collective](https://opencollective.com/linkace), [Patreon](https://www.patreon.com/Kovah) or [Github](https://github.com/sponsors/Kovah)**.
#### Our Supporters on Open Collective

View File

@ -26,7 +26,7 @@ class ResetPasswordCommand extends Command
$newPassword = $this->secret('Please enter a new password for this user');
$validator = Validator::make(['password' => $newPassword], [
'password' => 'required|string|min:10',
'password' => 'required|string|min:8',
]);
if ($validator->invalid()) {

View File

@ -95,6 +95,7 @@ return [
'fr_FR' => 'Français',
'hu_HU' => 'Magyar',
'it_IT' => 'Italiano',
'ja_JP' => '日本語',
'no_NO' => 'Norsk',
'pl_PL' => 'Polski',
'ro_RO' => 'Română',

View File

@ -168,7 +168,7 @@ return [
|
*/
'secure' => env('SESSION_SECURE_COOKIE'),
'secure' => env('SESSION_SECURE_COOKIE', true),
/*
|--------------------------------------------------------------------------

View File

@ -4,7 +4,7 @@ services:
# --- MariaDB
db:
image: mariadb:11.2
image: docker.io/library/mariadb:11.2
restart: unless-stopped
command: mariadbd --character-set-server=utf8mb4 --collation-server=utf8mb4_bin
environment:
@ -17,7 +17,7 @@ services:
# --- LinkAce Image with PHP
app:
image: linkace/linkace:latest
image: docker.io/linkace/linkace:latest
restart: unless-stopped
depends_on:
- db
@ -36,7 +36,7 @@ services:
# --- Redis
redis:
image: bitnami/redis:7.2
image: docker.io/bitnami/redis:7.2
restart: unless-stopped
environment:
- REDIS_PASSWORD=${REDIS_PASSWORD}

View File

@ -5,7 +5,7 @@ services:
# --- MariaDB
db:
image: mariadb:11.2
image: docker.io/library/mariadb:11.2
command: mariadbd --character-set-server=utf8mb4 --collation-server=utf8mb4_bin
environment:
- MYSQL_ROOT_PASSWORD=${DB_PASSWORD}
@ -18,7 +18,7 @@ services:
- linkace-db:/var/lib/mysql
pg-db:
image: postgres:14
image: docker.io/library/postgres:16
environment:
- POSTGRES_PASSWORD=${DB_PASSWORD}
- POSTGRES_USER=${DB_USERNAME}
@ -41,7 +41,7 @@ services:
# --- Caddy
caddy:
image: caddy:2
image: docker.io/library/caddy:2
ports:
- "80:80"
depends_on:
@ -52,7 +52,7 @@ services:
# --- Redis
redis:
image: bitnami/redis:7.2
image: docker.io/bitnami/redis:7.2
environment:
- REDIS_PASSWORD=${REDIS_PASSWORD}
ports:

View File

@ -44,7 +44,7 @@ return [
'account_setup.name' => 'Enter your name',
'account_setup.email' => 'Enter your email address',
'account_setup.password' => 'Enter a strong password',
'account_setup.password_requirements' => 'Minimum length: 10 characters',
'account_setup.password_requirements' => 'Minimum length: 8 characters',
'account_setup.password_confirmed' => 'Confirm your password',
'account_setup.create' => 'Create account',

View File

@ -11,6 +11,7 @@ return [
'logout' => 'Se déconnecter',
'remember_me' => 'Se rappeler de moi',
'go_to_dashboard' => 'Aller au Tableau de bord',
'dashboard' => 'Accueil',
'system_logs' => 'Journaux Système',
'reset_password' => 'Réinitialiser le Mot de passe',

View File

@ -25,6 +25,7 @@ return [
'order_by.random' => 'Aléatoire',
'no_results' => 'Aucun résultat trouvé.',
'results_for' => 'Résultats de la recherche pour',
'validation_query_missing' => 'Vous devez soit entrer une requête de recherche, soit sélectionner une liste, une étiquette ou activer la recherche de liens cassés.',
];

View File

@ -11,6 +11,7 @@ return [
'intro.step2' => 'Configurez une base de données et vérifiez si la connexion est réussie.',
'intro.step3' => 'Créez votre compte utilisateur.',
'setup_requirements' => 'Configuration requise',
'check_requirements' => 'Vérifier Prérequis',
'requirements.php_version' => 'Version de PHP >= 7.4.0',
'requirements.extension_bcmath' => 'Module PHP : BCMath',
@ -18,7 +19,7 @@ return [
'requirements.extension_json' => 'Module PHP : JSON',
'requirements.extension_mbstring' => 'Module PHP : Mbstring',
'requirements.extension_openssl' => 'Module PHP : OpenSSL',
'requirements.extension_pdo_mysql' => 'Module PHP : PDO MySQL',
'requirements.extension_pdo_mysql' => 'Extension PHP : PDO MySQL',
'requirements.extension_tokenizer' => 'Module PHP : Tokenizer',
'requirements.extension_xml' => 'Module PHP : XML',
'requirements.env_writable' => 'Le fichier .env est présent et accessible en écriture',

27
lang/ja_JP/auth.php Normal file
View File

@ -0,0 +1,27 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Authentication Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used during authentication for various
| messages that we need to display to the user. You are free to modify
| these language lines according to your application's requirements.
|
*/
'failed' => '資格情報が記録と一致しません。',
'throttle' => 'ログイン試行回数が多すぎます。:seconds 秒後にもう一度お試しください。',
'confirm_title' => '確認が必要です',
'confirm' => '現在のパスワードを使用してこの操作を確認してください。',
'confirm_action' => 'アクションの確認',
'two_factor' => '2要素認証',
'two_factor_check' => '2段階認証アプリに表示されているワンタイムパスワードを入力してください。',
'two_factor_with_recovery' => 'リカバリーコードで認証',
];

10
lang/ja_JP/export.php Normal file
View File

@ -0,0 +1,10 @@
<?php
return [
'export' => 'エクスポート',
'start_export_html' => 'HTMLとしてエクスポート',
'start_export_csv' => 'CSVとしてエクスポート',
'export_help' => 'エクスポートを実行すると、すべてのブックマークが一般的なブックマーク互換ファイル、または必要に応じてCSVファイルで保存されます。',
'export_csv_error' => 'CSVファイルの生成中にエラーが発生しました。詳細はログファイルを確認してください。',
];

14
lang/ja_JP/import.php Normal file
View File

@ -0,0 +1,14 @@
<?php
return [
'import' => 'インポート',
'start_import' => 'インポートを開始',
'import_running' => 'インポート中...',
'import_file' => 'インポートするファイル',
'import_help' => 'ここに既存のブラウザブックマークをインポートすることができます。通常、ブックマークはブラウザによって .html ファイルとしてエクスポートされます。ここでファイルを選択してインポートを開始します。<br>ブックマークの数によっては、このプロセスに時間がかかります。',
'import_networkerror' => 'ブックマークのインポート中に問題が発生しました。詳細についてはブラウザのコンソールを確認するか、アプリケーションログを参照してください。',
'import_error' => 'ブックマークのインポート中に問題が発生しました。アプリケーションログを参照してください。',
'import_empty' => 'ブックマークをインポートできませんでした。アップロードされたファイルが破損しているか空です。',
'import_successfully' => ':imported 件のリンクがインポートされました。:skipped 件のリンクがスキップされました。',
];

69
lang/ja_JP/link.php Normal file
View File

@ -0,0 +1,69 @@
<?php
return [
'link' => 'リンク',
'links' => 'リンク',
'all_links' => 'すべてのリンク',
'recent_links' => '最近のリンク',
'no_links' => 'リンクなし',
'add' => 'リンクを追加',
'add_quick' => 'リンクをクイック追加',
'show' => 'リンクを表示',
'details' => 'リンクの詳細',
'edit' => 'リンクを編集',
'update' => 'リンクを更新',
'delete' => 'リンクを削除',
'private' => '非公開リンク',
'history' => '履歴',
'history_added' => ':fieldname に <code>:newvalue</code> を追加しました。',
'history_changed' => ':fieldname を <code>:oldvalue</code> から <code>:newvalue</code> に変更しました。',
'history_removed' => ':fieldname に <code>:newvalue</code> を追加しました。',
'history_deleted' => 'リンクが削除されました',
'history_restored' => 'リンクが復元されました',
'history_created' => 'リンクが作成されました',
'url' => 'URL',
'title' => 'タイトル',
'description' => '概要',
'revtags' => 'タグ',
'revlists' => 'リスト',
'is_private' => '非公開ステータス',
'status' => 'ステータス',
'stati' => [
'1' => '作動中',
'2' => '移動済み',
'3' => '破損',
],
'author' => '作成: :user',
'external_link' => '外部リンク',
'wayback' => 'リンクアーカイブ @ Wayback Machine',
'check_disable' => 'チェックを無効化',
'check_disabled' => 'チェックは無効です',
'check_enable' => 'チェックを有効化',
'check_enabled' => 'チェックは有効です',
'status_is_broken' => '破損としてマーク',
'status_mark_working' => '作動中としてマーク',
'added_successfully' => 'リンクの追加に成功しました。',
'added_connection_error' => 'リンクは追加されましたが、URLにアクセスしようとしたときに接続エラーが発生しました。詳細はログで確認できます。',
'added_request_error' => 'リンクは追加されましたが、URLにアクセスしようとしたときに接続エラーが発生しました。例えば無効な証明書などです。詳細はログで確認できます。',
'updated_successfully' => 'リンクの更新に成功しました。',
'deleted_successfully' => 'リンクの削除に成功しました。',
'deletion_error' => 'リンクを削除できませんでした。',
'duplicates_found' => 'LinkAceは送信されたURLと重複している可能性があるものを見つけました。',
'existing_found' => 'そのURLのリンクはすでに存在します。',
'notifications.linkcheck.errors' => 'LinkAceはあなたのリンクを確認中にエラーを見つけました。',
'notifications.linkcheck.errors.moved' => '⚠️ 次のリンクが新しい場所に移動しました:',
'notifications.linkcheck.errors.broken' => '🚫 次のリンクは到達できないか、エラーを返しています:',
'happy_bookmarking' => 'ブックマークをお楽しみください',
];

55
lang/ja_JP/linkace.php Normal file
View File

@ -0,0 +1,55 @@
<?php
return [
'linkace' => 'LinkAce',
'user' => 'ユーザー',
'username' => 'ユーザー名',
'email' => 'Eメール',
'password' => 'パスワード',
'password_confirm' => 'パスワードの確認',
'login' => 'ログイン',
'logout' => 'ログアウト',
'remember_me' => 'ログインを維持',
'go_to_dashboard' => 'ダッシュボードに移動',
'dashboard' => 'ダッシュボード',
'system_logs' => 'システムログ',
'reset_password' => 'パスワードを再設定',
'send_reset_email' => 'パスワード再設定リンクを送信',
'forgot_password_link' => 'パスワードを忘れてしまいましたか? <a href=":reset_url">ここで再設定してください</a>',
'added' => '追加',
'added_at' => '追加日時',
'updated_at' => '更新日時',
'last_update' => '最終更新',
'deleted_at' => '削除日時',
'add' => '追加',
'show' => '表示',
'edit' => '編集',
'update' => '更新',
'delete' => '削除',
'menu' => 'メニュー',
'entries' => '項目',
'feed' => 'フィード',
'continue_adding' => '編集を継続',
'private' => '非公開',
'is_private' => '非公開',
'yes' => 'はい',
'no' => 'いいえ',
'more' => 'さらに表示',
'no_results_found' => ':model が見つかりません。',
'bookmarklet_close' => 'このブックマークレットウィンドウは <span class="bm-timer">5</span> 秒で自動的に閉じます。',
'open_linkace' => 'LinkAceを開く',
'demo_login_hint' => 'すぐにログインできます。このデモは2時間ごとに初期化されますのでご注意ください。',
'project_of' => 'Linkace is a project by',
'version' => '現在のバージョン: :version',
];

31
lang/ja_JP/list.php Normal file
View File

@ -0,0 +1,31 @@
<?php
return [
'list' => 'リスト',
'lists' => 'リスト',
'all_lists' => 'すべてのリスト',
'recent_lists' => '最近のリスト',
'add' => 'リストを追加',
'show' => 'リストを表示',
'edit' => 'リストを編集',
'update' => 'リストを更新',
'delete' => 'リストを削除',
'filter_lists' => 'リストをフィルター...',
'private' => '非公開リスト',
'name' => 'リスト名',
'description' => 'リストの概要',
'author' => '作成 :user',
'no_lists' => 'リストなし',
'number_links' => ':number 個のリンクがこのリストにあります|:number 個のリンクがこのリストにあります',
'added_successfully' => 'リストの追加に成功しました。',
'updated_successfully' => 'リストの更新に成功しました。',
'deleted_successfully' => 'リストの削除に成功しました。',
'deletion_error' => 'リストを削除できませんでした。',
];

20
lang/ja_JP/note.php Normal file
View File

@ -0,0 +1,20 @@
<?php
return [
'note' => 'ノート',
'notes' => 'ノート',
'add' => 'ノートを追加',
'show' => 'ノートの表示',
'edit' => 'ノートを編集',
'update' => 'ノートを更新',
'delete' => 'ノートを削除',
'private' => '非公開ノート',
'note_content' => 'ノートコンテンツ',
'added_successfully' => 'ノートの追加に成功しました。',
'updated_successfully' => 'ノートの更新に成功しました。',
'deleted_successfully' => 'ノートの削除に成功しました。',
'deletion_error' => 'ノートを削除できませんでした。',
];

19
lang/ja_JP/pagination.php Normal file
View File

@ -0,0 +1,19 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Pagination Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used by the paginator library to build
| the simple pagination links. You are free to change them to anything
| you want to customize your views to better match your application.
|
*/
'previous' => '&laquo; 前へ',
'next' => '次へ &raquo;',
];

22
lang/ja_JP/passwords.php Normal file
View File

@ -0,0 +1,22 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Password Reset Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are the default lines which match reasons
| that are given by the password broker for a password update attempt
| has failed, such as for an invalid token or invalid new password.
|
*/
'password' => 'パスワードは6文字以上で、確認フィールドと一致している必要があります。',
'reset' => 'パスワードが再設定されました!',
'sent' => 'メールアドレスのアカウントが存在していた場合、パスワード再設定リンクをメールで送信しました。',
'token' => 'このパスワード再設定トークンは無効です。',
'user' => "このメールアドレスに一致するユーザーを見つけることが出来ませんでした。",
];

View File

@ -0,0 +1,20 @@
<?php
return [
'username' => 'johndoe',
'email' => 'john.doe@example.com',
'password' => 'パスワード',
'password_confirmed' => 'パスワードの確認',
'link_url' => 'https://github.com/Kovah/LinkAce',
'link_title' => 'ウェブサイトの題名',
'list_select' => 'リストを選択',
'tags_select' => 'いくつかのタグを選択',
'list_name' => 'リストの名前',
'tag_name' => 'タグの名前',
'two_factor_otp' => 'ワンタイムパスワード',
'two_factor_recovery_code' => 'リカバリーコード',
];

31
lang/ja_JP/search.php Normal file
View File

@ -0,0 +1,31 @@
<?php
return [
'search' => '検索',
'results' => '結果',
'filter_by_list' => 'リストでフィルター',
'filter_by_tag' => 'タグでフィルター',
'query' => '検索…',
'search_title' => 'タイトルを検索',
'search_description' => '概要を検索',
'private_only' => '非公開リンクのみ',
'broken_links' => '破損リンクのみ',
'empty_tags' => 'タグを含めない',
'empty_lists' => 'リストを含めない',
'order_by' => '並び替え',
'order_by.title:asc' => 'タイトル A-Z',
'order_by.title:desc' => 'タイトル Z-A',
'order_by.url:asc' => 'URL A-Z',
'order_by.url:desc' => 'URL Z-A',
'order_by.created_at:asc' => '古い順',
'order_by.created_at:desc' => '新しい順',
'order_by.number_links:asc' => '最少リンク',
'order_by.number_links:desc' => '最多リンク',
'order_by.random' => 'ランダム',
'no_results' => '結果が見つかりませんでした。',
'results_for' => '検索結果',
'validation_query_missing' => '検索クエリを入力するか、リストもしくはタグを選択するか、破損リンクの検索を有効にする必要があります。',
];

106
lang/ja_JP/settings.php Normal file
View File

@ -0,0 +1,106 @@
<?php
return [
'settings' => '設定',
'user_settings' => 'ユーザー設定',
'account_settings' => 'アカウント設定',
'app_settings' => 'アプリケーション設定',
'system_settings' => 'システム設定',
'guest_settings' => 'ゲスト設定',
'language' => '言語',
'timezone' => 'タイムゾーン',
'date_format' => '日付書式',
'time_format' => '時刻形式',
'listitem_count' => 'リスト内のアイテム数',
'links_new_tab' => '外部リンクを新しいタブで開く',
'markdown_for_text' => '説明とメモのマークダウンを有効にする',
'privacy' => 'プライバシー',
'links_private_default' => 'デフォルトで非公開リンクにする',
'links_private_default_help' => 'これを有効にすると、すべての新しいリンクがデフォルトで非公開になります',
'notes_private_default' => 'デフォルトで非公開ノートにする',
'notes_private_default_help' => 'これを有効にすると、すべての新しいノートがデフォルトで非公開になります',
'tags_private_default' => 'デフォルトで非公開タグにする',
'tags_private_default_help' => 'これを有効にすると、すべての新しいタグがデフォルトで非公開になります',
'lists_private_default' => 'デフォルトで非公開リストにする',
'lists_private_default_help' => 'これを有効にすると、すべての新しいリストがデフォルトで非公開になります',
'archive_backups' => 'Wayback Machine バックアップ',
'archive_backups_help' => '有効にすると、LinkAceは<a href="https://archive.org/">Wayback Machine</a>にリンクをバックアップするよう要求します。Wayback Machineは非営利団体であるInternet Archiveによって運営されています。Internet Archiveへの<a href="https://archive.org/donate/">寄付</a>をご検討ください。',
'archive_backups_enabled' => 'バックアップを有効化',
'archive_backups_enabled_help' => '有効にすると、公開リンクはインターネットアーカイブによって保存されます。',
'archive_private_backups_enabled' => '非公開リンクのバックアップを有効化',
'archive_private_backups_enabled_help' => '有効にした場合、非公開リンクも保存されます。バックアップを有効にする必要があります。',
'display_mode' => 'リンクの表示方法',
'display_mode_list_detailed' => '詳細なリスト表示',
'display_mode_list_simple' => '詳細なリスト表示',
'display_mode_cards' => '簡潔なカード表示',
'display_mode_cards_detailed' => '詳細なカード表示',
'sharing' => 'リンク共有',
'sharing_help' => 'リンクに表示したいすべてのサービスを有効にし、ワンクリックで簡単に共有できるようにします。',
'sharing_toggle' => 'すべてのオン/オフを切り替える',
'darkmode' => 'ダークモード',
'darkmode_help' => '永続的にオンにするか、デバイス設定に従い自動的にオンにするか選択できます。(<small>Check <a href="https://caniuse.com/#search=prefers-color-scheme">ここ</a>であなたのブラウザが自動検出に対応しているか確認できます</small>)',
'darkmode_disabled' => '無効',
'darkmode_auto' => '自動',
'darkmode_permanent' => '永続的',
'save_settings' => '設定を保存',
'settings_saved' => '設定の更新に成功しました!',
'bookmarklet' => 'ブックマークレット',
'bookmarklet_button' => 'ブックマークにドラッグして追加するか、右クリックしてブックマークとして保存してください。',
'bookmarklet_help' => 'このブックマークレットをブラウザに追加すると、LinkAceを手動で開かなくても訪問したサイトからリンクをすばやく追加できます。',
'change_password' => 'パスワードを変更',
'old_password' => '古いパスワード',
'new_password' => '新しいパスワード',
'new_password2' => '新しいパスワードを再入力',
'password_updated' => 'パスワードの変更に成功しました!',
'old_password_invalid' => '古いパスワードが正しくありません!',
'two_factor_auth' => '2要素認証',
'two_factor_enable' => '2要素認証を有効化',
'two_factor_disable' => '2要素認証を無効化',
'two_factor_setup_app' => '2要素認証が有効になりました。次のQRコードをスキャンして認証デバイスを設定してください。',
'two_factor_setup_url' => 'QRコードが動作しませんかこのURLを直接使用することもできます。',
'two_factor_recovery_codes' => 'これらのリカバリーコードを安全なパスワードマネージャーに保存してください。2要素認証デバイスが失われた場合に、あなたのアカウントへのアクセスを回復するために使用できます。',
'two_factor_recovery_codes_view' => 'リカバリーコードを表示',
'two_factor_regenerate_recovery_codes' => '新しいリカバリーコードを生成する',
'api_token' => 'APIトークン',
'api_token_generate' => 'トークンを生成',
'api_token_generate_confirm' => '本当に新しいトークンを生成しますか?',
'api_token_help' => 'APIトークンは他のアプリケーションやスクリプトからLinkAceにアクセスするために使用できます。',
'api_token_generate_info' => '注意すでにAPIトークンを持っている場合、新しいトークンを生成すると既存のAPI連携が壊れます',
'api_token_generate_failure' => '新しいAPIトークンを生成できませんでした。ブラウザのコンソールとアプリケーションのログを確認してください。',
'sys_page_title' => 'ページタイトル',
'sys_guest_access' => 'ゲストアクセスを有効化',
'sys_guest_access_help' => '有効にすると、ゲストは非公開ではないすべてのリンクを見ることができます。',
'sys_custom_header_content' => 'カスタムヘッダーコンテンツ',
'sys_custom_header_content_help' => 'ここに入力したコンテンツはすべてのLinkAceサイトの &lt;/head&gt; タグの前に配置されます。 分析やカスタムスクリプトを配置するのに便利です。注意:コンテンツはエスケープされていないと、サイトが壊れる可能性があります!',
'cron_token' => 'Cronトークン',
'cron_token_generate' => 'トークンを生成',
'cron_token_generate_confirm' => '本当に新しいトークンを生成しますか?',
'cron_token_help' => 'cronトークンは、デッドリンクの有無やバックアップの実行を確認するcronサービスを実行するために必要です。',
'cron_token_url' => '次のURLにあなたのcronを向けてください<span class="cron-token-url">:route</span>',
'cron_token_generate_info' => '注意すでにcronトークンを持っている場合、新しいトークンを生成すると既存のcronジョブが壊れます',
'cron_token_generate_failure' => '新しいAPIトークンを生成できませんでした。ブラウザのコンソールとアプリケーションのログを確認してください。',
'cron_token_auth_failure' => '指定されたcronトークンは無効です',
'cron_execute_successful' => 'Cronが正常に実行されました',
'update_check' => '更新確認',
'update_check_running' => '更新を確認しています…',
'update_check_version_found' => '更新が見つかりました。バージョン #VERSION# が利用可能です。',
'update_check_success' => '更新はありませんでした。',
'update_check_failed' => '更新を確認できませんでした。',
'guest_settings_info' => 'ゲストアクセスが有効になっている場合、以下の設定はあなたのサイトを訪問したゲストに適用されます。',
];

53
lang/ja_JP/setup.php Normal file
View File

@ -0,0 +1,53 @@
<?php
return [
'setup' => 'セットアップ',
'continue' => '続行',
'try_again' => '再試行',
'welcome' => 'LinkAceのセットアップへようこそ',
'intro' => '次の手順では、LinkAceを使用できるように設定します。',
'intro.step1' => 'すべての要件を満たしているか確認します。',
'intro.step2' => 'データベースをセットアップし、接続に成功するか確認します。',
'intro.step3' => 'ユーザーアカウントを作成',
'setup_requirements' => 'セットアップ要件',
'check_requirements' => '要件の確認',
'requirements.php_version' => 'PHPバージョン >= 7.4.0',
'requirements.extension_bcmath' => 'PHP拡張モジュールBCMath',
'requirements.extension_ctype' => 'PHP拡張モジュールCtype',
'requirements.extension_json' => 'PHP拡張モジュールJSON',
'requirements.extension_mbstring' => 'PHP拡張モジュールMbstring',
'requirements.extension_openssl' => 'PHP拡張モジュールOpenSSL',
'requirements.extension_pdo_mysql' => 'PHP拡張モジュールPDO MySQL',
'requirements.extension_tokenizer' => 'PHP拡張モジュールTokenizer',
'requirements.extension_xml' => 'PHP拡張モジュールXML',
'requirements.env_writable' => '.envファイルが存在し、書き込み可能',
'requirements.storage_writable' => '/storageおよび/storage/logsディレクトリが書き込み可能',
'database_configuration' => 'データベース構成',
'database_configure' => 'データベースを構成',
'database.intro' => '.envファイルにデータベースの情報を入力している場合、入力フィールドに事前入力されています。それ以外の場合、データベースの情報を各フィールドに入力してください。',
'database.config_error' => 'データベースを構成できませんでした。接続の詳細を確認してください。詳細:',
'database.db_host' => 'データベースのホスト',
'database.db_port' => 'データベースのポート',
'database.db_name' => 'データベースの名前',
'database.db_user' => 'データベースのユーザー名',
'database.db_password' => 'データベースのパスワード',
'database.complete_hint' => 'データベースの構成を保存し、アプリを使用するために準備するには数秒かかる場合がありますので、しばらくお待ちください。',
'database.data_present' => '注意!指定したデータベースからデータが見つかりました!そのデータベースのバックアップがあることを確認し、すべてのデータの削除を確認してください。',
'database.overwrite_data' => 'すべてのデータを削除し、新しいLinkAceデータベースで上書きする必要があることを確認します。',
'account_setup' => 'アカウントのセットアップ',
'account_setup.intro' => '開始する前に、ユーザーアカウントを作成する必要があります。',
'account_setup.name' => '名前を入力',
'account_setup.email' => 'メールアドレスを入力',
'account_setup.password' => '強力なパスワードを入力',
'account_setup.password_requirements' => '最小文字数10文字',
'account_setup.password_confirmed' => 'パスワードを再入力',
'account_setup.create' => 'アカウントを作成',
'complete' => 'セットアップが完了しました!',
'outro' => 'セットアップを完了し、LinkAceを使用できるようになりましたログインしてすぐにブックマークを開始できます。',
];

33
lang/ja_JP/sharing.php Normal file
View File

@ -0,0 +1,33 @@
<?php
return [
'sharetext' => 'この素晴らしいリンクを見つけました。確認してください:#URL#',
'subject' => 'このクールなリンクを見てください',
'share' => ':service 経由でリンクを共有',
'share_link' => 'リンクを共有',
'service' => [
'email' => 'Eメール',
'print' => '印刷',
'facebook' => 'Facebook',
'twitter' => 'Twitter',
'reddit' => 'Reddit',
'pinterest' => 'Pinterest',
'whatsapp' => 'Whatsapp',
'telegram' => 'Telegram',
'fb-messenger' => 'Facebook Messenger',
'wechat' => 'WeChat',
'sms' => 'SMS',
'slack' => 'Slack',
'skype' => 'Skype',
'hackernews' => 'Hacker News',
'discord' => 'Discord',
'mastodon' => 'Mastodon',
'pocket' => 'Pocket',
'flipboard' => 'Flipboard',
'evernote' => 'Evernote',
'trello' => 'Trello',
'buffer' => 'Buffer',
'tumblr' => 'Tumblr',
'xing' => 'Xing',
'linkedin' => 'LinkedIn',
],
];

12
lang/ja_JP/stats.php Normal file
View File

@ -0,0 +1,12 @@
<?php
return [
'stats' => '統計',
'total_links' => '合計リンク数',
'total_lists' => '合計リスト数',
'total_tags' => '合計タグ数',
'total_notes' => '合計ノート数',
'total_broken_links' => '破損リンク数',
];

28
lang/ja_JP/tag.php Normal file
View File

@ -0,0 +1,28 @@
<?php
return [
'tag' => 'タグ',
'tags' => 'タグ',
'all_tags' => 'すべてのタグ',
'recent_tags' => '最近のタグ',
'add' => 'タグを追加',
'show' => 'タグを表示',
'edit' => 'タグを編集',
'update' => 'タグを更新',
'delete' => 'タグを削除',
'filter_tags' => 'タグをフィルター...',
'private' => '非公開タグ',
'name' => 'タグ名',
'author' => '作成 :user',
'no_tags' => 'タグなし',
'added_successfully' => 'タグの追加に成功しました。',
'updated_successfully' => 'タグの更新に成功しました。',
'deleted_successfully' => 'タグの削除に成功しました。',
'deletion_error' => 'タグを削除できませんでした。',
];

31
lang/ja_JP/trash.php Normal file
View File

@ -0,0 +1,31 @@
<?php
return [
'trash' => 'ごみ箱',
'deleted_links' => 'ごみ箱にあるリンク',
'deleted_lists' => 'ごみ箱にあるリスト',
'deleted_tags' => 'ごみ箱にあるタグ',
'deleted_notes' => 'ごみ箱にあるノート',
'restore' => '項目を復元',
'clear_trash' => 'ごみ箱を空にする',
'delete_warning' => '完全に削除された項目は復元できません!',
'delete_no_entries' => '削除する項目がありません。',
'delete_success.links' => 'すべてのリンクを完全に削除しました。',
'delete_success.lists' => 'すべてのリストを完全に削除しました。',
'delete_success.tags' => 'すべてのタグを完全に削除しました。',
'delete_success.notes' => 'すべてのノートを完全に削除しました。',
'restore.link' => 'リンクをごみ箱から復元しました。',
'restore.list' => 'リストをごみ箱から復元しました。',
'restore.tag' => 'タグをごみ箱から復元しました。',
'restore.note' => 'ノートをごみ箱から復元しました。',
'restore.not_found' => '復元するアイテムが見つかりませんでした。',
'restore.not_allowed' => 'このアイテムを復元する権限がありません。',
];

10
lang/ja_JP/user.php Normal file
View File

@ -0,0 +1,10 @@
<?php
return [
'user' => 'ユーザー',
'users' => 'ユーザー',
'username' => 'ユーザー名',
'email' => 'Eメール',
'hello' => 'こんにちは、:user',
];

146
lang/ja_JP/validation.php Normal file
View File

@ -0,0 +1,146 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Validation Language Lines
|--------------------------------------------------------------------------
|
| The following language lines contain the default error messages used by
| the validator class. Some of these rules have multiple versions such
| as the size rules. Feel free to tweak each of these messages here.
|
*/
'accepted' => ':attribute は承認されている必要があります。',
'active_url' => ':attribute は有効なURLではありません。',
'after' => ':attribute は :date より後の日付にしてください。',
'after_or_equal' => ':attribute は :date と同じか後の日付にしてください。',
'alpha' => ':attribute にはアルファベットのみ使用できます。',
'alpha_dash' => ':attribute には英数字とハイフン、アンダースコアが使用できます。',
'alpha_num' => ':attribute には英数字のみ使用できます。',
'array' => ':attribute は配列にしてください。',
'before' => ':attribute は :date より前の日付にしてください。',
'before_or_equal' => ':attribute は :date と同じか前の日付にしてください。',
'between' => [
'numeric' => ':attribute は :min から :max までの間で指定してください。',
'file' => ':attribute は :min KB から :max KB までの間で指定してください。',
'string' => ':attribute は :min 文字から :max 文字までの間で指定してください。',
'array' => ':attribute は :min 個から :max 個までの間で指定してください。',
],
'boolean' => ':attribute は true もしくは false を指定してください。',
'confirmed' => ':attribute が一致しません。',
'date' => ':attribute は無効な日付です。',
'date_format' => ':attribute は :format 形式と一致しません。',
'different' => ':attribute と :other は異なっている必要があります。',
'digits' => ':attribute は :digits 桁にしてください。',
'digits_between' => ':attribute は :min 桁から :max 桁までの間で指定してください。',
'dimensions' => ':attribute の画像サイズが正しくありません。',
'distinct' => ':attribute フィールドに重複する値があります。',
'email' => ':attribute は有効なメールアドレスにしてください。',
'exists' => '選択された :attribute は不正です。',
'file' => ':attribute はファイルにしてください。',
'filled' => ':attribute フィールドは空に出来ません。',
'gt' => [
'numeric' => ':attribute は :value より大きい値にしてください。',
'file' => ':attribute は :value KB より大きいサイズにしてください。',
'string' => ':attribute は :value 文字より多くしてください。',
'array' => ':attribute は :value 個より多くしてください。',
],
'gte' => [
'numeric' => ':attribute は :value 以上にしてください。',
'file' => ':attribute は :value KB 以上にしてください。',
'string' => ':attribute は :value 文字以上にしてください。',
'array' => ':attribute は :value 個以上にしてください。',
],
'image' => ':attribute は画像にしてください。',
'in' => '選択された :attribute は不正です。',
'in_array' => ':attribute フィールドが :other に存在しません。',
'integer' => ':attribute は整数にしてください。',
'ip' => ':attribute は有効なIPアドレスにしてください。',
'ipv4' => ':attribute は有効なIPv4アドレスにしてください。',
'ipv6' => ':attribute は有効なIPv6アドレスにしてください。',
'json' => ':attribute は有効なJSON文字列にしてください。',
'lt' => [
'numeric' => ':attribute は :value 未満にしてください。',
'file' => ':attribute は :value KB 未満にしてください。',
'string' => ':attribute は :value 文字未満にしてください。',
'array' => ':attribute は :value 個未満にしてください。',
],
'lte' => [
'numeric' => ':attribute は :value 以下にしてください。',
'file' => ':attribute は :value KB 以下にしてください。',
'string' => ':attribute は :value 文字以下にしてください。',
'array' => ':attribute には :value 以下にしてください。',
],
'max' => [
'numeric' => ':attribute には :max 以下にしてください。',
'file' => ':attribute は :max KB 以下にしてください。',
'string' => ':attribute は :max 文字以下にしてください。',
'array' => ':attribute には :max 個以下にしてください。',
],
'mimes' => ':attribute はファイルタイプ :values にしてください。',
'mimetypes' => ':attribute はファイルタイプ :values にしてください。',
'min' => [
'numeric' => ':attribute は少なくとも :min 以上にしてください。',
'file' => ':attribute は少なくとも :min KB 以上にしてください。',
'string' => ':attribute は少なくとも :min 文字以上にしてください。',
'array' => ':attribute は少なくとも :min 個以上にしてください。',
],
'not_in' => '選択された :attribute は不正です。',
'not_regex' => ':attribute 形式は不正です。',
'numeric' => ':attribute は数値にしてください。',
'present' => ':attribute フィールドは必須です。',
'regex' => ':attribute 形式は不正です。',
'required' => ':attribute フィールドは必須です。',
'required_if' => ':other が :value の場合、:attribute フィールドは必須です。',
'required_unless' => ':other が :value 以外の場合、:attribute フィールドは必須です。',
'required_with' => ':values が存在する場合、:attribute フィールドは必須です。',
'required_with_all' => ':values が存在する場合、:attribute フィールドは必須です。',
'required_without' => ':values が存在しない場合、:attribute フィールドは必須です。',
'required_without_all' => ':values がすべて存在しない場合、:attribute フィールドは必須です。',
'same' => ':attribute と :other は一致している必要があります。',
'size' => [
'numeric' => ':attribute は :size にしてください。',
'file' => ':attribute は :size KB にしてください。',
'string' => ':attribute は :size 文字にしてください。',
'array' => ':attribute は :size 個にしてください。',
],
'string' => ':attribute は文字列にしてください。',
'timezone' => ':attribute は有効なゾーンにしてください。',
'unique' => ':attribute は既に使用されています。',
'uploaded' => ':attribute のアップロードに失敗しました。',
'url' => ':attribute 形式は不正です。',
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [
'attribute-name' => [
'rule-name' => 'カスタムメッセージ',
],
],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap attribute place-holders
| with something more reader friendly such as E-Mail Address instead
| of "email". This simply helps us make messages a little cleaner.
|
*/
'attributes' => [],
];

View File

@ -11,6 +11,7 @@ return [
'logout' => 'Logg av',
'remember_me' => 'Husk meg',
'go_to_dashboard' => 'Gå til dashbord',
'dashboard' => 'Instrumentbord',
'system_logs' => 'Systemlogg',
'reset_password' => 'Tilbakestill passord',

View File

@ -25,6 +25,7 @@ return [
'order_by.random' => 'Tilfeldig',
'no_results' => 'Ingen resultater.',
'results_for' => 'Søkeresultater for',
'validation_query_missing' => 'Du må enten skrive inn et søk, eller velge en liste, en etikket eller aktivere søk etter ødelagte lenker.',
];

View File

@ -11,6 +11,7 @@ return [
'intro.step2' => 'Opprett en database og kontroller om tilkoblingen er vellykket.',
'intro.step3' => 'Opprett din brukerkonto.',
'setup_requirements' => 'Oppsettskrav',
'check_requirements' => 'Kontroller kravene',
'requirements.php_version' => 'PHP versjon >= 7.4.0',
'requirements.extension_bcmath' => 'PHP utvidelse: BCMath',

1813
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{
"name": "linkace",
"version": "1.14.1",
"version": "1.15.1",
"description": "A small, selfhosted bookmark manager with advanced features, built with Laravel and Docker",
"homepage": "https://github.com/Kovah/LinkAce",
"repository": {
@ -15,11 +15,11 @@
"devDependencies": {
"laravel-mix": "^6.0.31",
"postcss": "^8.4.35",
"sass": "^1.71.0",
"sass": "^1.77.8",
"sass-loader": "^14.1.0"
},
"dependencies": {
"bootstrap": "^5.2.3",
"bootstrap": "^5.3.3",
"tom-select": "^2.0.0"
},
"scripts": {

View File

@ -1,23 +1,18 @@
# DOCKERFILE DEVELOPMENT
# Installs MySQL Client for database exports, xDebug with PCov and Composer
# Installs database clients for database exports, xDebug with PCov and Composer
FROM php:8.1.10-fpm
FROM docker.io/library/php:8.1-fpm-alpine
WORKDIR /app
RUN apt-get update && apt-get install -y \
zip \
git \
mariadb-client \
postgresql-client \
sqlite3 \
autoconf \
build-essential \
libpq-dev \
libzip-dev
RUN pecl install xdebug pcov
RUN docker-php-ext-install bcmath pdo_mysql pdo_pgsql zip
RUN docker-php-ext-enable xdebug pcov
# Install package and PHP dependencies
RUN apk add --no-cache zip git mariadb-client postgresql-client postgresql-dev sqlite3 zip libzip-dev; \
docker-php-ext-configure zip; \
docker-php-ext-install bcmath pdo_mysql pdo_pgsql zip ftp; \
docker-php-ext-enable xdebug pcov; \
mkdir /ssl-certs; \
docker-php-source delete; \
rm -f /usr/src/php.tar.xz /usr/src/php.tar.xz.asc; \
apk del --no-cache postgresql-dev
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

View File

@ -1,12 +1,15 @@
FROM php:8.3-fpm-alpine
FROM docker.io/library/php:8.3-fpm-alpine
# Install package and PHP dependencies
RUN apk add --no-cache mariadb-client postgresql-client libpq-dev sqlite zip libzip-dev supervisor \
RUN apk add --no-cache mariadb-client postgresql-client postgresql-dev sqlite zip libzip-dev supervisor \
&& docker-php-ext-configure zip; \
&& docker-php-ext-install bcmath pdo_mysql pdo_pgsql zip ftp \
&& mkdir /ssl-certs \
&& mkdir /etc/supervisor.d \
&& mkdir /etc/caddy \
&& docker-php-source delete
&& docker-php-source delete \
&& rm -f /usr/src/php.tar.xz /usr/src/php.tar.xz.asc \
&& apk del --no-cache postgresql-dev
# Copy Caddy executable
COPY --from=caddy:2 /usr/bin/caddy /usr/bin/caddy

View File

@ -2,7 +2,7 @@
# ================================
# PHP Dependency Setup
FROM linkace/base-image:php-8.3-caddy AS builder
FROM docker.io/linkace/base-image:php-8.3-caddy AS builder
WORKDIR /app
# Pull composer and install required packages
@ -38,7 +38,7 @@ RUN mv vendor/spatie/laravel-backup/resources/lang/de vendor/spatie/laravel-back
# ================================
# Compile all assets
FROM node:20 AS npm_builder
FROM docker.io/library/node:20 AS npm_builder
WORKDIR /srv
COPY ./resources/assets ./resources/assets
@ -49,7 +49,7 @@ RUN npm run production
# ================================
# Prepare the final image
FROM linkace/base-image:php-8.3-caddy
FROM docker.io/linkace/base-image:php-8.3-caddy
WORKDIR /app
USER www-data

View File

@ -20,7 +20,7 @@ class ResetPasswordCommandTest extends TestCase
->expectsOutput('A user with this email address could not be found!')
->expectsQuestion('Please enter the user email address', 'test@linkace.org')
->expectsQuestion('Please enter a new password for this user', 'test')
->expectsOutput('The password must be at least 10 characters.')
->expectsOutput('The password must be at least 8 characters.')
->expectsQuestion('Please enter a new password for this user', 'longtestpassword')
->expectsOutput('Password successfully changed. You can now login.')
->assertExitCode(0);

View File

@ -150,6 +150,62 @@ class LinkApiTest extends ApiTestCase
]);
}
public function testCreateRequestWithList(): void
{
$list = LinkList::factory()->create(['name' => 'Test List 1']);
$response = $this->postJsonAuthorized('api/v1/links', [
'url' => 'http://example.com',
'title' => 'Search the Web',
'description' => 'There could be a description here',
'lists' => [$list->id],
'tags' => [],
'is_private' => false,
'check_disabled' => false,
]);
$response->assertOk()
->assertJson([
'url' => 'http://example.com',
'lists' => [
['name' => 'Test List 1'],
],
]);
$this->assertDatabaseHas('link_lists', [
'list_id' => 1,
'link_id' => 1,
]);
}
public function testCreateRequestWithTag(): void
{
$tag = Tag::factory()->create(['name' => 'a test 1']);
$response = $this->postJsonAuthorized('api/v1/links', [
'url' => 'http://example.com',
'title' => 'Search the Web',
'description' => 'There could be a description here',
'lists' => [],
'tags' => [$tag->id],
'is_private' => false,
'check_disabled' => false,
]);
$response->assertOk()
->assertJson([
'url' => 'http://example.com',
'tags' => [
['name' => 'a test 1'],
],
]);
$this->assertDatabaseHas('link_tags', [
'tag_id' => 1,
'link_id' => 1,
]);
}
public function testCreateRequestWithTagsAsString(): void
{
$this->postJsonAuthorized('api/v1/links', [