Headless CMS Cockpit と NuxtJSを使用したウェブサイトを作っているのですが、Cockpitに日本語のファイルをアップロードすると、ファイル名のダブルバイトの部分が削除されて半角英数のファイル名に化けてしまいました。
Cockpitのソースコードを読んでみたところ、ファイル名はphpのbasename関数で抽出していることが分かりました。PHPの公式サイトを確認すると、basename関数はsetlocaleで挙動が変わるとのこと。なるほど、以下のようにsetlocateを追加してやれば良いということですな。
setlocale(LC_ALL, 'ja_JP.UTF-8');
実行時に Cockpitの設定ファイル「config.php」がincludeされるので、このファイルの先頭にsetlocaleを追加すれば、ソースファイルを触ることなく対処できそうです。
で、config.phpを書き替えて、コンテナを起動し直してみたところ、あらら…、ファイル名の不具合は解消しません。なんでだよ、むむむ…。
しばし考えて、もしやとCockpitのコンテナに入って、ロケールを確認してみると…
# locale -a
C
POSIX
なるほど、「ja_JP.UTF-8」が入ってません。これが原因ですね。
そんなわけで、公式イメージにロケールを追加したDockerfileを書いてみました。
ARG COCKPIT_VERSION=0.9.2
FROM agentejo/cockpit:${COCKPIT_VERSION}
RUN apt-get install -y locales \
&& echo "ja_JP UTF-8" >> /etc/locale.gen \
&& locale-gen
COPY config.php /var/www/html/config/config.php
COPY ja.php /var/www/html/config/cockpit/i18n/ja.php
RUN echo "\n\nphp_value post_max_size 1024M" >> /var/www/html/.htaccess \
&& echo "\nphp_value upload_max_filesize 1024M" >> /var/www/html/.htaccess
せっかくなので、カスタマイズしたconfigファイルと、管理画面の日本語表示用のファイルを読み込んで、さらにアップロード可能なファイルサイズの上限を1GBにアップしてます。
ちなみに、Cockpitの日本語化の方法は公式サイトにやり方が書いてあるので、説明する必要はないかも知れませんが、一応説明しますと、このリポジトリから必要な言語ファイルを持ってきて、「 /config/cockpit/i18n 」ディレクトリに配置してやればOKです。管理画面でアカウント毎に言語を設定できるようになります。
で、「config.php」の先頭にsetlocaleを追加してと。
<?php
setlocale(LC_ALL, 'ja_JP.UTF-8'); // ← 追加する!
$configs = [];
if (!empty(getenv('COCKPIT_SESSION_NAME'))){
$configs['session.name'] = getenv('COCKPIT_SESSION_NAME');
}
if (!empty(getenv('COCKPIT_SALT'))){
$configs['sec-key'] = getenv('COCKPIT_SALT');
}
…
…
Dockerイメージをbuildして起動すれば、バッチリ日本語ファイルが使えるようになりました!\(^o^)/
ホームページの制作(デザイン・コーディング・プログラミング)に加え、ネットショップの販売促進に関するアドバイスも致します。 20年以上に渡って実際にネットショップを運営した経験を生かし、聞きかじりではない実績を伴ったノウハウを、自分の言葉でお伝えいたします。 プログラミングの経験は30年以上。HTML、CSS、JavaScript、TypeScript、Vue、NuxtJS、Node.js、MySQL、MongoDB、Elasticsearch、WordPress、PHP、Docker、Electronなど、幅広く対応します。
コメント