这篇笔记新建的时间是 2020 年 12 月 29 号,想来从那个时间点开始我就一直想着怎么离开豆瓣了。过去一年时间里面陆陆续续也发现了不少不错的网站,甚至有一些比豆瓣都要好用。这里就再整理一下。
豆瓣让我不能忍受的便是对词条的删减,以及对用户笔记,影评,书评的肆意审查,基本导致了现在豆瓣陷入不可用的状态。
我也曾经说过,我离不开豆瓣的几个理由:
NeoDB 是一个建立在 federated network (联邦网络)中的用来标记书籍、电影、音乐和游戏的网站。
NeoDB 目前只能通过 [[Mastodon]] (或[[Pleroma]]/Friendica/PixelFed)实例的账号来登录。
我的页面:https://neodb.social/users/einverne@m.gtk.pw/
themoviedb 简称为 TMDB ,是一个从 2008 年开始的电影,剧集数据库。拥有非常全的数据库。
TMDB 也开放了编辑入口,所有的注册用户都可以贡献,和当年的豆瓣非常相似,官方也有非常详细的 贡献指南 。
看网站的设计,词条的界面,数据也非常详细,设计也不错。
[[trakt]] 是一个电视剧和电影媒体资源订阅追踪平台,电视界的 IMDB。可以认为是一个电视剧的数据库,有每个电视剧的元数据,至少包括剧名、首播时间、是否完结、长度、季、集、语言、国家、简介、类别、演员,链接到官网,IMDB,TMDB,TVDB,Wiki 等的链接等等。而且这些数据是公开的,有非常多 App 在使用他作为基础数据提供其他服务。
Trakt 相较于豆瓣更好的地方在于可以和第三方的应用交互,比如在 Plex 中看完一集之后可以自动同步到 trake。
Trakt 还支持 [[Kodi]], [[Plex]], [[Emby]], [[Netflix]], [[Infuse]], [[Jellyfin]], [[MediaPortal]], [[MrMC]], [[Stremio]], [[Serviio]], [[VLC]] 等等。
Trakt 还提供了 VIP 增值服务,包括了如上的功能。个人 30$ 一年起步,还有另外一个是 60$ 一年。
LitterBoxd 是另一个可以标记看过电影的网站。不过 LetterBoxd 只支持电影。
首页:
词条页面
TBDB 是专注在剧集的网站。
IMDB 就不用多说了,老牌的电影资料站。
Google Book 的 API 文档:
Amazon 收购而来的网站,和 Kindle 搭配使用。
可以用来追踪阅读进度,以及管理看过书籍。
本人不怎么使用豆瓣音乐,所以没怎么整理,不过 Last.FM 已经存在很多年了。数据也比较全。
之前在 Proxmox 上给 Ubuntu 划分了 64GB 的空间,运行一段时间之后磁盘空间剩余不多,就抽时间扩展一下。本文就记录一下给 Proxmox VE 的虚拟机扩展的过程。其实之前的文章里面也略微提到过一些,但是没有完整记录。
本来想着是这一篇文章把虚拟机的扩展和缩减空间一并整理了,但写着写着篇幅就比较大了,本文最后还是集中在扩容部分,缩减(shrink) 部分有机会再整理吧。
在扩容之前,为了防止发生错误,请先备份虚拟机,然后关闭虚拟机操作。
关于备份的操作可以参考: Proxmox VE 下备份和恢复虚拟机
在 Proxmox VE 管理后台,点击虚拟机,在 Hardware 中选中 Hard Disk,然后在菜单栏中就能看到 Resize disk
不过需要注意的是,这里的只能给虚拟机的磁盘增加容量,而不能缩小容量,关于缩小容量的操作以后有机会再写。
图中可以看到原始的虚拟机磁盘分配了 64GB,我又扩容了 64GB。
扩容之后启动虚拟机,SSH 登录,然后执行 df -h
Filesystem Size Used Avail Use% Mounted on
udev 7.8G 0 7.8G 0% /dev
tmpfs 1.6G 1.5M 1.6G 1% /run
/dev/sda2 63G 38G 23G 63% /
tmpfs 7.9G 4.0K 7.9G 1% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 7.9G 0 7.9G 0% /sys/fs/cgroup
/dev/loop0 56M 56M 0 100% /snap/core18/2344
/dev/loop2 62M 62M 0 100% /snap/core20/1434
/dev/loop1 56M 56M 0 100% /snap/core18/2409
mergerfs 5.4T 4.6T 510G 91% /mnt/storage
/dev/loop3 68M 68M 0 100% /snap/lxd/22753
/dev/loop6 44M 44M 0 100% /snap/snapd/15177
/dev/loop7 62M 62M 0 100% /snap/core20/1405
/dev/loop5 45M 45M 0 100% /snap/snapd/15534
/dev/loop4 68M 68M 0 100% /snap/lxd/22526
/dev/sdd1 1.8T 1.6T 196G 89% /mnt/sdb1
/dev/sdb1 1.8T 1.6T 117G 94% /mnt/sdd1
/dev/sdc1 1.8T 1.6T 198G 89% /mnt/sdc1
tmpfs 1.6G 0 1.6G 0% /run/user/1000
可以看到系统分区的容量 /dev/sda2
并没有扩展。
然后检查一下分区,执行 sudo lsblk
❯ sudo lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 55.5M 1 loop /snap/core18/2344
loop1 7:1 0 55.5M 1 loop /snap/core18/2409
loop2 7:2 0 61.9M 1 loop /snap/core20/1434
loop3 7:3 0 67.8M 1 loop /snap/lxd/22753
loop4 7:4 0 67.9M 1 loop /snap/lxd/22526
loop5 7:5 0 44.7M 1 loop /snap/snapd/15534
loop6 7:6 0 43.6M 1 loop /snap/snapd/15177
loop7 7:7 0 61.9M 1 loop /snap/core20/1405
sda 8:0 0 128G 0 disk
├─sda1 8:1 0 1M 0 part
└─sda2 8:2 0 64G 0 part /
可以看到系统的分区 sda2 确实是没有完全占用全部的磁盘(sda)。这个时候我们只需要扩展一下系统分区即可。
我们可以使用很多种方式扩展分区,这里我们就使用 growpart
命令。
在 Debian 和 Ubuntu 下 growpart
命令在 cloud-guest-utils 包中。
sudo growpart /dev/sda 2
结果:
❯ sudo growpart /dev/sda 2
CHANGED: partition=2 start=4096 old: size=134211584 end=134215680 new: size=268431327 end=268435423
然后执行:
sudo resize2fs /dev/sda2
执行结果:
❯ sudo resize2fs /dev/sda2
resize2fs 1.45.5 (07-Jan-2020)
Filesystem at /dev/sda2 is mounted on /; on-line resizing required
old_desc_blocks = 8, new_desc_blocks = 16
The filesystem on /dev/sda2 is now 33553915 (4k) blocks long.
之后在查询 df -h
就看到空间完美的被使用了。
Lux 是一个使用 Go 语言编写的视频下载命令行工具,支持的平台很多,提供了包括 macOS、Windows、Linux 等等平台的命令行支持,安装和使用非常简单的。Lux 原来的名字是叫做 Annie(安妮),对标的是 macOS 上一款非常著名的视频下载软件叫做 Downie(唐尼)。但后来改名成了 Lux。
Lux 支持非常多的视频网站:抖音、哔哩哔哩、半次元、pixivision、优酷、YouTube、爱奇艺、芒果TV、Tumblr、Vimeo、Facebook、斗鱼视频、秒拍、新浪微博、Instagram、Twitter、腾讯视频、网易云音乐、音悦台
项目地址:https://github.com/iawia002/lux
macOS 下:
brew install ffmpeg
brew install lux
或者从 Release 页面下载,手动安装。
curl "https://github.com/iawia002/lux/releases/download/v0.14.0/lux_0.14.0_macOS_64-bit.tar.gz"
sudo apt install ffmpeg
wget "https://github.com/iawia002/lux/releases/download/v0.14.0/lux_0.14.0_Linux_64-bit.tar.gz"
tar zxvf lux_0.14.0_Linux_64-bit.tar.gz
sudo mv lux /usr/local/bin
lux --help
Lux 的使用很简单,在终端:
lux "https://www.youtube.com/watch?v=QJXPS0gQ6Eg"
lux "https://www.bilibili.com/video/BV1ZJ411h713"
视频链接给的是播放列表里的第二个视频。如果用youtube-dl下载会自作主张地下载播放列表的第一个视频。在对付B站播放列表方面,Annie比较乖一点。
Annie不仅可以下载视频,如果给的是图片的网址,它就下载图片。
给播放列表的链接就下载播放列表:
首先使用 -i
参数查看可供下载的视频分辨率,-i
参数可以一次添加多个视频链接,空格分隔。
❯ lux -i "https://www.bilibili.com/video/BV1ZJ411h713"
Site: 哔哩哔哩 bilibili.com
Title: 【中字】金世正 talk演唱会 全场 非常治愈的谈话
Type: video
Streams: # All available quality
[64-7] -------------------
Quality: 高清 720P avc1.640028
Size: 122.36 MiB (128300684 Bytes)
# download with: lux -f 64-7 ...
[32-12] -------------------
Quality: 清晰 480P hev1.1.6.L120.90
Size: 108.75 MiB (114028043 Bytes)
# download with: lux -f 32-12 ...
[64-12] -------------------
Quality: 高清 720P hev1.1.6.L120.90
Size: 108.57 MiB (113847391 Bytes)
# download with: lux -f 64-12 ...
[16-7] -------------------
Quality: 流畅 360P avc1.64001E
Size: 86.10 MiB (90287066 Bytes)
# download with: lux -f 16-7 ...
[32-7] -------------------
Quality: 清晰 480P avc1.64001F
Size: 67.43 MiB (70708693 Bytes)
# download with: lux -f 32-7 ...
[16-12] -------------------
Quality: 流畅 360P hev1.1.6.L120.90
Size: 67.40 MiB (70670783 Bytes)
# download with: lux -f 16-12 ...
然后使用 -f
来指定要下载的分辨率:
lux -f 64-7 https://www.bilibili.com/video/BV1ZJ411h713
使用 -p
来下载视频列表。
如果要指定列表中的位置,可以使用如下几个选项:
-start
从视频列表的第几个开始下-end
下载到几个-items
指定要下载哪几个,比如 1,5,6,8-10-eto
B站独有的参数,用于没有标题只有文件名的播放列表可以使用 -F
参数,从包含视频 URL 的文本文件中下载视频:
lux -F /path/to/links.txt
这里也可以用参数-start、-end和-items。
按住ctrl+c可以中断下载,可以续传。
B站上可以用av和ep加数字下载视频,比如:
annie -i ep198381 av21877586
还有三个参数也很有用:
可以使用 -o
参数后面接路径,来指定将视频保存到该路径下:
lux -o ~/Videos/ URL
使用 -O NAME
来指定输出的名字。
可以使用 -j
输出 JSON 格式结果。
Squoosh 是 Google 推出的一个图片压缩工具。之前整理macOS 初始化设置 的时候就说过,基本上算是必不可少的一个压缩工具了。
如果要大批量压缩图片,之前也介绍过 jpegoptim 和 optipng。
如果要实现更加高阶的图片操作,比如 resize, blur, crop, despeckle, dither, drow on, flip, join, re-sample 等等,也可以了解一下 [[ImageMagick]]。
但使用 Squoosh 的过程中有一点不方便的就是 Google 只提供了在线版,之前也在 issue 中提过,官方回复是本来这个工具就是命令行的一个在线化,没有必要再搞一个离线的版本。
但最近发现 GitHub 上有人做出了一个离线版本的 Squoosh。
离线版本的 Squoosh 基于 Electron,并使用了 GoogleChromeLabs 之前开源的在线版。
在使用 LinuxServer 的 Docker 镜像的时候经常会需要设置 umask 值,这个值的具体作用一直不太清楚,正好整理一下。
在 Linux 或 Unix 操作系统中,所有的新文件都有默认权限的。umask
命令行允许用户设置文件的 creation mask, 这决定了新创建的文件或目录的权限。
这个配置会被 mkdir
, touch
, tee
等等一些命令。
在深入了解 umask 之前,首先再来解释一下 Linux 的权限模型。在 Linux 中,每一个文件都三个类别用户组:
每一个类别都有三个权限:
这使用用户可以决定哪些用户允许读、写、执行这个文件。
使用 ls -l dirname
来查看:
drwxr-xr-x 12 einverne users 4.0K Apr 8 20:51 dirname
|[-][-][-] [------] [---]
| | | | | |
| | | | | +-----------> Group
| | | | +-------------------> Owner
| | | +----------------------------> Others Permissions
| | +-------------------------------> Group Permissions
| +----------------------------------> Owner Permissions
+------------------------------------> File Type
第一个字幕表示文件的类型:
d
表示目录-
文件l
symbolic link之后的九位,每三位一组:
权限有两种表示方法:
字母 rwx
分别表示读(read),写(write),执行(execute),而 -
表示没有权限。
权限还可以使用数字来表示,r 可以使用 4 来表示, w 是 2,x 是 1。
比如 rwxr-xr-x
使用数字表示则是 755.
再回到 umask,在 Linux 系统中,默认的创建文件权限是 666,默认给 user, group, others 读和写的权限。目录的权限是 777。
umask
可以用来查看或改变新文件或目录的权限。umask
只会影响当前 shell 环境。在大部分的 Linux 发行版中,默认的系统级别的 umask value 一般在 pam_umask.so
或者 /etc/profile
中。
直接执行 umask
来查看输出,在我本机输出是 002
。
umask
值包含了新创建的文件或目录不拥有的权限。
上面提到过,默认的新文件的权限是 666
,如果 umask 值是 002
则,新创建的文件权限就是 666-002
结果是 664
。
用户也可以使用 umask -S
来查看 symbolic notation:
❯ umask -S
u=rwx,g=rwx,o=rx
在 /etc/profile
中可以设置 umask 值。比如不想要其他用户有任何权限,umask 就要设置为 027.
umask 027
Mailcow 是一个可以使用 Docker 容器化部署的邮件服务器。
GitHub: https://github.com/mailcow/mailcow-dockerized
Mailcow 相较于 Mailu 整体比较完整,功能相对比较丰富。
Mailcow 整体的搭建过程比较简单,如果之前搭建过 Mailu,实际上,参考官网的教程,并没有太多需要再强调的,甚至如果在同一台机器上,从 Mailu 上迁移过来,只需要修改 [[DKIM]] 记录即可。
提前的 DNS 设置可以参考官网。
安装:
git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
然后执行:
./generate_config.sh
交互命令中输入自己的 MAILCOW_HOSTNAME
,比如 mail.example.com
。
然后启动:
docker-compose pull
docker-compose up -d
然后使用配置好的域名 mail.example.com
登录,用户名 admin
密码 moohoo
。
编辑 mailcow.conf
然后配置 HTTP_BIND=
编辑 data/conf/nginx/redirect.conf
:
server {
root /web;
listen 80 default_server;
listen [::]:80 default_server;
include /etc/nginx/conf.d/server_name.active;
if ( $request_uri ~* "%0A|%0D" ) { return 403; }
location ^~ /.well-known/acme-challenge/ {
allow all;
default_type "text/plain";
}
location / {
return 301 https://$host$uri$is_args$args;
}
}
重启:
docker-compose up -d
docker-compose restart nginx-mailcow
进入后台之后,在 Configuration->Mailboxes 添加域名。
几个端口:
Service | Encryption | Port |
---|---|---|
IMAP | STARTTLS | 143 |
IMAPS | SSL | 993 |
POP3 | STARTTLS | 110 |
POP3S | SSL | 995 |
SMTP | STARTTLS | 587 |
SMTPS | SSL | 465 |
今天在 GitHub 上看到一个 repo,在其根目录中包含了一个 .husky
的文件夹,好奇之下就去搜索了以,于是发现了 husky 这个项目,这是一个使用 JavaScript 实现的用来管理 Git hooks 的工具。
GitHub: https://github.com/typicode/husky
首先要先了解一下 Git hooks,对于 git 已经是现代开发中必不可少的一个工具了,大家应该都比较熟悉,但是可能很多人在项目中并没有使用过 Git 的 hooks。
Git 的 hooks 允许用户在特定的时机执行用户自定义的脚本。
比如非常常见的,在提交之后自动对代码内容进行一些常规检查,如果失败则不允许提交等等。常用的 hook 有 pre-commit
, commit-msg
,pre-push
等。
Git hooks 是基于事件的,Scott Chacon 在 Pro Git 书中将 hooks 分成几个类型:
hook 列表:
hook 名称 | 触发命令 | 描述 | 参数个数描述 |
---|---|---|---|
applypatch-msg |
git am |
编辑 commit 时提交的 message,通常用于验证或纠正提交的信息以符合项目标准 | 包含预备提交信息的文件名 |
pre-applypath |
git am |
变更 commit 之前,如果以非 0 退出,会导致 uncommit 状态,用于 commit 之前的检查 | |
pre-applypath |
git am |
commit 完成提交之后,主要用于通知 | |
pre-commit |
git commit |
获取 commit message 之前,非 0 退出会取消本次 commit,检查 commit 自身,而不是 commit message | |
prepare-commit-msg |
git commit |
接收默认 commit message 之后,启动 commit message 编辑器之前。 | |
commit-msg |
git commit |
message 提交之后修改 message 的内容或退回不合格的 commit | |
post-commit |
git commit |
commit 完成之后调用,主要用于通知 | |
pre-rebase |
git rebase |
执行 rebase 时,可用于中断不想要的 rebase | |
post-checkout |
git checkout 和 git clone |
更新工作树后调用 checkout 时,或执行 git clone 后,主要用于验证环境、显示变更、配置环境 | |
post-merge |
git merge or git pull |
合并之后调用 | |
pre-push |
git push |
推送远程之前 | |
pre-receive |
远程 repo 进行 git-receive-pack |
远程 repo 更新刚被 push 的 ref 之前调用,非 0 会中断本次 | |
update |
远程 repo 进行 git-receive-pack |
远程 repo 每一次 ref 被 push 的时候调用 | |
post-receive |
远程 repo 进行 git-receive-pack |
远程 repo 所有的 ref 更新之后 | |
post-update |
git-receive-pack |
所有 ref 被 push 后执行一次 | |
pre-auto-gc |
git gc --auto |
用于在自动清理 repo 之前做一些检查 | |
post-rewrite |
git commit --amend 或 git rebase |
git 命令重写 rewrite 已经被 commit 的数据时调用 |
在 .git
这个隐藏的文件目录下,有一个 hooks/
文件夹,下面通常会有一些 sample 文件。如果要使其生效,去掉后缀 sample 即可
目录下的每一个文件都是可执行的文件,脚本通过文件名调用,内容的第一行必须有 Shebang #!
,引用正确的脚本解析器,比如 bash, perl, python, nodejs 等。Git hooks 使用的脚本语言是没有限制的。
比如在 pre-commit
中执行代码检查:
#!/bin/sh
npm run lint
# 获取上面脚本的退出码
exitCode="$?"
exit $exitCode
通过上面的简单了解也可能看到本地的 git hook
是保存在本地的 .git
文件夹中的,本地的 git hook
是不会被提交到版本控制中的。这就存在了一个问题,便是如何在项目中管理 Git hooks,这个时候就需要 Husky 登场了。
目前已经有非常多的项目在使用 husky
了,包括:
Husky 的原理就是在项目的根目录中使用一个配置文件,然后在安装 Husky 的时候把配置文件和 Git hook 关联起来,在团队之间共享。
安装:
npm install husky --save-dev
在项目中安装:
npx husky install
使用 Husky 之前确保安装了 npm
。
npm install husky -D
Husky 支持如下几种格式配置:
以 .huskyrc
为例:
{
"hooks": {
"pre-commit": "git restore -W -S dist examples/dist && eslint ."
}
}
这一个例子就是每次执行 git commit
之前把 dist
和 examples/dist
中的修改撤掉,不提交到仓库中,然后执行 EsLint。
Husky 做了两件事情:
~/.husky
目录husky install
时设置 ~/.husky
目录为 git hooks
目录。使用 husky add
:
npx husky add .husky/commit-msg 'npx --no-install commitlint --edit "$1"'
npm uninstall husky
// 删除.husky文件夹,并且重置core.hooksPath
rm -rf .husky && git config --unset core.hooksPath
Husky 不支持服务端 hooks。
包括 pre-receive
、update
、post-receive
。
如果想跳过所有的 hooks,可以使用:
HUSKY_SKIP_HOOKS=1 git rebase ...
在 git 2.9 中引入了 core.hooksPath
配置,可以手动配置 git hooks
所在的目录。这也就使得我们可以在另外的目录中创建 Git hooks,然后手动设置 Hooks 目录来实现 hooks 脚本的同步。
tail 命令是一个日常查看日志非常常用的命令,用来在终端显示文件的最后部分内容。
tail 不加任何参数的情况下,默认显示文件最后 10 行内容。
tail /path/to/file.log
通常业务系统中以文件形式记录日志时会一直追加到文件末尾,可以使用 -f
来显示新追加的内容:
tail -f /path/to/file.log
tail -100 mail.log
tail -n 100 mail.log
tail -n +20 mail.log
tail -c 10 mail.log
在本地开发调试的时候使用了 Laravel 提供的 Sail 依赖本地的 Docker 环境,Sail 提供了 Nginx,MySQL,Redis,等等容器,还提供了一个用于测试的 SMTP mailhog,但是生产环境可以使用更加稳定的组件。
Laravel 应用需要一些基础的系统依赖,需要确保Web 服务器有如下的最低要求:
Web 服务器就用 Nginx。
记住 Web 服务器所有的请求都会先到 public/index.php
文件,千万不要将此文件放到项目的根目录,或者 Web 服务器的根目录,如果 Web 服务器可以访问项目根目录会造成带有敏感信息的配置文件泄漏。
server {
listen 80;
server_name example.com;
root /srv/example.com/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
这里使用 [[aapanel]] 来新建一个站点。
然后将代码 push 到 GitHub,然后到机器上 push 来下。
cp .env.example .env
根据自己的配置,修改数据库、Redis、SMTP 相关的配置。
执行:
sudo composer install
注意将站点的所有者修改为 www
:
sudo chown -R www:www .
然后执行:
sudo php artisan key:generate
sudo php artisan migrate
禁用 php 方法:
proc_open
symlink
pcntl_signal
pcntl_alarm
安装 Composer:
wget https://getcomposer.org/download/1.8.0/composer.phar
mv composer.phar /usr/local/bin/composer
chmod u+x /usr/local/bin/composer
composer -V
自动加载优化:
composer install --optimize-autoloader --no-dev
优化配置加载,将配置文件压缩到一个缓存中
php artisan config:cache
优化路由加载:
php artisan route:cache
优化视图加载
php artisan view:cache
如果遇到如下问题:
PHP Fatal error: Uncaught Error: Call to undefined function Composer\XdebugHandler\putenv() in phar:///usr/local/bin/composer/vendor/composer/xdebug-handler/src/Process.php:101
Stack trace:
#0 phar:///usr/local/bin/composer/vendor/composer/xdebug-handler/src/Status.php(59): Composer\XdebugHandler\Process::setEnv()
#1 phar:///usr/local/bin/composer/vendor/composer/xdebug-handler/src/XdebugHandler.php(99): Composer\XdebugHandler\Status->__construct()
#2 phar:///usr/local/bin/composer/bin/composer(18): Composer\XdebugHandler\XdebugHandler->__construct()
#3 /usr/local/bin/composer(29): require('...')
#4 {main}
thrown in phar:///usr/local/bin/composer/vendor/composer/xdebug-handler/src/Process.php on line 101
Fatal error: Uncaught Error: Call to undefined function Composer\XdebugHandler\putenv() in phar:///usr/local/bin/composer/vendor/composer/xdebug-handler/src/Process.php:101
Stack trace:
#0 phar:///usr/local/bin/composer/vendor/composer/xdebug-handler/src/Status.php(59): Composer\XdebugHandler\Process::setEnv()
#1 phar:///usr/local/bin/composer/vendor/composer/xdebug-handler/src/XdebugHandler.php(99): Composer\XdebugHandler\Status->__construct()
#2 phar:///usr/local/bin/composer/bin/composer(18): Composer\XdebugHandler\XdebugHandler->__construct()
#3 /usr/local/bin/composer(29): require('...')
#4 {main}
thrown in phar:///usr/local/bin/composer/vendor/composer/xdebug-handler/src/Process.php on line 101
需要禁用 php 的 putenv
方法。
通过 Laravel 的样例项目也应该能看到 Laravel 对本地化多语言的支持代码了。
观察一下项目的目录结构就能猜出来语言文件在 resources/lang
中。目录结构需要按照 ISO 15897 标准来命令,简体中文 zh_CN
/resources
/lang
/en
messages.php
/es
messages.php
可以看到所有的语言文件都是返回一个 key-value 结构。
Laravel 还可以定义 JSON 文件,存放在 resources/lang
下,如果是中文则是 resources/lang/zh_CN.json
文件:
{
"welcome": "欢迎来到 EV 的 Blog"
}
在 config/app.php
中可以配置网站语言。
可以使用 __
辅助函数来从语言文件中获取翻译。
echo __('welcome')
在 Blade 模板引擎中,可以直接在 `` 中使用:
如果翻译字符不存在,则直接返回字符串。
如果翻译字符串中有需要变动的变量,可以使用 :
来将其定义为占位符:
'welcome' => 'Welcome, :name',
然后在获取的时候传入一个数组用于替换:
echo __('welcome', ['name' => 'laravel']);