Merge pull request #118 from Creeper553/main

Added Simplified Chinese translation, and fixed several text display problems
This commit is contained in:
Lucas Dower 2023-04-10 19:41:16 +01:00 committed by GitHub
commit 9748c0d672
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 177 additions and 6 deletions

View File

@ -2,6 +2,7 @@ import { DeepPartial } from '../src/util/type_util';
import { en_GB } from './en_GB'; import { en_GB } from './en_GB';
import { en_US } from './en_US'; import { en_US } from './en_US';
import { ru_RU } from './ru_RU'; import { ru_RU } from './ru_RU';
import { zh_CN } from './zh_CN';
export type TTranslationMap = typeof en_GB.translations; export type TTranslationMap = typeof en_GB.translations;
@ -15,4 +16,5 @@ export const locales = [
en_GB, en_GB,
en_US, en_US,
ru_RU, ru_RU,
zh_CN,
]; ];

View File

@ -48,6 +48,10 @@ export const en_GB = {
components: { components: {
'no_materials_loaded': 'No materials loaded', 'no_materials_loaded': 'No materials loaded',
'material_type': 'Type', 'material_type': 'Type',
'solid': 'Solid',
'textured': 'Textured',
'no_image_loaded' : 'No image loaded',
'choose': 'Choose',
'texture_filtering': 'Filtering', 'texture_filtering': 'Filtering',
'texture_wrap': 'Wrap', 'texture_wrap': 'Wrap',
'transparency': 'Transparency', 'transparency': 'Transparency',

163
loc/zh_CN.ts Normal file
View File

@ -0,0 +1,163 @@
// Credits:
// KatMelon
export const zh_CN = {
display_name: '简体中文',
language_code: 'zh_CN',
translations: {
something_went_wrong: '发生了意料之外的错误',
init: {
initialising: '正在初始化...',
ready: '完毕',
},
settings: {
heading: '设置',
components: {
language: '语言',
},
changing_language: '正在更换语言...',
changed_language: '已更换语言',
},
import: {
heading: '1. 导入',
button: '加载网格模型',
importing_mesh: '正在导入网格模型...',
imported_mesh: '已导入网格模型',
rendering_mesh: '正在渲染网格模型...',
rendered_mesh: '已渲染网格模型',
no_vertices_loaded: '未加载任何顶点',
no_triangles_loaded: '未加载任何三角面',
could_not_scale_mesh: '无法正确缩放网格模型 - 此模型似乎为 2D 平面,请旋转此模型,使其竖直高度不为零',
invalid_encoding: '发现无法识别的字符,请使用 UTF-8 编码',
invalid_face_data: '网格面数据与顶点数量不匹配: {{count, number}}',
too_many_triangles: '导入的网格模型拥有 {{count, number}} 个三角面,请考虑使用 Blender 等建模软件进行简化',
vertex_triangle_count: '{{vertex_count, number}} 个顶点,{{triangle_count, number}} 个三角面',
missing_normals: '部分顶点未定义法线,可能导致体素错误对齐',
failed_to_parse_line: '尝试解析 "{{line}}" 失败,原因: "{{error}}"',
gltf_experimental: '导入 GLTF 目前为实验性功能,可能产生预料外的结果',
components: {
input: '3D 模型(.obj, .gltf/.glb',
rotation: '旋转',
},
},
materials: {
heading: '2. 材质',
button: '更新材质',
updating_materials: '正在更新材质...',
updated_materials: '已更新材质',
components: {
'no_materials_loaded': '未加载任何材质',
'material_type': '类型',
'solid': '纯色',
'textured': '纹理',
'no_image_loaded' : '未加载图像',
'choose': '选择',
'texture_filtering': '纹理过滤',
'texture_wrap': '纹理环绕',
'transparency': '透明度',
'diffuse_map': '漫反射贴图',
'alpha': '不透明度',
'alpha_map': '使用不透明度映射图',
'alpha_channel': '不透明度通道',
'linear': '线性',
'nearest': '最近',
'clamp': '拉伸',
'repeat': '重复',
'none': '无',
'alpha_constant': '使用不透明度常量',
'diffuse_map_alpha_channel': '使用漫反射贴图的不透明度通道',
},
},
voxelise: {
heading: '3. 体素化',
button: '体素化网格模型',
loading_voxel_mesh: '正在加载体素模型...',
loaded_voxel_mesh: '已加载体素模型',
rendering_voxel_mesh: '正在渲染体素模型...',
rendered_voxel_mesh: '已渲染体素模型',
voxel_count: '{{count, number}} 个体素',
voxel_mesh_dimensions: '大小为 {{x, number}} x {{y, number}} x {{z, number}} 体素',
components: {
constraint_axis: '约束轴向',
size: '尺寸',
algorithm: '算法',
ambient_occlusion: '环境光遮蔽',
multisampling: '多重采样',
voxel_overlap: '体素重叠',
colour: '颜色',
x_axis: 'X (宽度)(红色轴)',
y_axis: 'Y (高度)(绿色轴)',
z_axis: 'Z (深度)(蓝色轴)',
ray_based: '基于射线',
bvh_ray: '基于 BVH 射线',
ncrb: 'NCRB',
average_recommended: '均值(推荐)',
first: '首个',
on_recommended: '启用(推荐)',
off_faster: '禁用(速度更快)',
},
},
assign: {
heading: '3. 绑定',
button: '绑定方块',
loading_block_mesh: '正在加载方块模型...',
loaded_block_mesh: '已加载方块模型',
rendering_block_mesh: '正在渲染方块模型...',
rendered_block_mesh: '已渲染方块模型',
deselected_blocks: '未选择 {{count, number}} 种方块',
selected_blocks: '已选择 {{count, number}} 种方块',
found_blocks: '已找到 {{count, number}} 种方块',
block_not_namespaced: '"{{block_name}}" 未正确使用命名空间,是不是指 "minecraft:{{block_name}}"',
could_not_use_block: '无法使用 "{{block_name}}",因为其不受支持',
reading_palette: '正在读取 {{file_name}}...',
block_palette_missing_light_blocks: '方块色板中不包含可供放置的发光方块',
blocks_missing_textures: '{{count, number}} 种色板中的方块缺失纹理,将不会被使用',
falling_blocks: '{{count, number}} 个方块将在结构放置时因重力而下落',
components: {
texture_atlas: '纹理包',
block_palette: '方块色板',
dithering: '混色抖动',
dithering_magnitude: '抖动程度',
fallable_blocks: '可掉落方块',
colour_accuracy: '颜色精准度',
smart_averaging: '智能平均',
smoothness: '平滑度',
calculate_lighting: '计算光照',
light_threshold: '光照阈值',
vanilla: '原版',
ordered: '有序',
random: '随机',
off: '禁用',
replace_falling: '使用固态方块替换将要掉落的方块',
replace_fallable: '使用固态方块替换可以掉落的方块',
do_nothing: '不替换',
search: '搜索...',
},
},
export: {
heading: '5. 导出',
button: '导出建筑结构',
exporting_structure: '正在导出结构...',
exported_structure: '已导出结构',
schematic_unsupported_blocks: '{{count, number}} 个方块({{unique, number}} 种)不受 .schematic 文件格式支持,将使用石头方块代替。尝试使用支持 .schematic 格式的色板,或使用 .litematica 格式导出',
nbt_exporter_too_big: '结构方块仅支持 48x48x48 大小的区域,此范围外的方块将会被移除',
components: {
exporter: '导出为',
litematic: 'Litematic (.litematic)',
schematic: 'Schematic (.schematic)',
sponge_schematic: 'Sponge Schematic (.schem)',
structure_blocks: '结构方块 (.nbt)',
indexed_json: '有索引的 JSON (.json)',
uncompressed_json: '未压缩的 JSON (.json)',
},
},
misc: {
red: '红',
green: '绿',
blue: '蓝',
alpha: '不透明度',
on: '启用',
off: '禁用',
},
},
};

View File

@ -2,6 +2,7 @@ import { TImageRawWrap } from '../../texture';
import { getRandomID } from '../../util'; import { getRandomID } from '../../util';
import { ASSERT } from '../../util/error_util'; import { ASSERT } from '../../util/error_util';
import { UIUtil } from '../../util/ui_util'; import { UIUtil } from '../../util/ui_util';
import { LOC } from '../../localiser';
import { AppIcons } from '../icons'; import { AppIcons } from '../icons';
import { ConfigComponent } from './config'; import { ConfigComponent } from './config';
import { ToolbarItemComponent } from './toolbar_item'; import { ToolbarItemComponent } from './toolbar_item';
@ -15,7 +16,7 @@ export class ImageComponent extends ConfigComponent<Promise<TImageRawWrap>, HTML
super(Promise.resolve(param ?? { raw: '', filetype: 'png' })); super(Promise.resolve(param ?? { raw: '', filetype: 'png' }));
this._switchElement = new ToolbarItemComponent({ id: 'sw', iconSVG: AppIcons.UPLOAD }) this._switchElement = new ToolbarItemComponent({ id: 'sw', iconSVG: AppIcons.UPLOAD })
.setLabel('Choose') .setLabel(LOC('materials.components.choose'))
.onClick(() => { .onClick(() => {
const inputElement = UIUtil.getElementById(this._getId() + '-input') as HTMLInputElement; const inputElement = UIUtil.getElementById(this._getId() + '-input') as HTMLInputElement;
inputElement.click(); inputElement.click();
@ -32,7 +33,7 @@ export class ImageComponent extends ConfigComponent<Promise<TImageRawWrap>, HTML
<div id="${this._imageId}-placeholder" class="texture-preview-placeholder"> <div id="${this._imageId}-placeholder" class="texture-preview-placeholder">
<div class="row-container" style="align-items: center;"> <div class="row-container" style="align-items: center;">
<div class="row-item">${AppIcons.IMAGE_MISSING}</div> <div class="row-item">${AppIcons.IMAGE_MISSING}</div>
<div class="row-item">No image loaded</div> <div class="row-item">${LOC('materials.components.no_image_loaded')}</div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,5 +1,6 @@
import { MaterialType, SolidMaterial, TexturedMaterial } from '../../mesh'; import { MaterialType, SolidMaterial, TexturedMaterial } from '../../mesh';
import { AppIcons } from '../icons'; import { AppIcons } from '../icons';
import { LOC } from '../../localiser';
import { ConfigComponent } from './config'; import { ConfigComponent } from './config';
import { ToolbarItemComponent } from './toolbar_item'; import { ToolbarItemComponent } from './toolbar_item';
@ -13,7 +14,7 @@ export class MaterialTypeComponent extends ConfigComponent<MaterialType, HTMLDiv
this._material = material; this._material = material;
this._solidButton = new ToolbarItemComponent({ id: 'sw1', iconSVG: AppIcons.COLOUR_SWATCH }) this._solidButton = new ToolbarItemComponent({ id: 'sw1', iconSVG: AppIcons.COLOUR_SWATCH })
.setLabel('Solid') .setLabel(LOC('materials.components.solid'))
.setGrow() .setGrow()
.onClick(() => { .onClick(() => {
if (this._material.type === MaterialType.textured) { if (this._material.type === MaterialType.textured) {
@ -22,7 +23,7 @@ export class MaterialTypeComponent extends ConfigComponent<MaterialType, HTMLDiv
}); });
this._texturedButton = new ToolbarItemComponent({ id: 'sw2', iconSVG: AppIcons.IMAGE }) this._texturedButton = new ToolbarItemComponent({ id: 'sw2', iconSVG: AppIcons.IMAGE })
.setLabel('Textured') .setLabel(LOC('materials.components.textured'))
.setGrow() .setGrow()
.onClick(() => { .onClick(() => {
if (this._material.type === MaterialType.solid) { if (this._material.type === MaterialType.solid) {

View File

@ -229,7 +229,7 @@ export class UI {
payload: 'replace-falling', payload: 'replace-falling',
}, },
{ {
displayLocKey: 'assign.components.fallable_blocks', displayLocKey: 'assign.components.replace_fallable',
payload: 'replace-fallable', payload: 'replace-fallable',
}, },
{ {
@ -321,7 +321,7 @@ export class UI {
payload: 'schem', payload: 'schem',
}, },
{ {
displayLocKey: 'export.exported_structure', displayLocKey: 'export.components.structure_blocks',
payload: 'nbt', payload: 'nbt',
}, },
{ {