diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php
index c9c3d683..8b572e65 100644
--- a/app/Http/Controllers/AdminController.php
+++ b/app/Http/Controllers/AdminController.php
@@ -89,13 +89,12 @@ class AdminController extends Controller
$signIn = Option::form('sign_in', OptionForm::AUTO_DETECT, function($form)
{
$form->group('sign_score')
- ->text('sign_score_from')->addon(trans('options.sign_score.addon1'))
- ->text('sign_score_to')->addon(trans('options.sign_score.addon2'));
+ ->text('sign_score_from')->addon(trans('options.sign_in.sign_score.addon1'))
+ ->text('sign_score_to')->addon(trans('options.sign_in.sign_score.addon2'));
- $form->group('sign_gap_time')->text('sign_gap_time')->addon(OptionForm::AUTO_DETECT);
+ $form->group('sign_gap_time')->text('sign_gap_time')->addon();
- $form->checkbox('sign_after_zero')->label(OptionForm::AUTO_DETECT)
- ->hint(OptionForm::AUTO_DETECT);
+ $form->checkbox('sign_after_zero')->label()->hint();
})->handle(function() {
$sign_score = $_POST['sign_score_from'].','.$_POST['sign_score_to'];
Option::set('sign_score', $sign_score);
@@ -116,27 +115,27 @@ class AdminController extends Controller
{
$form->text('site_name');
$form->text('site_description');
- $form->text('site_url')->hint(OptionForm::AUTO_DETECT);
+ $form->text('site_url')->hint();
- $form->checkbox('user_can_register')->label(OptionForm::AUTO_DETECT);
+ $form->checkbox('user_can_register')->label();
$form->text('regs_per_ip');
$form->group('max_upload_file_size')
->text('max_upload_file_size')->addon('KB')
- ->hint(trans('options.max_upload_file_size.hint', ['size' => ini_get('upload_max_filesize')]));
+ ->hint(trans('options.general.max_upload_file_size.hint', ['size' => ini_get('upload_max_filesize')]));
- $form->checkbox('allow_chinese_playername')->label(OptionForm::AUTO_DETECT);
+ $form->checkbox('allow_chinese_playername')->label();
$form->select('api_type')
->option('0', 'CustomSkinLoader API')
->option('1', 'UniversalSkinAPI');
- $form->checkbox('auto_del_invalid_texture')->label(OptionForm::AUTO_DETECT)->hint(OptionForm::AUTO_DETECT);
+ $form->checkbox('auto_del_invalid_texture')->label()->hint();
- $form->textarea('comment_script')->rows(6)->description(OptionForm::AUTO_DETECT);
+ $form->textarea('comment_script')->rows(6)->description();
- $form->checkbox('allow_sending_statistic')->label(OptionForm::AUTO_DETECT)->hint(OptionForm::AUTO_DETECT);
+ $form->checkbox('allow_sending_statistics')->label()->hint();
})->handle(function() {
if (substr($_POST['site_url'], -1) == "/")
@@ -145,21 +144,21 @@ class AdminController extends Controller
$announ = Option::form('announ', OptionForm::AUTO_DETECT, function($form)
{
- $form->textarea('announcement')->description(OptionForm::AUTO_DETECT);
+ $form->textarea('announcement')->rows(10)->description();
})->renderWithOutTable()->handle();
- $cache = Option::form('cache', OptionForm::AUTO_DETECT, function($form)
+ $resources = Option::form('resources', OptionForm::AUTO_DETECT, function($form)
{
- $form->checkbox('force_ssl')->label(OptionForm::AUTO_DETECT)->hint(OptionForm::AUTO_DETECT);
- $form->checkbox('auto_detect_asset_url')->label(OptionForm::AUTO_DETECT)->description(OptionForm::AUTO_DETECT);
- $form->checkbox('return_200_when_notfound')->label(OptionForm::AUTO_DETECT);
+ $form->checkbox('force_ssl')->label()->hint();
+ $form->checkbox('auto_detect_asset_url')->label()->description();
+ $form->checkbox('return_200_when_notfound')->label()->description();
$form->text('cache_expire_time')->hint(OptionForm::AUTO_DETECT);
})->type('warning')->hint(OptionForm::AUTO_DETECT)->handle();
- return view('admin.options')->with('forms', compact('general', 'cache', 'announ'));
+ return view('admin.options')->with('forms', compact('general', 'resources', 'announ'));
}
/**
diff --git a/app/Services/OptionForm.php b/app/Services/OptionForm.php
index 893b7823..d1a57d0d 100644
--- a/app/Services/OptionForm.php
+++ b/app/Services/OptionForm.php
@@ -67,13 +67,15 @@ class OptionForm
throw new BadMethodCallException("Method [$method] does not exist on option form.");
}
+ // assign name for option item
if (!isset($params[1]) || Arr::get($params, 1) == OptionForm::AUTO_DETECT) {
- $params[1] = Arr::get(trans("options.$params[0]"), 'title', trans("options.$params[0]"));
+ $params[1] = Arr::get(trans("options.$this->id.$params[0]"), 'title', trans("options.$this->id.$params[0]"));
}
$class = new ReflectionClass('App\Services\OptionForm'.Str::title($method));
// use ReflectionClass to create a new OptionFormItem instance
$item = $class->newInstanceArgs($params);
+ $item->setParentId($this->id);
$this->items[] = $item;
return $item;
@@ -98,7 +100,7 @@ class OptionForm
* @param array $info
* @return $this
*/
- public function hint($hintContent)
+ public function hint($hintContent = self::AUTO_DETECT)
{
if ($hintContent == self::AUTO_DETECT) {
$hintContent = trans("options.$this->id.hint");
@@ -384,12 +386,21 @@ class OptionFormItem
public $description;
+ protected $parentId;
+
public function __construct($id, $name = null)
{
$this->id = $id;
$this->name = $name;
}
+ public function setParentId($id)
+ {
+ $this->parentId = $id;
+
+ return $this;
+ }
+
public function value($value)
{
$this->value = $value;
@@ -397,10 +408,10 @@ class OptionFormItem
return $this;
}
- public function hint($hintContent)
+ public function hint($hintContent = OptionForm::AUTO_DETECT)
{
if ($hintContent == OptionForm::AUTO_DETECT) {
- $hintContent = trans("options.$this->id.hint");
+ $hintContent = trans("options.$this->parentId.$this->id.hint");
}
$this->hint = view('vendor.option-form.hint')->with('hint', $hintContent)->render();
@@ -415,10 +426,10 @@ class OptionFormItem
return $this;
}
- public function description($description)
+ public function description($description = OptionForm::AUTO_DETECT)
{
if ($description == OptionForm::AUTO_DETECT) {
- $description = trans("options.$this->id.description");
+ $description = trans("options.$this->parentId.$this->id.description");
}
$this->description = $description;
@@ -454,10 +465,10 @@ class OptionFormCheckbox extends OptionFormItem
{
protected $label;
- public function label($label)
+ public function label($label = OptionForm::AUTO_DETECT)
{
if ($label == OptionForm::AUTO_DETECT) {
- $label = trans("options.$this->id.label");
+ $label = trans("options.$this->parentId.$this->id.label");
}
$this->label = $label;
@@ -531,10 +542,10 @@ class OptionFormGroup extends OptionFormItem
return $this;
}
- public function addon($value)
+ public function addon($value = OptionForm::AUTO_DETECT)
{
if ($value == OptionForm::AUTO_DETECT) {
- $value = trans("options.$this->id.addon");
+ $value = trans("options.$this->parentId.$this->id.addon");
}
$this->items[] = ['type' => 'addon', 'id' => null, 'value' => $value];
diff --git a/config/options.php b/config/options.php
index 28545da4..78303ab1 100644
--- a/config/options.php
+++ b/config/options.php
@@ -3,7 +3,7 @@
* @Author: printempw
* @Date: 2016-07-29 11:53:11
* @Last Modified by: printempw
- * @Last Modified time: 2017-01-14 22:05:22
+ * @Last Modified time: 2017-01-17 21:47:29
*/
return [
@@ -20,7 +20,7 @@ return [
'custom_js' => '',
'allow_chinese_playername' => 'true',
'comment_script' => '',
- 'allow_sending_statistic' => 'true',
+ 'allow_sending_statistics' => 'true',
'user_initial_score' => '1000',
'sign_gap_time' => '24',
'sign_score' => '10,100',
diff --git a/resources/lang/en/options.yml b/resources/lang/en/options.yml
index d553956e..a94c10c2 100644
--- a/resources/lang/en/options.yml
+++ b/resources/lang/en/options.yml
@@ -2,120 +2,129 @@ option-saved: Option Saved.
homepage:
title: Homepage
-home_pic_url:
- title: Picture URL at Homepage
- hint: Path relative to homepage or full URL.
-favicon_url:
- title: Website Icon
- hint: Path relative to resources/assets/ or full URL.
- description: The given image must have same width and height.
-copyright_prefer:
- title: Program Copyright
- description: Any evil modification applied on the footer program copyright (including deleting, modifying author, changing link target) with out permission is FORBIDDEN. The author reserves the right to pursue relevant responsibilities.
-copyright_text:
- title: Custom Copyright Text
- description: Placeholders are available in custom copyright text. e.g. {site_name} & {site_url}
+
+ home_pic_url:
+ title: Picture URL at Homepage
+ hint: Path relative to homepage or full URL.
+ favicon_url:
+ title: Website Icon
+ hint: Path relative to resources/assets/ or full URL.
+ description: The given image must have same width and height.
+ copyright_prefer:
+ title: Program Copyright
+ description: Any evil modification applied on the footer program copyright (including deleting, modifying author, changing link target) with out permission is FORBIDDEN. The author reserves the right to pursue relevant responsibilities.
+ copyright_text:
+ title: Custom Copyright Text
+ description: Placeholders are available in custom copyright text. e.g. {site_name} & {site_url}
customJsCss:
title: Custom CSS/JavaScript
message: |
The contents will be attached to <style> and <script> tags.
- Here are some useful examples: Examples of Custom CSS JavaScript @GitHub WiKi
-custom_css: CSS
-custom_js: JavaScript
+
+ custom_css: CSS
+ custom_js: JavaScript
rate:
title: About Scores
-score_per_storage:
- title: Storage
- addon: scores = 1 KB
-private_score_per_storage:
- title: Private Storage
- addon: scores = 1 KB
- hint: Uploading private textures will cost more scores.
-score_per_closet_item:
- title: Favorites
- addon: score = 1 closet item
-return_score:
- title: Score Return
- label: Return scores back to user after deleting players/textures/closet items.
-score_per_player:
- title: Players
- addon: scores = 1 player
-user_initial_score: User Initial Score
+
+ score_per_storage:
+ title: Storage
+ addon: scores = 1 KB
+ private_score_per_storage:
+ title: Private Storage
+ addon: scores = 1 KB
+ hint: Uploading private textures will cost more scores.
+ score_per_closet_item:
+ title: Favorites
+ addon: score = 1 closet item
+ return_score:
+ title: Score Return
+ label: Return scores back to user after deleting players/textures/closet items.
+ score_per_player:
+ title: Players
+ addon: scores = 1 player
+ user_initial_score: User Initial Score
sign_in:
title: Signing In
-sign_score:
- title: Score Granted
- addon1: scores ~
- addon2: scores
-sign_gap_time:
- title: Gap Time
- addon: hours
-sign_after_zero:
- title: Time
- label: Can sign in after 0 everyday
- hint: The above option will be ignored if this is checked.
+
+ sign_score:
+ title: Score Granted
+ addon1: scores ~
+ addon2: scores
+ sign_gap_time:
+ title: Gap Time
+ addon: hours
+ sign_after_zero:
+ title: Time
+ label: Users can sign in after 0 everyday.
+ hint: The above option will be ignored if this is checked.
general:
title: General Options
-site_name: Site Name
-site_description: Site Description
-site_url:
- title: Site URL
- hint: Begin with http(s)://, nerver ends with slash
-user_can_register:
- title: Open Registration
- label: Everyone is allowed to register
-regs_per_ip: Max accounts of one IP
-max_upload_file_size:
- title: Max Upload Size
- hint: "Limit of PHP in php.ini: :size"
-allow_chinese_playername:
- title: Player Name
- label: Allow chinese player names
-api_type: Prefered JSON API
-auto_del_invalid_texture:
- title: Invalid Textures
- label: Delete invalid textures from skinlib automatically.
- hint: Delete textures records whose file no longer exists automatically.
-comment_script:
- title: Comment Script
- description: Placeholders are available in comment scripts. {tid} will be replaced with texture id, {name} will be replaced with texture name, {url} will be replaced with current URL.
-allow_sending_statistic:
- title: Statistics
- label: Send usage statistics anonymously.
- hint: Information about privacy will nerver be sent.
+
+ site_name: Site Name
+ site_description: Site Description
+ site_url:
+ title: Site URL
+ hint: Begin with http(s)://, nerver ends with slash
+ user_can_register:
+ title: Open Registration
+ label: Everyone is allowed to register.
+ regs_per_ip: Max accounts of one IP
+ max_upload_file_size:
+ title: Max Upload Size
+ hint: "Limit of PHP in php.ini: :size"
+ allow_chinese_playername:
+ title: Player Name
+ label: Allow chinese player names.
+ api_type: Prefered JSON API
+ auto_del_invalid_texture:
+ title: Invalid Textures
+ label: Delete invalid textures automatically.
+ hint: Delete textures records whose file no longer exists from skinlib.
+ comment_script:
+ title: Comment Script
+ description: Placeholders are available in comment scripts. {tid} will be replaced with texture id, {name} will be replaced with texture name, {url} will be replaced with current URL.
+ allow_sending_statistics:
+ title: Statistics
+ label: Send usage statistics anonymously.
+ hint: Information about privacy will nerver be sent.
announ:
- title: Site Announcement
-announcement:
- description: Styling with Markdown is supported.
+ title: Announcement
-cache:
+ announcement:
+ description: Styling with Markdown is supported.
+
+resources:
title: Resource Files
hint: Please adjust these options when CDN cache is on
-force_ssl:
- title: Force SSL
- label: Force to use HTTPS protocol to load resources
- hint: Check SSL available before turning on
-auto_detect_asset_url:
- title: Assets URL
- label: Determine assets url automatically
- description: Load asset files according to current URL. The site url will be used if this is not enabled. Please unable this if requests don't go through CDN.
-return_200_when_notfound:
- title: HTTP Response Code
- label: Return 200 instead of 404 when requesting un-existent player
-cache_expire_time:
- title: Cache Exipre Time
- hint: In seconds, 86400 = one day, 31536000 = one year
+
+ force_ssl:
+ title: Force SSL
+ label: Use HTTPS protocol to load resources forcely.
+ hint: Check SSL available before turning on
+ auto_detect_asset_url:
+ title: Assets URL
+ label: Determine assets url automatically.
+ description: Load asset files according to current URL. The site url will be used if this is not enabled. Please unable this if requests don't go through CDN.
+ return_200_when_notfound:
+ title: HTTP Response Code
+ label: Return 200 instead of 404 when requesting un-existent player.
+ description: If your CDN doesn't cache 404 pages, please turn this on. A flood of requests to un-existent players will greatly slow down the site.
+ cache_expire_time:
+ title: Cache Exipre Time
+ hint: In seconds, 86400 = one day, 31536000 = one year
update:
title: Check Update
-check_update:
- title: Check Update
- label: Check update automatically and notify me.
-update_source:
- title: Update Source
- description: 'Available update source list can be found at: @GitHub Wiki'
+
+ check_update:
+ title: Check Update
+ label: Check update automatically and notify me.
+ update_source:
+ title: Update Source
+ description: 'Available update source list can be found at: @GitHub Wiki'
diff --git a/resources/lang/zh_CN/options.yml b/resources/lang/zh_CN/options.yml
index 98567972..b64b6ab9 100644
--- a/resources/lang/zh_CN/options.yml
+++ b/resources/lang/zh_CN/options.yml
@@ -2,120 +2,129 @@ option-saved: 设置已保存。
homepage:
title: 首页配置
-home_pic_url:
- title: 首页图片地址
- hint: 相对于首页的路径或者完整的 URL
-favicon_url:
- title: 网站图标
- hint: 相对 resources/assets/ 的路径或者完整的 URL
- description: 所使用的图像必须具有相同的宽度和高度
-copyright_prefer:
- title: 程序版权信息
- description: 对于任何恶意修改页面右下角的版权信息(包括不限于删除、修改作者信息、修改链接指向)的用户,作者保留对其追究责任的权力。
-copyright_text:
- title: 自定义版权文字
- description: 自定义版权文字内可使用占位符,{site_name} 将会被自动替换为站点名称,{site_url} 会被替换为站点地址。
+
+ home_pic_url:
+ title: 首页图片地址
+ hint: 相对于首页的路径或者完整的 URL
+ favicon_url:
+ title: 网站图标
+ hint: 相对 resources/assets/ 的路径或者完整的 URL
+ description: 所使用的图像必须具有相同的宽度和高度
+ copyright_prefer:
+ title: 程序版权信息
+ description: 对于任何恶意修改页面右下角的版权信息(包括不限于删除、修改作者信息、修改链接指向)的用户,作者保留对其追究责任的权力。
+ copyright_text:
+ title: 自定义版权文字
+ description: 自定义版权文字内可使用占位符,{site_name} 将会被自动替换为站点名称,{site_url} 会被替换为站点地址。
customJsCss:
title: 自定义 CSS/JavaScript
message: |
内容将会被追加至每个页面的 <style> 和 <script> 标签中。
- 这里有一些有用的示例:「自定义 CSS JavaScript」功能的一些实例@GitHub WiKi
-custom_css: CSS
-custom_js: JavaScript
+
+ custom_css: CSS
+ custom_js: JavaScript
rate:
title: 积分换算
-score_per_storage:
- title: 存储
- addon: 积分 = 1 KB
-private_score_per_storage:
- title: 私密材质存储
- addon: 积分 = 1 KB
- hint: 上传私密材质将消耗更多积分
-score_per_closet_item:
- title: 收藏消耗积分
- addon: 积分 = 一个衣柜物品
-return_score:
- title: 积分返还
- label: 用户删除角色/材质/收藏时返还积分
-score_per_player:
- title: 角色
- addon: 积分 = 一个角色
-user_initial_score: 新用户默认积分
+
+ score_per_storage:
+ title: 存储
+ addon: 积分 = 1 KB
+ private_score_per_storage:
+ title: 私密材质存储
+ addon: 积分 = 1 KB
+ hint: 上传私密材质将消耗更多积分
+ score_per_closet_item:
+ title: 收藏消耗积分
+ addon: 积分 = 一个衣柜物品
+ return_score:
+ title: 积分返还
+ label: 用户删除角色/材质/收藏时返还积分
+ score_per_player:
+ title: 角色
+ addon: 积分 = 一个角色
+ user_initial_score: 新用户默认积分
sign_in:
title: 签到配置
-sign_score:
- title: 签到获得积分
- addon1: 积分 ~
- addon2: 积分
-sign_gap_time:
- title: 签到间隔时间
- addon: 小时
-sign_after_zero:
- title: 签到时间
- label: 每天零点后可签到
- hint: 勾选后将无视上一条,每天零时后均可签到
+
+ sign_score:
+ title: 签到获得积分
+ addon1: 积分 ~
+ addon2: 积分
+ sign_gap_time:
+ title: 签到间隔时间
+ addon: 小时
+ sign_after_zero:
+ title: 签到时间
+ label: 每天零点后可签到
+ hint: 勾选后将无视上一条,每天零时后均可签到
general:
title: 常规选项
-site_name: 站点标题
-site_description: 站点描述
-site_url:
- title: 站点地址(URL)
- hint: 以 http(s):// 开头,不要以 / 结尾
-user_can_register:
- title: 开放注册
- label: 任何人都可以注册
-regs_per_ip: 每个 IP 限制注册数
-max_upload_file_size:
- title: 最大允许上传大小
- hint: PHP 限制::size,定义在 php.ini 中。
-allow_chinese_playername:
- title: 角色名
- label: 允许中文角色名
-api_type: 首选 JSON API
-auto_del_invalid_texture:
- title: 失效材质
- label: 自动删除失效材质
- hint: 自动从皮肤库中删除文件不存在的材质记录
-comment_script:
- title: 评论代码
- description: 评论代码内可使用占位符,{tid} 将会被自动替换为材质的 id,{name} 会被替换为材质名称,{url} 会被替换为当前页面地址。
-allow_sending_statistic:
- title: 统计信息
- label: 发送程序使用情况统计信息以帮助开发
- hint: 隐私信息不会被收集
+
+ site_name: 站点标题
+ site_description: 站点描述
+ site_url:
+ title: 站点地址(URL)
+ hint: 以 http(s):// 开头,不要以 / 结尾
+ user_can_register:
+ title: 开放注册
+ label: 任何人都可以注册
+ regs_per_ip: 每个 IP 限制注册数
+ max_upload_file_size:
+ title: 最大允许上传大小
+ hint: PHP 限制::size,定义在 php.ini 中。
+ allow_chinese_playername:
+ title: 角色名
+ label: 允许中文角色名
+ api_type: 首选 JSON API
+ auto_del_invalid_texture:
+ title: 失效材质
+ label: 自动删除失效材质
+ hint: 自动从皮肤库中删除文件不存在的材质记录
+ comment_script:
+ title: 评论代码
+ description: 评论代码内可使用占位符,{tid} 将会被自动替换为材质的 id,{name} 会被替换为材质名称,{url} 会被替换为当前页面地址。
+ allow_sending_statistics:
+ title: 统计信息
+ label: 发送程序使用情况统计信息以帮助开发
+ hint: 隐私信息不会被收集
announ:
title: 站点公告
-announcement:
- description: 可使用 Markdown 进行排版
-cache:
+ announcement:
+ description: 可使用 Markdown 进行排版
+
+resources:
title: 资源文件配置
hint: 如果启用了 CDN 缓存请适当修改这些配置
-force_ssl:
- title: 强制 SSL
- label: 强制使用 HTTPS 协议加载资源
- hint: 请确认 SSL 可用后再开启
-auto_detect_asset_url:
- title: 资源地址
- label: 自动判断资源文件地址
- description: 根据当前 URL 自动加载资源文件,如果关闭则将根据「站点地址」填写的内容加载。如果出现 CDN 回源问题请关闭
-return_200_when_notfound:
- title: HTTP 响应码
- label: 请求不存在的角色时返回 200 而不是 404
-cache_expire_time:
- title: 缓存失效时间
- hint: 秒数,86400 = 一天,31536000 = 一年
+
+ force_ssl:
+ title: 强制 SSL
+ label: 强制使用 HTTPS 协议加载资源
+ hint: 请确认 SSL 可用后再开启
+ auto_detect_asset_url:
+ title: 资源地址
+ label: 自动判断资源文件地址
+ description: 根据当前 URL 自动加载资源文件,如果关闭则将根据「站点地址」填写的内容加载。如果出现 CDN 回源问题请关闭
+ return_200_when_notfound:
+ title: HTTP 响应码
+ label: 请求不存在的角色时返回 200 而不是 404
+ description: 如果你的 CDN 不缓存 404 页面,请打开此项。否则大量对不存在角色的 Profile 请求会加重站点负载。
+ cache_expire_time:
+ title: 缓存失效时间
+ hint: 秒数,86400 = 一天,31536000 = 一年
update:
title: 更新选项
-check_update:
- title: 检查更新
- label: 自动检查更新并提示
-update_source:
- title: 更新源
- description: 可用的更新源列表可以在这里查看:@GitHub Wiki
+
+ check_update:
+ title: 检查更新
+ label: 自动检查更新并提示
+ update_source:
+ title: 更新源
+ description: 可用的更新源列表可以在这里查看:@GitHub Wiki
diff --git a/resources/views/admin/options.tpl b/resources/views/admin/options.tpl
index 9a7b645b..4570efea 100644
--- a/resources/views/admin/options.tpl
+++ b/resources/views/admin/options.tpl
@@ -25,7 +25,7 @@