diff --git a/css/dialogs.css b/css/dialogs.css
index 65b0ee87..6e307f46 100644
--- a/css/dialogs.css
+++ b/css/dialogs.css
@@ -276,7 +276,7 @@
}
#keybindlist {
max-height: 600px;
- margin-bottom: 20px;
+ padding-bottom: 25px;
overflow-y: scroll;
}
#keybindlist > li {
@@ -643,6 +643,9 @@
#uv_dialog h2.dialog_handle.entity_mode_only {
margin: 0;
}
+ #uv_dialog_all .UVEditor .uv_transform_info {
+ top: 30px;
+ }
/*Action Control*/
#action_selector {
diff --git a/css/general.css b/css/general.css
index cf4a98bb..abe4d12d 100644
--- a/css/general.css
+++ b/css/general.css
@@ -170,13 +170,18 @@
z-index: 101;
min-width: 100px;
max-width: 200px;
- background-color: var(--color-ui);
- color: var(--color-light);
+ background-color: var(--color-bright_ui);
+ color: var(--color-text_acc);
box-shadow: 0 0 2px black;
text-align: center;
cursor: default;
top: 40px;
- left: 60px;
+ right: 0px;
+ left: 0px;
+ pointer-events: none;
+ }
+ #uv_dialog_all .uv_message_box {
+ top: 60px;
}
.selection_rectangle {
position: absolute;
@@ -488,8 +493,10 @@
padding: 24px;
max-height: 600px;
}
- #start_screen section right {
+ #start_screen section right > ul {
+ max-height: 465px;
overflow-y: auto;
+ padding-right: 5px;
}
#start_screen left {
flex-grow: 0;
diff --git a/index.html b/index.html
index 4e9b1ecc..6c90b52c 100644
--- a/index.html
+++ b/index.html
@@ -581,7 +581,7 @@
Spectrum,
gif.js,
JSZip,
- LZ-UTF8
+ LZ-UTF8,
Marked
@@ -854,10 +854,7 @@
{{ texture.name }}
{{ texture.error
? texture.getErrorMessage()
- : (Format.single_texture
- ? (texture.width + ' x ' + texture.height + 'px')
- : (texture.ratio == 1? texture.width + 'px': (texture.width + 'px, ' + texture.frameCount+'f'))
- )
+ : texture.width + ' x ' + texture.height + 'px'
}}
diff --git a/js/animations.js b/js/animations.js
index 9c153b18..aa05f16a 100644
--- a/js/animations.js
+++ b/js/animations.js
@@ -611,10 +611,8 @@ class Keyframe {
}
extend(data) {
Merge.number(this, data, 'time')
- cl('0' , data)
if (this.transform) {
- cl('1' , this)
if (data.values != undefined) {
if (typeof data.values == 'number' || typeof data.values == 'string') {
data.x = data.y = data.z = data.values;
@@ -632,7 +630,6 @@ class Keyframe {
Merge.string(this, data, 'w')
Merge.boolean(this, data, 'isQuaternion')
} else {
- cl('2' , data)
if (data.values) {
data.effect = data.values.effect;
data.locator = data.values.locator;
@@ -784,7 +781,7 @@ class Keyframe {
if (kf.channel != scope.channel) select_tool = false;
})
this.selected = true
- updateKeyframeSelection()
+ TickUpdates.keyframe_selection = true;
if (select_tool) {
switch (this.channel) {
case 'rotation': BarItems.rotate_tool.select(); break;
@@ -960,6 +957,76 @@ function findBedrockAnimation() {
}
}
+Clipbench.setKeyframes = function() {
+
+ var keyframes = Timeline.selected;
+
+ Clipbench.keyframes = []
+ if (!keyframes || keyframes.length === 0) {
+ return;
+ }
+ var first = keyframes[0];
+ var single_animator;
+ keyframes.forEach(function(kf) {
+ if (kf.time < first.time) {
+ first = kf
+ }
+ if (single_animator && single_animator !== kf.animator.uuid) {
+ single_animator = false;
+ } else if (single_animator == undefined) {
+ single_animator = kf.animator.uuid;
+ }
+ })
+
+ keyframes.forEach(function(kf) {
+ var copy = kf.getUndoCopy();
+ copy.time_offset = kf.time - first.time;
+ if (single_animator != false) {
+ delete copy.animator;
+ }
+ Clipbench.keyframes.push(copy)
+ })
+ if (isApp) {
+ clipboard.writeHTML(JSON.stringify({type: 'keyframes', content: Clipbench.keyframes}))
+ }
+}
+Clipbench.pasteKeyframes = function() {
+ if (isApp) {
+ var raw = clipboard.readHTML()
+ try {
+ var data = JSON.parse(raw)
+ if (data.type === 'keyframes' && data.content) {
+ Clipbench.keyframes = data.content
+ }
+ } catch (err) {}
+ }
+ if (Clipbench.keyframes && Clipbench.keyframes.length) {
+
+ if (!Animator.selected) return;
+ var keyframes = [];
+ Undo.initEdit({keyframes});
+ Clipbench.keyframes.forEach(function(data, i) {
+
+ if (data.animator) {
+ var animator = Animator.selected.animators[data.animator];
+ if (animator && !Timeline.animators.includes(animator)) {
+ animator.select();
+ }
+ } else {
+ var animator = Timeline.selected_animator;
+ }
+ if (animator) {
+ var kf = animator.createKeyframe(data, Timeline.time + data.time_offset, data.channel)
+ keyframes.push(kf);
+ kf.select(i ? {ctrlOrCmd: true} : null)
+ }
+
+ })
+ Animator.preview()
+ Undo.finishEdit('paste keyframes');
+ }
+}
+
const Animator = {
possible_channels: {rotation: true, position: true, scale: true, sound: true, particle: true},
open: false,
@@ -1553,7 +1620,7 @@ const Timeline = {
}
kf.selected = false
})
- updateKeyframeSelection()
+ TickUpdates.keyframe_selection = true;
},
start() {
if (!Animator.selected) return;
@@ -1716,12 +1783,16 @@ BARS.defineActions(function() {
if (m_index > 3) {
path = path.substr(0, m_index) + osfs + 'animations' + osfs + pathToName(ModelMeta.export_path, true)
}
- path.replace(/\.geo\./, 'animation')
+ if (path.match(/\.geo\.json$/)) {
+ path = path.replace(/\.geo\.json$/, '.animation.json')
+ } else {
+ path = path.replace(/\.json$/, '.animation.json')
+ }
}
Blockbench.export({
type: 'JSON Animation',
extensions: ['json'],
- name: Project.geometry_name||'animation',
+ name: (Project.geometry_name||'model')+'.animation',
startpath: path,
content: content,
}, (real_path) => {
diff --git a/js/api.js b/js/api.js
index b366f46b..b9c9f059 100644
--- a/js/api.js
+++ b/js/api.js
@@ -164,7 +164,8 @@ const Blockbench = {
jq_dialog.addClass('draggable')
jq_dialog.draggable({
- handle: ".dialog_handle"
+ handle: ".dialog_handle",
+ containment: '#page_wrapper'
})
var x = ($(window).width()-540)/2
jq_dialog.css('left', x+'px')
@@ -250,6 +251,7 @@ const Blockbench = {
currentwindow,
{
title: options.title ? options.title : '',
+ dontAddToRecent: true,
filters: [{
name: options.type ? options.type : options.extensions[0],
extensions: options.extensions
@@ -423,6 +425,7 @@ const Blockbench = {
}
} else {
ElecDialogs.showSaveDialog(currentwindow, {
+ dontAddToRecent: true,
filters: [ {
name: options.type,
extensions: options.extensions
diff --git a/js/blockbench.js b/js/blockbench.js
index 7ab032ae..aa7ff9cc 100644
--- a/js/blockbench.js
+++ b/js/blockbench.js
@@ -52,6 +52,13 @@ const mouse_pos = {x:0,y:0}
const sort_collator = new Intl.Collator(undefined, {numeric: true, sensitivity: 'base'});
$.ajaxSetup({ cache: false });
+(function() {
+ var last_welcome = localStorage.getItem('welcomed_version');
+ if (!last_welcome || last_welcome.replace(/.\d+$/, '') != appVersion.replace(/.\d+$/, '')) {
+ Blockbench.addFlag('after_update');
+ }
+ localStorage.setItem('welcomed_version', appVersion);
+})();
function initializeApp() {
@@ -81,11 +88,6 @@ function initializeApp() {
} else {
$('.web_only').remove()
}
- var last_welcome = localStorage.getItem('welcomed_version');
- if (!last_welcome || last_welcome.replace(/.\d+$/, '') != appVersion.replace(/.\d+$/, '')) {
- Blockbench.addFlag('after_update')
- localStorage.setItem('welcomed_version', appVersion)
- }
BARS.setupActions()
BARS.setupToolbars()
BARS.setupVue()
@@ -524,6 +526,10 @@ const TickUpdates = {
delete TickUpdates.keyframes;
Vue.nextTick(Timeline.update)
}
+ if (TickUpdates.keyframe_selection) {
+ delete TickUpdates.keyframe_selection;
+ Vue.nextTick(updateKeyframeSelection)
+ }
}
}
const Clipbench = {
@@ -542,7 +548,7 @@ const Clipbench = {
} else if (Animator.open) {
if (Timeline.selected.length) {
- Clipbench.setKeyframes(Timeline.selected)
+ Clipbench.setKeyframes()
if (cut) {
BarItems.delete.trigger()
}
@@ -577,44 +583,11 @@ const Clipbench = {
} else if (display_mode) {
DisplayMode.paste()
} else if (Animator.open) {
- //
- if (isApp) {
- var raw = clipboard.readHTML()
- try {
- var data = JSON.parse(raw)
- if (data.type === 'keyframes' && data.content) {
- Clipbench.keyframes = data.content
- }
- } catch (err) {}
- }
- if (Clipbench.keyframes && Clipbench.keyframes.length) {
-
- if (!Animator.selected) return;
- var animator = Timeline.selected_animator
- if (animator) {
- var keyframes = [];
- Undo.initEdit({keyframes});
- Clipbench.keyframes.forEach(function(data, i) {
-
- var kf = animator.createKeyframe(data, Timeline.time + data.time_offset, data.channel)
- keyframes.push(kf);
- kf.select(i ? {ctrlOrCmd: true} : null)
- })
- Animator.preview()
- Undo.finishEdit('paste keyframes');
- }
- }
+ Clipbench.pasteKeyframes()
} else if (p == 'uv' || p == 'preview') {
main_uv.paste(event)
} else if (p == 'textures' && isApp) {
- var img = clipboard.readImage()
- if (img) {
- var dataUrl = img.toDataURL()
- var texture = new Texture({name: 'pasted', folder: 'block' }).fromDataURL(dataUrl).fillParticle().add(true)
- setTimeout(function() {
- texture.openMenu()
- },40)
- }
+ Clipbench.pasteTextures();
} else if (p == 'outliner') {
Undo.initEdit({outliner: true, elements: [], selection: true});
@@ -669,17 +642,6 @@ const Clipbench = {
Undo.finishEdit('paste', {outliner: true, elements: selected, selection: true});
}
},
- setTexture(texture) {
- //Sets the raw image of the texture
- if (!isApp) return;
-
- if (texture.mode === 'bitmap') {
- var img = nativeImage.createFromDataURL(texture.source)
- } else {
- var img = nativeImage.createFromPath(texture.source.split('?')[0])
- }
- clipboard.writeImage(img)
- },
setGroup(group) {
if (!group) {
Clipbench.group = undefined
@@ -702,27 +664,6 @@ const Clipbench = {
clipboard.writeHTML(JSON.stringify({type: 'elements', content: Clipbench.elements}))
}
},
- setKeyframes(keyframes) {
- Clipbench.keyframes = []
- if (!keyframes || keyframes.length === 0) {
- return;
- }
- var first = keyframes[0];
- keyframes.forEach(function(kf) {
- if (kf.time < first.time) {
- first = kf
- }
- })
- keyframes.forEach(function(kf) {
- var copy = kf.getUndoCopy();
- copy.time_offset = kf.time - first.time;
- delete copy.animator;
- Clipbench.keyframes.push(copy)
- })
- if (isApp) {
- clipboard.writeHTML(JSON.stringify({type: 'keyframes', content: Clipbench.keyframes}))
- }
- },
setText(text) {
if (isApp) {
clipboard.writeText(text)
diff --git a/js/desktop.js b/js/desktop.js
index ee1f583b..5543a58d 100644
--- a/js/desktop.js
+++ b/js/desktop.js
@@ -119,6 +119,7 @@ function addRecentProject(data) {
icon: data.icon,
day: new Date().dayOfYear()
})
+ app.addRecentDocument(data.path)
if (recent_projects.length > Math.clamp(settings.recent_projects.value, 0, 256)) {
recent_projects.pop()
}
diff --git a/js/display_mode.js b/js/display_mode.js
index 811ade7a..a946d1a3 100644
--- a/js/display_mode.js
+++ b/js/display_mode.js
@@ -1760,7 +1760,7 @@ window.changeDisplaySkin = function() {
settings.display_skin.value = 'username:'+text
updateDisplaySkin()
})
- } else {
+ } else if (result < buttons.length-1) {
settings.display_skin.value = false
updateDisplaySkin()
}
diff --git a/js/interface/actions.js b/js/interface/actions.js
index 3cf56f58..e3306948 100644
--- a/js/interface/actions.js
+++ b/js/interface/actions.js
@@ -1351,7 +1351,7 @@ const BARS = {
//
Toolbars = {}
var stored = localStorage.getItem('toolbars')
- if (stored && localStorage.getItem('welcomed_version') == appVersion) {
+ if (stored && !Blockbench.hasFlag('after_update')) {
stored = JSON.parse(stored)
if (typeof stored === 'object') {
BARS.stored = stored
diff --git a/js/interface/dialog.js b/js/interface/dialog.js
index 6956dd5b..aa94b57e 100644
--- a/js/interface/dialog.js
+++ b/js/interface/dialog.js
@@ -202,7 +202,8 @@ function Dialog(settings) {
if (this.draggable !== false) {
jq_dialog.addClass('draggable')
jq_dialog.draggable({
- handle: ".dialog_handle"
+ handle: ".dialog_handle",
+ containment: '#page_wrapper'
})
var x = Math.clamp(($(window).width()-540)/2, 0, 2000)
jq_dialog.css('left', x+'px')
diff --git a/js/interface/interface.js b/js/interface/interface.js
index 1c57d891..0b58f904 100644
--- a/js/interface/interface.js
+++ b/js/interface/interface.js
@@ -115,7 +115,7 @@ class ResizeLine {
this.node = jq.get(0)
jq.draggable({
axis: this.horizontal ? 'y' : 'y',
- containment: 'document',
+ containment: '#page_wrapper',
revert: true,
start: function(e, u) {
scope.before = data.get()
@@ -721,7 +721,7 @@ function showDialog(dialog) {
if (obj.hasClass('draggable')) {
obj.draggable({
handle: ".dialog_handle",
- containment: 'body'
+ containment: '#page_wrapper'
})
var x = ($(window).width()-obj.outerWidth()) / 2;
var top = ($(window).height() - obj.outerHeight()) / 2;
diff --git a/js/io/bbmodel.js b/js/io/bbmodel.js
index 52d0a4e2..87972ab0 100644
--- a/js/io/bbmodel.js
+++ b/js/io/bbmodel.js
@@ -36,11 +36,9 @@ var codec = new Codec('project', {
model.parent = Project.parent;
model.ambientocclusion = Project.ambientocclusion
}
- if (Project.box_uv) {
- model.resolution = {
- width: Project.texture_width || 16,
- height: Project.texture_height || 16,
- }
+ model.resolution = {
+ width: Project.texture_width || 16,
+ height: Project.texture_height || 16,
}
if (options.flag) {
model.flag = options.flag;
diff --git a/js/io/bedrock.js b/js/io/bedrock.js
index 2637f007..4b214970 100644
--- a/js/io/bedrock.js
+++ b/js/io/bedrock.js
@@ -56,6 +56,7 @@ function findEntityTexture(mob, return_path) {
'tropicalfish_b': 'fish/tropical_b',
'panda': 'panda/panda',
'fishing_hook': 'fishhook',
+ 'ravager': 'illager/ravager',
}
mob = mob.split(':')[0].replace(/^geometry\./, '')
var path = textures[mob]
diff --git a/js/io/io.js b/js/io/io.js
index e71c18e5..69e72e2b 100644
--- a/js/io/io.js
+++ b/js/io/io.js
@@ -74,6 +74,9 @@ class ModelFormat {
}
var center = Format.bone_rig ? 8 : 0;
previews.forEach(preview => {
+ if (preview.isOrtho) {
+ preview.setOrthographicCamera(preview.angle);
+ }
preview.camOrtho.position.y += center - preview.controls.target.y;
preview.controls.target.set(0, center, 0);
})
@@ -251,11 +254,11 @@ class Codec {
export() {
var scope = this;
Blockbench.export({
- type: this.name,
- extensions: [this.extension],
- name: this.fileName(),
- startpath: this.startPath(),
- content: this.compile(),
+ type: scope.name,
+ extensions: [scope.extension],
+ name: scope.fileName(),
+ startpath: scope.startPath(),
+ content: scope.compile(),
custom_writer: isApp ? (a, b) => scope.write(a, b) : null,
}, path => scope.afterDownload(path))
}
diff --git a/js/io/modded_entity.js b/js/io/modded_entity.js
index ce501757..161adb2c 100644
--- a/js/io/modded_entity.js
+++ b/js/io/modded_entity.js
@@ -209,7 +209,20 @@ var codec = new Codec('modded_entity', {
}
}
})
+ },
+ export() {
+ var scope = this;
+ Blockbench.showMessageBox({translateKey: 'no_format_import'}, function() {
+ Blockbench.export({
+ type: scope.name,
+ extensions: [scope.extension],
+ name: scope.fileName(),
+ startpath: scope.startPath(),
+ content: scope.compile(),
+ custom_writer: isApp ? (a, b) => scope.write(a, b) : null,
+ }, path => scope.afterDownload(path))
+ })
}
})
diff --git a/js/io/optifine_jpm.js b/js/io/optifine_jpm.js
index bc107811..c68665df 100644
--- a/js/io/optifine_jpm.js
+++ b/js/io/optifine_jpm.js
@@ -77,6 +77,7 @@ var part_codec = new Codec('optifine_part', {
parse(model, path, add) {
Project.box_uv = false;
var new_cubes = [];
+ var box_uv_changed = false;
var import_group = add ? new Group({
name: pathToName(path)
}).init() : 'root';
@@ -118,7 +119,7 @@ var part_codec = new Codec('optifine_part', {
-submodel.rotate[1],
submodel.rotate[2],
]
- base_cube = new Cube({
+ var base_cube = new Cube({
from: [
-cs[0]-cs[3],
-cs[1]-cs[4],
@@ -133,8 +134,15 @@ var part_codec = new Codec('optifine_part', {
rotation,
origin
})
- if (box.uvNorth) {
- if (!add) Project.box_uv = false;
+ if (box.textureOffset) {
+ if (!add && !box_uv_changed) Project.box_uv = true;
+ box_uv_changed = true;
+ base_cube.extend({
+ uv_offset: box.textureOffset
+ })
+ } else {
+ if (!add && !box_uv_changed) Project.box_uv = false;
+ box_uv_changed = true;
base_cube.extend({
faces: {
north: {uv: convertUVCoords(box.uvNorth)},
@@ -145,11 +153,6 @@ var part_codec = new Codec('optifine_part', {
down: {uv: convertUVCoords(box.uvDown)},
}
})
- } else {
- if (!add) Project.box_uv = true;
- base_cube.extend({
- uv_offset: box.textureOffset
- })
}
if (submodel.translate) {
diff --git a/js/outliner/cube.js b/js/outliner/cube.js
index da6ee9d4..0964dfbc 100644
--- a/js/outliner/cube.js
+++ b/js/outliner/cube.js
@@ -497,11 +497,11 @@ class Cube extends NonGroup {
pos.y -= this.origin[1]
pos.z -= this.origin[2]
- var r = m.getWorldQuaternion(new THREE.Quaternion())
- pos.applyQuaternion(r)
-
- pos.add(m.getWorldPosition(new THREE.Vector3()))
-
+ if (m) {
+ var r = m.getWorldQuaternion(new THREE.Quaternion())
+ pos.applyQuaternion(r)
+ pos.add(m.getWorldPosition(new THREE.Vector3()))
+ }
return pos;
}
setColor(index) {
@@ -657,34 +657,23 @@ class Cube extends NonGroup {
Canvas.updateUV(scope)
}
}
- move(val, axis, absolute, opts, no_update) {
- if (!opts) opts = 0;
- if (val instanceof THREE.Vector3) {
- return this.move(val.x, 0, absolute, opts, true)
- && this.move(val.y, 1, absolute, opts, true)
- && this.move(val.z, 2, absolute, opts, true);
- }
- var size = this.size(axis)
- if (!absolute) {
- val = val + this.from[axis]
- }
+ move(val, axis, move_origin) {
+
+ var size = this.size(axis);
+ val+= this.from[axis];
var in_box = val;
- val = limitToBox(limitToBox(val, -this.inflate) + size, this.inflate) - size
+ val = limitToBox(limitToBox(val, -this.inflate) + size, this.inflate) - size;
in_box = Math.abs(in_box - val) < 1e-4;
- val -= this.from[axis]
+ val -= this.from[axis];
//Move
- if (opts.applyRot) {
- var m = new THREE.Vector3()
- m[getAxisLetter(axis)] = val
- }
- if (Blockbench.globalMovement && Format.bone_rig && !opts) {
- var m = new THREE.Vector3()
- m[getAxisLetter(axis)] = val
+ if (Blockbench.globalMovement && Format.bone_rig && !move_origin) {
+ var m = new THREE.Vector3();
+ m[getAxisLetter(axis)] = val;
- var rotation = new THREE.Quaternion()
- this.mesh.getWorldQuaternion(rotation)
- m.applyQuaternion(rotation.inverse())
+ var rotation = new THREE.Quaternion();
+ this.mesh.getWorldQuaternion(rotation);
+ m.applyQuaternion(rotation.inverse());
this.from[0] += m.x;
this.from[1] += m.y;
@@ -698,14 +687,12 @@ class Cube extends NonGroup {
this.from[axis] += val;
}
//Origin
- if (Blockbench.globalMovement && opts) {
- this.origin[axis] += val
- }
- if (!no_update) {
- this.mapAutoUV()
- Canvas.adaptObjectPosition(this);
- TickUpdates.selection = true;
+ if (Blockbench.globalMovement && move_origin) {
+ this.origin[axis] += val;
}
+ this.mapAutoUV()
+ Canvas.adaptObjectPosition(this);
+ TickUpdates.selection = true;
return in_box;
}
moveVector(arr, axis) {
@@ -719,21 +706,17 @@ class Cube extends NonGroup {
var scope = this;
var in_box = true;
arr.forEach((val, i) => {
- cl('-------------------' + val);
var size = scope.size(i);
val += scope.from[i];
- cl(val)
var val_before = val;
val = limitToBox(limitToBox(val, -scope.inflate) + size, scope.inflate) - size
if (Math.abs(val_before - val) >= 1e-4) in_box = false;
- cl(val)
val -= scope.from[i]
scope.from[i] += val;
scope.to[i] += val;
- cl(val)
})
this.mapAutoUV()
Canvas.adaptObjectPosition(this);
diff --git a/js/outliner/group.js b/js/outliner/group.js
index 89c1c766..d91203b8 100644
--- a/js/outliner/group.js
+++ b/js/outliner/group.js
@@ -415,6 +415,7 @@ class Group extends OutlinerElement {
Outliner.buttons.shading,
Outliner.buttons.autouv
];
+ Group.prototype.needsUniqueName = () => Format.bone_rig;
Group.prototype.menu = new Menu([
'copy',
'paste',
@@ -484,7 +485,7 @@ function addGroup() {
if (Format.bone_rig) {
base_group.createUniqueName()
}
- if (add_group instanceof NonGroup) {
+ if (add_group instanceof NonGroup && selected.length > 1) {
selected.forEach(function(s, i) {
s.addTo(base_group)
})
diff --git a/js/outliner/locator.js b/js/outliner/locator.js
index 33f9b564..1137dfcd 100644
--- a/js/outliner/locator.js
+++ b/js/outliner/locator.js
@@ -46,23 +46,28 @@ class Locator extends NonGroup {
return this;
}
getWorldCenter() {
- var m = this.parent ? this.parent.mesh : scene;
- var pos = new THREE.Vector3(
- this.from[0],
- this.from[1],
- this.from[2]
- )
+ var pos = this.parent.mesh.getWorldPosition(new THREE.Vector3());
+ var q = this.parent.mesh.getWorldQuaternion(new THREE.Quaternion());
- var r = m.getWorldQuaternion(new THREE.Quaternion())
- pos.applyQuaternion(r)
+ var offset = new THREE.Vector3().fromArray(this.from).applyQuaternion(q);
+ var offset2 = new THREE.Vector3().fromArray(this.parent.origin).applyQuaternion(q);
- pos.add(m.getWorldPosition(new THREE.Vector3()))
-
+ pos.add(offset).sub(offset2);
return pos;
}
- move(val, axis, absolute) {
- if (absolute) {
- this.from[axis] = val
+ move(val, axis) {
+
+ if (Blockbench.globalMovement) {
+ var m = new THREE.Vector3();
+ m[getAxisLetter(axis)] = val;
+
+ var rotation = new THREE.Quaternion();
+ this.parent.mesh.getWorldQuaternion(rotation);
+ m.applyQuaternion(rotation.inverse());
+
+ this.from[0] += m.x;
+ this.from[1] += m.y;
+ this.from[2] += m.z;
} else {
this.from[axis] += val
}
@@ -79,6 +84,7 @@ Locator.prototype.buttons = [
Outliner.buttons.remove,
Outliner.buttons.export
];
+Locator.prototype.needsUniqueName = true;
Locator.prototype.menu = new Menu([
'copy',
'rename',
@@ -93,9 +99,11 @@ BARS.defineActions(function() {
category: 'edit',
condition: () => {return Format.locators && Modes.edit},
click: function () {
- var elements = []
- Undo.initEdit({elements, outliner: true});
- elements.push(new Locator().addTo(Group.selected||selected[0]).init().select());
+ var objs = []
+ Undo.initEdit({elements: objs, outliner: true});
+ objs.push(
+ new Locator().addTo(Group.selected||selected[0]).init().select().createUniqueName()
+ );
Undo.finishEdit('add locator');
}
})
diff --git a/js/outliner/outliner.js b/js/outliner/outliner.js
index 84a7c974..ba0479d5 100644
--- a/js/outliner/outliner.js
+++ b/js/outliner/outliner.js
@@ -237,7 +237,7 @@ class OutlinerElement {
}
scope.name = name
delete scope.old_name
- if (Format.bone_rig && scope instanceof Group) {
+ if (Condition(scope.needsUniqueName)) {
scope.createUniqueName()
}
Undo.finishEdit('rename')
@@ -394,7 +394,7 @@ class NonGroup extends OutlinerElement {
}
select(event, isOutlinerClick) {
var scope = this;
- if (scope === undefined) return false;
+ if (scope === undefined || Modes.animate) return false;
//Shiftv
var just_selected = []
if (event && event.shiftKey === true && scope.getParentArray().includes(selected[selected.length-1]) && !Modes.paint && isOutlinerClick) {
diff --git a/js/painter.js b/js/painter.js
index 537044b3..e5d21a80 100644
--- a/js/painter.js
+++ b/js/painter.js
@@ -86,15 +86,15 @@ const Painter = {
Painter.current.face = data.face;
Painter.current.cube = data.cube;
var texture = data.cube.faces[data.face].getTexture()
- if (!texture) {
+ if (!texture || (texture.error && texture.error !== 2)) {
Blockbench.showQuickMessage('message.untextured')
+ return;
}
- if (texture) {
- var x = Math.floor( data.intersects[0].uv.x * texture.img.naturalWidth )
- var y = Math.floor( (1-data.intersects[0].uv.y) * texture.img.naturalHeight )
- Painter.startBrush(texture, x, y, data.cube.faces[data.face].uv, event)
- }
- if (Toolbox.selected.id !== 'color_picker' && texture) {
+ var x = Math.floor( data.intersects[0].uv.x * texture.img.naturalWidth )
+ var y = Math.floor( (1-data.intersects[0].uv.y) * texture.img.naturalHeight )
+ Painter.startBrush(texture, x, y, data.cube.faces[data.face].uv, event)
+
+ if (Toolbox.selected.id !== 'color_picker') {
document.addEventListener('mousemove', Painter.moveBrushCanvas, false );
document.addEventListener('mouseup', Painter.stopBrushCanvas, false );
}
diff --git a/js/preview/canvas.js b/js/preview/canvas.js
index 1993d994..7f79b7d4 100644
--- a/js/preview/canvas.js
+++ b/js/preview/canvas.js
@@ -1,5 +1,4 @@
-//Display
function getRescalingFactor(angle) {
switch (Math.abs(angle)) {
case 0:
@@ -73,6 +72,42 @@ const Canvas = {
var canvas = $('canvas.preview:hover').get(0)
if (canvas) return canvas.preview
},
+ withoutGizmos(cb) {
+
+ function editVis(edit) {
+ edit(three_grid)
+ edit(Canvas.side_grids.x)
+ edit(Canvas.side_grids.z)
+ edit(Transformer)
+ edit(outlines)
+ edit(rot_origin)
+ edit(Vertexsnap.vertexes)
+ Cube.selected.forEach(function(obj) {
+ var m = obj.mesh
+ if (m && m.outline) {
+ edit(m.outline)
+ }
+ })
+ }
+ editVis(obj => {
+ obj.was_visible = obj.visible
+ obj.visible = false
+ })
+ var ground_anim_before = ground_animation
+ if (display_mode && ground_animation) {
+ ground_animation = false
+ }
+
+ cb()
+
+ editVis(obj => {
+ obj.visible = obj.was_visible
+ delete obj.was_visible
+ })
+ if (display_mode && ground_anim_before) {
+ ground_animation = ground_anim_before
+ }
+ },
//Main updaters
clear() {
var objects = []
@@ -335,7 +370,6 @@ const Canvas = {
},
//Object handlers
addCube(obj) {
-
//This does NOT remove old cubes
var mesh = new THREE.Mesh(new THREE.BoxGeometry(1, 1, 1))
Canvas.adaptObjectFaces(obj, mesh)
@@ -345,11 +379,13 @@ const Canvas = {
mesh.type = 'cube';
mesh.isElement = true;
//scene.add(mesh)
- Canvas.meshes[obj.uuid] = mesh
+ Canvas.meshes[obj.uuid] = mesh;
if (Prop.wireframe === false) {
- Canvas.updateUV(obj)
+ Canvas.updateUV(obj);
+ } else {
+ mesh.visible = false;
}
- Canvas.buildOutline(obj)
+ Canvas.buildOutline(obj);
},
adaptObjectPosition(cube, mesh, parent) {
if (!mesh || mesh > 0) mesh = cube.mesh
diff --git a/js/preview/preview.js b/js/preview/preview.js
index be11e264..c5fd2a28 100644
--- a/js/preview/preview.js
+++ b/js/preview/preview.js
@@ -33,10 +33,10 @@ class Preview {
//Cameras
this.isOrtho = false
this.camPers = new THREE.PerspectiveCamera(45, 16 / 9, 1, 3000)
- this.camOrtho = new THREE.OrthographicCamera(-600, 600, -400, 400, 1, 100)
+ this.camOrtho = new THREE.OrthographicCamera(-600, 600, -400, 400, 0.5, 200);
this.camOrtho.backgroundHandle = [{n: false, a: 'x'}, {n: false, a: 'y'}]
this.camOrtho.axis = null
- this.camOrtho.zoom = 0.5
+ this.camOrtho.zoom = 0.4
this.camPers.preview = this.camOrtho.preview = this;
for (var i = 4; i <= 6; i++) {
this.camPers.layers.enable(i);
@@ -45,7 +45,7 @@ class Preview {
//Controls
this.controls = new THREE.OrbitControls(this.camPers, this);
this.controls.minDistance = 1;
- this.controls.maxDistance = 320;
+ this.controls.maxDistance = 512;
this.controls.enableKeys = false;
this.controls.zoomSpeed = 1.5
@@ -269,7 +269,7 @@ class Preview {
return this;
}
resetCamera(init) {
- var dis = 24
+ var dis = 40;
this.controls.target.set(0, 8+scene.position.y, 0);
this.camPers.position.set(-dis, dis*0.8, -dis)
if (!init) {
@@ -816,6 +816,7 @@ const Screencam = {
cancel: 0
}, function(result) {
if (result === 1) {
+ Blockbench.export()
ElecDialogs.showSaveDialog(currentwindow, {filters: [ {name: tl('data.image'), extensions: [is_gif ? 'gif' : 'png']} ]}, function (fileName) {
if (fileName === undefined) {
return;
@@ -1297,7 +1298,7 @@ BARS.defineActions(function() {
condition: () => Toolbox && Toolbox.selected && Toolbox.selected.allowWireframe,
click: function () {
Prop.wireframe = !Prop.wireframe
- Canvas.updateAll()
+ Canvas.updateAllFaces()
if (Modes.id === 'animate') {
Animator.preview()
}
diff --git a/js/preview/transformer.js b/js/preview/transformer.js
index 12047c4a..e6fb871b 100644
--- a/js/preview/transformer.js
+++ b/js/preview/transformer.js
@@ -859,6 +859,9 @@
} else if (Group.selected && !Blockbench.globalMovement) {
Transformer.rotation_ref = rotation_object.mesh;
+
+ } else if (Group.selected && Blockbench.globalMovement && Group.selected.parent && Format.bone_rig) {
+ Transformer.rotation_ref = Group.selected.parent.mesh;
} else if (!Blockbench.globalMovement && Cube.selected[0] && Cube.selected[0].mesh) {
Transformer.rotation_ref = Cube.selected[0].mesh;
@@ -1081,7 +1084,7 @@
}
selected.forEach(function(obj, i) {
if (obj.movable) {
- obj.move(difference, axisNumber, false , _has_groups||!Format.bone_rig)
+ obj.move(difference, axisNumber , _has_groups||!Format.bone_rig)
}
})
scope.updateSelection()
diff --git a/js/textures.js b/js/textures.js
index 57cfd4cf..ddc9e3bc 100644
--- a/js/textures.js
+++ b/js/textures.js
@@ -179,7 +179,7 @@ class Texture {
switch (this.error) {
case 0: return ''; break;
case 1: return tl('texture.error.file'); break;
- case 1: return tl('texture.error.invalid'); break;
+ //case 1: return tl('texture.error.invalid'); break;
case 2: return tl('texture.error.ratio'); break;
case 3: return tl('texture.error.parent'); break;
}
@@ -957,6 +957,28 @@ function getTexturesById(id) {
id = id.replace('#', '');
return $.grep(textures, function(e) {return e.id == id});
}
+Clipbench.setTextures = function(texture) {
+ //Sets the raw image of the texture
+ if (!isApp) return;
+
+ if (texture.mode === 'bitmap') {
+ var img = nativeImage.createFromDataURL(texture.source)
+ } else {
+ var img = nativeImage.createFromPath(texture.source.split('?')[0])
+ }
+ clipboard.writeImage(img)
+}
+Clipbench.pasteTextures = function() {
+ if (!isApp) return;
+ var img = clipboard.readImage()
+ if (img) {
+ var dataUrl = img.toDataURL()
+ var texture = new Texture({name: 'pasted', folder: 'block' }).fromDataURL(dataUrl).fillParticle().add(true)
+ setTimeout(function() {
+ texture.openMenu()
+ }, 40)
+ }
+}
TextureAnimator = {
isPlaying: false,
diff --git a/js/transform.js b/js/transform.js
index 119d3b83..43474a83 100644
--- a/js/transform.js
+++ b/js/transform.js
@@ -46,14 +46,6 @@ function getSelectionCenter() {
center[0] += pos.x
center[1] += pos.y
center[2] += pos.z
- /*
- center[0] += pos.x
- center[1] += pos.y
- center[2] += pos.z
- center[0] -= obj.from[0]//-scene.position.x;
- center[1] -= obj.from[1]//-scene.position.y;
- center[2] -= obj.from[2]//-scene.position.z;
- */
}
})
for (var i = 0; i < 3; i++) {
@@ -70,7 +62,6 @@ function isMovementGlobal() {
if (selected.length === 0 || (!settings.local_move.value && Toolbox.selected.id !== 'resize_tool')) {
return true;
}
-
if (Format.rotate_cubes) {
if (Cube.selected.length > 1) {
if (Cube.selected[0].rotation.equals([0,0,0])) return true;
@@ -82,7 +73,13 @@ function isMovementGlobal() {
i++;
}
}
- return false;
+ return Format.bone_rig && Group.selected;
+ /*
+ if (!Format.bone_rig || !Group.selected) {
+ return false;
+ } else {
+ return true;
+ }*/
}
if (Format.bone_rig) {
if (Cube.selected[0] && Cube.selected[0].parent.type === 'group') {
@@ -371,10 +368,19 @@ const Vertexsnap = {
} else {
Vertexsnap.cubes.forEach(function(obj) {
var cube_pos = new THREE.Vector3().copy(global_delta)
- if (Format.rotate_cubes && !Blockbench.globalMovement) {
- obj.origin[0] += cube_pos.getComponent(0)
- obj.origin[1] += cube_pos.getComponent(1)
- obj.origin[2] += cube_pos.getComponent(2)
+
+ if (Format.bone_rig && obj.parent instanceof Group && obj.mesh.parent) {
+ var q = obj.mesh.parent.getWorldQuaternion(new THREE.Quaternion()).inverse();
+ cube_pos.applyQuaternion(q);
+ }
+
+ if (Format.rotate_cubes) {
+ obj.origin[0] += cube_pos.getComponent(0);
+ obj.origin[1] += cube_pos.getComponent(1);
+ obj.origin[2] += cube_pos.getComponent(2);
+ } else {
+ var q = obj.mesh.getWorldQuaternion(new THREE.Quaternion()).inverse();
+ cube_pos.applyQuaternion(q);
}
var in_box = obj.moveVector(cube_pos.toArray());
if (!in_box && Format.canvas_limit) {
@@ -555,7 +561,6 @@ function getRotationInterval(event) {
function getRotationObject() {
if (Format.bone_rig && Group.selected) return Group.selected;
if (Format.rotate_cubes && Cube.selected.length) return Cube.selected;
- if (Locator.selected.length) return Locator.selected[0].parent;
}
function rotateOnAxis(value, fixed, axis) {
if (Format.bone_rig && Group.selected) {
@@ -643,16 +648,23 @@ BARS.defineActions(function() {
selected.forEach(function(obj, i) {
if (obj.movable) {
var val = value;
- var size = obj.size(axis)
if (!fixed) {
val += obj.from[axis]
}
- val = limitToBox(limitToBox(val, -obj.inflate) + size, obj.inflate) - size
+ if (Format.canvas_limit) {
+ var size = obj.resizable ? obj.size(axis) : 0;
+ val = limitToBox(limitToBox(val, -obj.inflate) + size, obj.inflate) - size
+ }
val -= obj.from[axis]
- obj.to[axis] += val;
+
obj.from[axis] += val;
- obj.mapAutoUV()
- Canvas.adaptObjectPosition(obj);
+ if (obj.resizable) {
+ obj.to[axis] += val;
+ }
+ if (obj instanceof Cube) {
+ obj.mapAutoUV()
+ Canvas.adaptObjectPosition(obj);
+ }
}
})
TickUpdates.selection = true;
@@ -864,26 +876,28 @@ BARS.defineActions(function() {
//Origin
function moveOriginOnAxis(value, fixed, axis) {
- if (Group.selected) {
+ var rotation_object = getRotationObject()
+
+ if (rotation_object instanceof Group) {
var diff = value
if (fixed) {
- diff -= Group.selected.origin[axis]
+ diff -= rotation_object.origin[axis]
}
- Group.selected.origin[axis] += diff
+ rotation_object.origin[axis] += diff
Canvas.updatePositions()
if (Format.bone_rig) {
Canvas.updateAllBones()
}
- return;
+ } else {
+ rotation_object.forEach(function(obj, i) {
+ var diff = value
+ if (fixed) {
+ diff -= obj.origin[axis]
+ }
+ obj.origin[axis] += diff
+ })
+ Canvas.updatePositions()
}
- selected.forEach(function(obj, i) {
- var diff = value
- if (fixed) {
- diff -= obj.origin[axis]
- }
- obj.origin[axis] += diff
- })
- Canvas.updatePositions()
}
new NumSlider('slider_origin_x', {
condition: () => (Modes.edit && getRotationObject()),
diff --git a/js/util.js b/js/util.js
index 39f0a6fc..ac7e6755 100644
--- a/js/util.js
+++ b/js/util.js
@@ -145,6 +145,7 @@ function trimFloatNumber(val) {
if (val == '') return val;
var string = val.toFixed(4)
string = string.replace(/0+$/g, '').replace(/\.$/g, '')
+ if (string == -0) return 0;
return string;
}
function getAxisLetter(number) {
diff --git a/js/uv.js b/js/uv.js
index fd6deb98..0f8ead60 100644
--- a/js/uv.js
+++ b/js/uv.js
@@ -276,7 +276,7 @@ class UVEditor {
p.top = o.top + (p.top - o.top)
p.left = limitNumber(p.left, 0, scope.inner_size-scope.jquery.size.width()+1)
- p.top = limitNumber(p.top, 0, scope.inner_size-scope.jquery.size.height()+1)
+ p.top = limitNumber(p.top, 0, scope.inner_height-scope.jquery.size.height()+1)
p.left = p.left - p.left % (scope.inner_size/scope.grid);
p.top = p.top - p.top % (scope.inner_size/scope.grid);
@@ -377,7 +377,7 @@ class UVEditor {
message(msg, vars) {
msg = tl(msg, vars)
var box = $('' + msg + '
')
- this.jquery.frame.append(box)
+ this.jquery.main.append(box)
setTimeout(function() {
box.fadeOut(200)
setTimeout(function() {
@@ -1036,14 +1036,14 @@ class UVEditor {
face.uv[0] = Math.min(face.uv[0], face.uv[2]);
face.uv[1] = Math.min(face.uv[1], face.uv[3]);
if (side == 'north' || side == 'south') {
- left2 = limitNumber(obj.size('0'), 0, 16)
- top2 = limitNumber(obj.size('1'), 0, 16)
+ left2 = limitNumber(obj.size('0'), 0, Project.texture_width)
+ top2 = limitNumber(obj.size('1'), 0, Project.texture_height)
} else if (side == 'east' || side == 'west') {
- left2 = limitNumber(obj.size('2'), 0, 16)
- top2 = limitNumber(obj.size('1'), 0, 16)
+ left2 = limitNumber(obj.size('2'), 0, Project.texture_width)
+ top2 = limitNumber(obj.size('1'), 0, Project.texture_height)
} else if (side == 'up' || side == 'down') {
- left2 = limitNumber(obj.size('0'), 0, 16)
- top2 = limitNumber(obj.size('2'), 0, 16)
+ left2 = limitNumber(obj.size('0'), 0, Project.texture_width)
+ top2 = limitNumber(obj.size('2'), 0, Project.texture_height)
}
if (face.rotation % 180) {
[left2, top2] = [top2, left2];
@@ -1378,7 +1378,7 @@ class UVEditor {
'uv_maximize',
'uv_auto',
'uv_rel_auto',
- {icon: 'rotate_90_degrees_ccw', condition: () => Format.id == 'java_block', name: 'menu.uv.mapping.rotation', children: function() {
+ {icon: 'rotate_90_degrees_ccw', condition: () => Format.id == 'java_block' || Format.id == 'free', name: 'menu.uv.mapping.rotation', children: function() {
var off = 'radio_button_unchecked'
var on = 'radio_button_checked'
return [
@@ -1791,7 +1791,7 @@ BARS.defineActions(function() {
new BarSlider('uv_rotation', {
category: 'uv',
- condition: () => !Project.box_uv && Format.id == 'java_block' && Cube.selected.length,
+ condition: () => !Project.box_uv && (Format.id == 'java_block' || Format.id == 'free') && Cube.selected.length,
min: 0, max: 270, step: 90, width: 80,
onBefore: () => {
Undo.initEdit({elements: Cube.selected, uv_only: true})
diff --git a/lang/de.json b/lang/de.json
index e58b8e98..79a5062f 100644
--- a/lang/de.json
+++ b/lang/de.json
@@ -983,5 +983,7 @@
"format.optifine_part": "OptiFine Part",
"format.optifine_part.desc": "JPM Part für OptiFine-Entitymodelle",
"action.reverse_keyframes": "Keyframes umkehren",
- "action.reverse_keyframes.desc": "Kehrt die Reihenfolge der ausgewählten Keyframes um"
+ "action.reverse_keyframes.desc": "Kehrt die Reihenfolge der ausgewählten Keyframes um",
+ "message.no_format_import.title": "Nicht-lesbares Format",
+ "message.no_format_import.message": "Dieses Format kann nur exportiert und nicht wieder geladen werden. Um das Modell später erneut öffnen zu können, speichere es zusätzlich als Projekt."
}
\ No newline at end of file
diff --git a/lang/en.json b/lang/en.json
index e902e66b..8f4c6fcd 100644
--- a/lang/en.json
+++ b/lang/en.json
@@ -109,6 +109,8 @@
"message.rotation_limit.message": "Rotations are limited by Minecraft to one axis and 22.5 degree increments. Rotating on a different axis will clear all rotations on the other axes. Convert the model to \"Free Model\" if you are modeling for other purposes and need free rotations.",
"message.file_not_found.title": "File Not Found",
"message.file_not_found.message": "Blockbench could not find the requested file. Make sure it is saved locally and not in a cloud.",
+ "message.no_format_import.title": "Write-only Format",
+ "message.no_format_import.message": "Please note that this export format is write-only. To be able to open the model again, you need to also save it as a project.",
"message.recover_backup.title": "Recover Model",
"message.recover_backup.message": "Blockbench was closed without saving. Do you want to recover the model?",
"message.screenshot.title": "Screenshot",
diff --git a/lang/es.json b/lang/es.json
index a513dec7..f03d3dfd 100644
--- a/lang/es.json
+++ b/lang/es.json
@@ -959,29 +959,31 @@
"panel.element.size": "Tamaño",
"panel.element.origin": "Punto de Pivote",
"panel.element.rotation": "Rotación",
- "message.canvas_limit_error.title": "Canvas Limit Error",
- "message.canvas_limit_error.message": "The action could not be performed correctly because the format limits the canvas to 48 units. Shift the pivot point to prevent this.",
- "data.effect": "Effect",
- "generic.name": "Name",
- "settings.recent_projects": "Recent Model Cap",
- "settings.recent_projects.desc": "Maximum number of recent models to remember",
- "settings.volume": "Volume",
- "settings.volume.desc": "Volume control for sound effects in animations",
- "action.change_keyframe_file": "Select File",
- "action.change_keyframe_file.desc": "Select an audio file to preview a sound effect.",
- "action.clear_timeline": "Clear Timeline",
- "action.clear_timeline.desc": "Clear all unselected bones from the timeline",
- "action.select_effect_animator": "Animate Effects",
- "action.select_effect_animator.desc": "Opens timeline to add sound and particle effects",
- "action.timeline_focus": "Channel",
- "action.timeline_focus.desc": "Select the animation channels to display in the timeline",
- "action.timeline_focus.all": "All",
- "timeline.particle": "Particle",
- "timeline.sound": "Sound",
- "timeline.effects": "Effects",
- "data.format": "Format",
- "format.optifine_part": "OptiFine Part",
- "format.optifine_part.desc": "JPM part for OptiFine entity models",
- "action.reverse_keyframes": "Reverse Keyframes",
- "action.reverse_keyframes.desc": "Reverse the order of the selected keyframes"
+ "message.canvas_limit_error.title": "Error de Límite del Lienzo",
+ "message.canvas_limit_error.message": "La acción no pudo ser ejecutada correctamente porque el formato limita el lienzo a 48 unidades. Cambia el punto pivote para prevenir esto.",
+ "data.effect": "Efecto",
+ "generic.name": "Nombre",
+ "settings.recent_projects": "Límite de Modelos Recientes",
+ "settings.recent_projects.desc": "Número máximo de modelos recientes para recordar",
+ "settings.volume": "Volumen",
+ "settings.volume.desc": "Control del volumen para efectos de sonido en animaciones",
+ "action.change_keyframe_file": "Seleccionar Archivo",
+ "action.change_keyframe_file.desc": "Selecciona un archivo de audio para previsualizar un efecto de sonido",
+ "action.clear_timeline": "Limpiar Línea de Tiempo",
+ "action.clear_timeline.desc": "Borra todos los huesos no seleccionados en la línea de tiempo",
+ "action.select_effect_animator": "Animar Efectos",
+ "action.select_effect_animator.desc": "Abre la línea de tiempo para añadir sonidos y efectos de partícula",
+ "action.timeline_focus": "Canal",
+ "action.timeline_focus.desc": "Selecciona los canales de animación para mostrar en la línea de tiempo",
+ "action.timeline_focus.all": "Todos",
+ "timeline.particle": "Partícula",
+ "timeline.sound": "Sonido",
+ "timeline.effects": "Efectos",
+ "data.format": "Formato",
+ "format.optifine_part": "Parte de Optifima",
+ "format.optifine_part.desc": "Parte JPM para modelos de entidad de OptiFine",
+ "action.reverse_keyframes": "Invertir Frames Clave",
+ "action.reverse_keyframes.desc": "Invierte el orden de los frames clave seleccionados",
+ "message.no_format_import.title": "Write-only Format",
+ "message.no_format_import.message": "Please note that this export format is write-only. To be able to open the model again, you need to also save it as a project."
}
\ No newline at end of file
diff --git a/lang/fr.json b/lang/fr.json
index fff7da42..034c9e66 100644
--- a/lang/fr.json
+++ b/lang/fr.json
@@ -1,11 +1,11 @@
{
- "dialog.ok": "ok",
+ "dialog.ok": "OK",
"dialog.cancel": "Annuler",
"dialog.confirm": "Confirmer",
"dialog.close": "Fermer",
"dialog.import": "Importer",
"dialog.save": "Sauvegarder",
- "dialog.discard": "Jeter",
+ "dialog.discard": "Ignorer",
"dialog.dontshowagain": "Ne plus afficher",
"data.cube": "Cube",
"data.group": "Groupe",
@@ -18,27 +18,27 @@
"keys.shift": "Shift",
"keys.alt": "Alt",
"keys.meta": "Cmd",
- "keys.delete": "Delete",
+ "keys.delete": "Supprimer",
"keys.space": "Espace",
- "keys.leftclick": "Clic Gauche",
+ "keys.leftclick": "Clic gauche",
"keys.middleclick": "Clic molette",
- "keys.rightclick": "Clic Droit",
+ "keys.rightclick": "Clic droit",
"keys.tab": "Onglet",
"keys.backspace": "Retour arrière",
"keys.enter": "Entrée",
- "keys.escape": "Echapper",
+ "keys.escape": "Échap",
"keys.function": "F%0",
"keys.numpad": "Pavé numérique %0",
- "keys.caps": "Majuscules verrouillées",
+ "keys.caps": "Verr. maj.",
"keys.menu": "Menu contextuel",
- "keys.left": "Flèche Gauche",
- "keys.up": "Flèche Haut",
- "keys.right": "Flèche Droite\n",
- "keys.down": "Flèche Bas",
- "keys.pageup": "Page du haut",
- "keys.pagedown": "Page du bas",
+ "keys.left": "Flèche de gauche",
+ "keys.up": "Flèche du haut",
+ "keys.right": "Flèche de droite",
+ "keys.down": "Flèche du bas",
+ "keys.pageup": "Page précédente",
+ "keys.pagedown": "Page suivante",
"keys.plus": "Plus",
- "keys.comma": "Tiret",
+ "keys.comma": "Virgule",
"keys.point": "Point",
"keys.minus": "Moins",
"keys.cross": "Croix",
@@ -47,56 +47,56 @@
"keys.printscreen": "Impression d'écran",
"keys.pause": "Pause",
"message.rotation_limit.title": "Limites de rotation",
- "message.rotation_limit.message": "Minecraft limite les rotations à un axe et par intervalles de 22.5 degrés. Appliquer une rotation sur un axe va supprimer la rotation des autres axes. Désactiver l'option \"Rotation restreintes\" si vous modélisez pour d'autres logiciels et avez besoin de rotations libres. ",
- "message.file_not_found.title": "Fichier non trouvé",
- "message.file_not_found.message": "Blockbench n'a pas pu trouver le fichier demandé. Assurez-vous qu'il soit stocké localement et pas sur un cloud.",
+ "message.rotation_limit.message": "Minecraft limite les rotations à un axe et par intervalles de 22.5 degrés. Appliquer une rotation sur un axe va réinitialiser la rotation sur les autres axes. Désactivez l'option « Rotation restreintes » si vous modélisez pour d'autres logiciels et avez besoin de rotations libres.",
+ "message.file_not_found.title": "Fichier introuvable",
+ "message.file_not_found.message": "Blockbench n'a pas pu trouver le fichier demandé. Assurez-vous qu'il est bien stocké localement et non sur un cloud.",
"message.screenshot.title": "Capture d'écran",
- "message.screenshot.message": "Capture d'écran effectuée",
+ "message.screenshot.message": "Capture d'écran effectuée.",
"message.screenshot.clipboard": "Presse-papier",
- "message.screenshot.right_click": "Capture d'écran - Clique droit pour copier",
+ "message.screenshot.right_click": "Capture d'écran - Clic droit pour copier",
"message.invalid_file.title": "Fichier invalide",
- "message.invalid_file.message": "Impossible d'ouvrir le fichier de modèle: %0",
+ "message.invalid_file.message": "Impossible d'ouvrir le fichier json : %0",
"message.invalid_model.title": "Fichier du modèle invalide",
"message.invalid_model.message": "Le fichier ne contient pas de données de modèle valide",
"message.child_model_only.title": "Modèle enfant vide",
- "message.child_model_only.message": "This file is a child of %0 and does not contain a model.",
- "message.drag_background.title": "Position Background",
- "message.drag_background.message": "Drag the background to move its position. Hold shift and drag up and down to change its size.",
- "message.unsaved_textures.title": "Unsaved Textures",
- "message.unsaved_textures.message": "Your model has unsaved textures. Make sure to save them and paste them into your resource pack in the correct folder.",
- "message.model_clipping.title": "Model Too Large",
- "message.model_clipping.message": "Your model contains %0 cubes that are larger than the 3x3x3 limit allowed by Minecraft. This model will not work in Minecraft.",
- "message.loose_texture.title": "Texture Import",
- "message.loose_texture.message": "The imported texture is not contained in a resource pack. Minecraft can only load textures inside the textures folder of a loaded resource pack.",
- "message.loose_texture.change": "Change Path",
- "message.update_res.title": "Texture Resolution",
- "message.update_res.message": "Would you like to update the project resolution to the resolution of this texture? Click 'Cancel' if your texture has a higher resolution than normal.",
- "message.update_res.update": "Update",
- "message.bedrock_overwrite_error.message": "Blockbench cannot combine this model with the old file",
- "message.bedrock_overwrite_error.backup_overwrite": "Create Backup and Overwrite",
- "message.bedrock_overwrite_error.overwrite": "Overwrite",
- "message.close_warning.message": "Do you want to save your model?",
- "message.close_warning.web": "Your current work will be lost. Are you sure you want to quit?",
- "message.default_textures.title": "Default Textures",
- "message.default_textures.message": "Select the \"textures\"-folder of the default resource pack",
- "message.default_textures.detail": "Extrayez le pack de ressources par défaut de Minecraft à partir du fichier .jar ou de Google et téléchargez-le. Ensuite, localisez le dossier « textures » et ouvrez-le. Blockbench se souviendra de cet emplacement et tentera d'extraire des textures s'il ne parvient pas à les trouver dans le pack de ressources actuel.",
- "message.default_textures.select": "Sélectionnez le dossier \"textures\"",
+ "message.child_model_only.message": "Ce fichier est un enfant de %0 et ne contient aucun modèle.",
+ "message.drag_background.title": "Positionner l'arrière-plan",
+ "message.drag_background.message": "Faites glisser l'arrière-plan pour le déplacer. Maintenez shift et glissez vers le haut et le bas pour changer sa taille.",
+ "message.unsaved_textures.title": "Textures non sauvegardées",
+ "message.unsaved_textures.message": "Votre modèle présente des textures non sauvegardées. Assurez-vous de les sauvegarder et de les coller dans le bon dossier de votre pack de ressources.",
+ "message.model_clipping.title": "Le modèle est trop grand",
+ "message.model_clipping.message": "Votre modèle contient %0 cubes dépassant la limite de 3×3×3 imposée par Minecraft. Ce modèle ne fonctionnera pas dans Minecraft.",
+ "message.loose_texture.title": "Import de texture",
+ "message.loose_texture.message": "La texture que vous avez importée ne se trouve pas dans un pack de ressources. Minecraft ne peut charger que des textures appartenant au dossier textures d'un pack de ressources chargé.",
+ "message.loose_texture.change": "Changer le chemin",
+ "message.update_res.title": "Résolution de la texture",
+ "message.update_res.message": "Souhaitez-vous mettre à jour la résolution du projet vers la résolution de cette texture ? Cliquez sur Annuler si votre texture a une plus grande résolution que la normale.",
+ "message.update_res.update": "Mise à jour",
+ "message.bedrock_overwrite_error.message": "Blockbench ne peut combiner ce modèle avec l'ancien fichier",
+ "message.bedrock_overwrite_error.backup_overwrite": "Faire une backup et écraser",
+ "message.bedrock_overwrite_error.overwrite": "Écraser",
+ "message.close_warning.message": "Souhaitez-vous sauvegarder votre modèle ?",
+ "message.close_warning.web": "Toute donnée non sauvegardée sera perdue. Voulez-vous vraiment quitter ?",
+ "message.default_textures.title": "Textures par défaut",
+ "message.default_textures.message": "Sélectionnez le dossier textures du pack de ressources par défaut",
+ "message.default_textures.detail": "Extrayez le pack de ressources par défaut de Minecraft à partir du fichier .jar ou depuis Internet et téléchargez-le. Ensuite, localisez le dossier « textures » et ouvrez-le. Blockbench se souviendra de cet emplacement et tentera d'y chercher des textures s'il ne parvient pas à les trouver dans le pack de ressources actuel.",
+ "message.default_textures.select": "Sélectionnez le dossier « textures »",
"message.image_editor.title": "Sélectionnez un éditeur d'images",
- "message.image_editor.file": "Sélectionnez fichier...",
- "message.image_editor.exe": "Sélectionnez fichier .exe d'un logiciel d'édition d'image",
+ "message.image_editor.file": "Sélectionnez le fichier…",
+ "message.image_editor.exe": "Sélectionnez l'exécutable de l'éditeur d'images",
"message.display_skin.title": "Afficher le skin",
- "message.display_skin.message": "Sélectionnez un skin sur votre ordinateur ou entrez le nom de joueur.",
- "message.display_skin.upload": "Importer skin",
- "message.display_skin.name": "Nom d’utilisateur ",
+ "message.display_skin.message": "Sélectionnez un skin sur votre ordinateur ou entrez un nom de joueur",
+ "message.display_skin.upload": "Importer un skin",
+ "message.display_skin.name": "Pseudo",
"message.display_skin.reset": "Réinitialiser",
"message.invalid_plugin": "Plugin invalide, voir console",
- "message.load_plugin_app": "Voulez-vous autoriser ce plugin à effectuer des modifications sur votre PC? Ne chargez que des plugins provenant de personnes en qui vous avez confiance.",
- "message.load_plugin_web": "Voulez-vous charger ce plugin? Ne chargez que des plugins provenant de personnes en qui vous avez confiance.",
- "message.preset_no_info": "Le préréglage ne contient pas d'informations pour cet emplacement",
+ "message.load_plugin_app": "Voulez-vous autoriser ce plugin à apporter des modifications à votre ordinateur ? Ne chargez que des plugins venant de personnes en qui vous avez confiance.",
+ "message.load_plugin_web": "Voulez-vous charger ce plugin ? Ne chargez que des plugins venant de personnes en qui vous avez confiance.",
+ "message.preset_no_info": "Ce préréglage ne contient pas d'informations pour cet emplacement",
"message.restart_to_update": "Redémarrez Blockbench pour appliquer les modifications",
- "message.save_file": "Enregistré en tant %0",
- "message.save_obj": "Enregistré en tant que modèle .obj",
- "message.rename_cubes": "Renommer cubes",
+ "message.save_file": "Enregistré sous %0",
+ "message.save_obj": "Enregistré comme modèle .obj",
+ "message.rename_cubes": "Renommer les cubes",
"dialog.project.title": "Projet",
"dialog.project.name": "Nom du fichier",
"dialog.project.parent": "Modèle parent",
@@ -107,7 +107,7 @@
"dialog.project.height": "Hauteur",
"dialog.texture.title": "Texture",
"dialog.texture.variable": "Variable",
- "dialog.texture.namespace": "Espace de nom",
+ "dialog.texture.namespace": "Espace de noms",
"dialog.texture.folder": "Dossier",
"dialog.extrude.title": "Extruder l'image",
"dialog.extrude.mode": "Mode scan",
@@ -128,145 +128,145 @@
"dialog.select.select": "Sélectionner",
"dialog.scale.title": "Mise à l'échelle",
"dialog.scale.axis": "Axe",
- "dialog.scale.scale": "Echelle",
+ "dialog.scale.scale": "Échelle",
"dialog.scale.clipping": "Avrtissement: Votre modèle est trop grand pour la zone de travail",
"dialog.scale.confirm": "Mettre à l'échelle",
"dialog.plugins.title": "Plugins",
- "dialog.plugins.installed": "Installés",
- "dialog.plugins.available": "Disponibles",
+ "dialog.plugins.installed": "Installé",
+ "dialog.plugins.available": "Disponible",
"dialog.plugins.install": "Installer",
"dialog.plugins.uninstall": "Désinstaller",
- "dialog.plugins.reload": "Rafraîchir",
- "dialog.plugins.none_installed": "Pas de plugins installés",
- "dialog.plugins.none_available": "Pas de plugins disponibles",
+ "dialog.plugins.reload": "Actualiser",
+ "dialog.plugins.none_installed": "Aucun plugin installé",
+ "dialog.plugins.none_available": "Aucun plugin disponible",
"dialog.plugins.outdated": "Requiert une version plus récente de Blockbench",
- "dialog.plugins.web_only": "Seulement pour l'application web",
- "dialog.plugins.app_only": "Seulement pour l'application bureau",
+ "dialog.plugins.web_only": "Seulement pour l'application en ligne",
+ "dialog.plugins.app_only": "Seulement pour l'application de bureau",
"dialog.plugins.author": "par %0",
- "dialog.plugins.show_less": "Montrer moins",
+ "dialog.plugins.show_less": "Voir moins",
"dialog.entitylist.title": "Ouvrir modèle d'entité",
"dialog.entitylist.text": "Sélectionnez le modèle que vous désirez importer",
- "dialog.entitylist.bones": "Os",
+ "dialog.entitylist.bones": "Squelette",
"dialog.entitylist.cubes": "Cubes",
"dialog.create_texture.title": "Créer texture",
"dialog.create_texture.folder": "Dossier",
- "dialog.create_texture.template": "Modèle",
+ "dialog.create_texture.template": "Étalon",
"dialog.create_texture.resolution": "Résolution",
"dialog.input.title": "Entrée",
"dialog.update.title": "Mises à jour",
- "dialog.update.refresh": "Actualiser",
- "dialog.update.up_to_date": "Blockbench est à jour !",
- "dialog.update.connecting": "Connexion au serveur",
+ "dialog.update.refresh": "Réessayer",
+ "dialog.update.up_to_date": "Blockbench est à jour !",
+ "dialog.update.connecting": "Connexion au serveur en cours",
"dialog.settings.settings": "Réglages",
"dialog.settings.keybinds": "Raccourcis clavier",
"dialog.settings.layout": "Disposition",
"dialog.settings.about": "À propos",
"layout.color.back": "Arrière",
"layout.color.back.desc": "Arrières-plans et champs de saisie",
- "layout.color.dark": "Noir",
+ "layout.color.dark": "Sombre",
"layout.color.dark.desc": "Toile de fond",
- "layout.color.ui": "UI",
+ "layout.color.ui": "IU",
"layout.color.ui.desc": "Couleur principale de l’interface",
- "layout.color.bright_ui": "UI intelligente",
- "layout.color.bright_ui.desc": "Menus contextuels et infobulles",
+ "layout.color.bright_ui": "IU claire",
+ "layout.color.bright_ui.desc": "Menus contextuels et info-bulles",
"layout.color.button": "Bouton",
"layout.color.button.desc": "Boutons et interrupteurs",
- "layout.color.selected": "Selected",
- "layout.color.selected.desc": "Onglets sélectionnés et objets",
+ "layout.color.selected": "Sélectionné",
+ "layout.color.selected.desc": "Onglets et objets sélectionnés",
"layout.color.border": "Bordure",
- "layout.color.border.desc": "Bordure des boutons et des entrées",
+ "layout.color.border.desc": "Bordure des boutons et entrées",
"layout.color.accent": "Accent",
"layout.color.accent.desc": "Curseur et autres détails",
"layout.color.grid": "Grille",
"layout.color.grid.desc": "Grille de prévisualisation 3D",
"layout.color.text": "Texte",
"layout.color.text.desc": "Texte normal",
- "layout.color.light": "Lumière",
+ "layout.color.light": "Clair",
"layout.color.light.desc": "Texte sélectionné",
- "layout.color.accent_text": "Texte d’accent",
- "layout.color.accent_text.desc": "Texte sur les éléments d’accent",
+ "layout.color.accent_text": "Texte d'accent",
+ "layout.color.accent_text.desc": "Texte sur clair ou éléments d'accent",
"layout.font.main": "Police principale",
"layout.font.headline": "Police de titre",
- "about.version": "Version:",
- "about.creator": "Créateur:",
- "about.website": "Traduction française : HookDonn_, moska\nSite internet:",
- "about.bugtracker": "Logiciel de suivi des bugs",
- "about.electron": "Cette application est construite avec Electron, un cadre pour la création d'applications natives avec des technologies Web telles que Javascript, HTML et CSS.",
+ "about.version": "Version :",
+ "about.creator": "Créateur :",
+ "about.website": "Site Internet :",
+ "about.bugtracker": "Tracker de bugs :",
+ "about.electron": "Ce logiciel est fait grâce à Electron, un outil à la réalisation d'applications natives par technologies Web telles que Javascript, HTML et CSS.",
"about.vertex_snap": "Vertex Snapping est basé sur un plugin de SirBenet",
- "about.icons": "Packs d’icônes :",
- "about.libraries": "Bibliothèques :",
+ "about.icons": "Packs d’icônes :",
+ "about.libraries": "Bibliothèques :",
"settings.category.general": "Général",
- "settings.category.preview": "Prévisualisation ",
+ "settings.category.preview": "Prévisualisation",
"settings.category.grid": "Grille",
- "settings.category.edit": "Modifier",
- "settings.category.snapping": "Capture",
+ "settings.category.edit": "Édition",
+ "settings.category.snapping": "Alignement",
"settings.category.defaults": "Défauts",
"settings.category.dialogs": "Dialogues",
"settings.category.export": "Exporter",
- "settings.language": "Langues",
+ "settings.language": "Langue",
"settings.language.desc": "Langue de l'interface. Redémarrez Blockbench pour appliquer les modifications.",
"settings.show_actions": "Actions d’affichage",
"settings.show_actions.desc": "Afficher chaque action dans la barre d’état",
"settings.backup_interval": "Intervalle de sauvegarde",
"settings.backup_interval.desc": "Intervalle des sauvegardes automatiques en minutes",
- "settings.origin_size": "Rotation d'origine",
- "settings.origin_size.desc": "Taille de l'origine de la rotation",
- "settings.control_size": "Taille de contrôle d’axe",
+ "settings.origin_size": "Origine de rotation",
+ "settings.origin_size.desc": "Taille de l'origine des axes de rotation",
+ "settings.control_size": "Axes de contrôle",
"settings.control_size.desc": "Taille de l'outil de contrôle 3 axes",
"settings.display_skin": "Affichage skin",
- "settings.display_skin.desc": "Skin utilisé pour le modèle de lecteur d'affichage de référence",
+ "settings.display_skin.desc": "Skin utilisé pour le modèle de joueur de référence",
"settings.shading": "Ombres",
"settings.shading.desc": "Activer les ombres",
"settings.transparency": "Transparence",
- "settings.transparency.desc": "Rendre les textures transparentes transparentes",
- "settings.texture_fps": "Texture animée IPS",
- "settings.texture_fps.desc": "Images par seconde pour les textures animées",
+ "settings.transparency.desc": "Afficher les textures transparentes comme telles",
+ "settings.texture_fps": "FPS de texture animée",
+ "settings.texture_fps.desc": "Nombre d'images par secondes pour les textures animées",
"settings.base_grid": "Petite grille",
"settings.base_grid.desc": "Afficher la petite grille et les axes",
"settings.large_grid": "Grande grille",
- "settings.large_grid.desc": "Afficher la grille de blocs 3x3",
+ "settings.large_grid.desc": "Afficher la grande zone de blocs 3×3",
"settings.full_grid": "Grande grille complète",
- "settings.full_grid.desc": "Afficher la grille précise 3x3",
- "settings.large_box": "Grande boite",
- "settings.large_box.desc": "Afficher les limites des blocs 3x3",
+ "settings.full_grid.desc": "Étendre la grille précise à la grande zone 3×3",
+ "settings.large_box": "Grande boîte",
+ "settings.large_box.desc": "Afficher la taille limite 3×3×3",
"settings.display_grid": "Mode d’affichage",
"settings.display_grid.desc": "Afficher la grille en mode affichage",
- "settings.undo_limit": "Annuler la limite",
+ "settings.undo_limit": "Limite d'annulations",
"settings.undo_limit.desc": "Nombre d’étapes que vous pouvez annuler",
- "settings.local_move": "Se déplacer sur les axes relatifs",
- "settings.local_move.desc": "Déplacer les éléments sur leurs propres axes si possible",
- "settings.canvas_unselect": "Désélectionner le clic du canevas",
- "settings.canvas_unselect.desc": "Désélectionner tous les éléments en cliquant sur le fond du canevas ",
- "settings.paint_side_restrict": "Restreinte le pinceau sur le côté",
+ "settings.local_move": "Déplacer les cubes selon des axes relatifs",
+ "settings.local_move.desc": "Déplacer les éléments à rotation sur leurs propres axes si possible",
+ "settings.canvas_unselect": "Désélectionner par clic",
+ "settings.canvas_unselect.desc": "Désélectionner tous les éléments en cliquant sur la toile de fond du canevas",
+ "settings.paint_side_restrict": "Restreinte du pinceau sur une face",
"settings.paint_side_restrict.desc": "Restreindre le pinceau pour qu’il peigne que du côté actuel",
"settings.autouv": "UV automatiques",
"settings.autouv.desc": "Activer les UV automatiques par défaut",
- "settings.create_rename": "Renommer un nouveau cube",
- "settings.create_rename.desc": "Champ de nom de focus lors de la création d'un nouvel élément ou groupe",
+ "settings.create_rename": "Renommer les nouveaux cubes",
+ "settings.create_rename.desc": "Entrer le champ de saisie à la création d'un élément ou d'un groupe",
"settings.edit_size": "Résolution de la grille",
- "settings.edit_size.desc": "Résolution de la grille sur laquelle les cubes s’alignent",
- "settings.shift_size": "Régler la résolution",
+ "settings.edit_size.desc": "Résolution de la grille de base sur laquelle les cubes s’alignent",
+ "settings.shift_size": "Résolution shift",
"settings.shift_size.desc": "Résolution de la grille en maintenant shift",
- "settings.ctrl_size": "Résolution de contrôle",
- "settings.ctrl_size.desc": "Résolution de la grille en tenant le contrôle",
+ "settings.ctrl_size": "Résolution ctrl",
+ "settings.ctrl_size.desc": "Résolution de la grille en maintenant ctrl",
"settings.negative_size": "Taille négative",
"settings.negative_size.desc": "Autoriser l'outil d'échelle à utiliser des tailles négatives",
"settings.dialog_unsaved_textures": "Textures non sauvegardées",
- "settings.dialog_unsaved_textures.desc": "Afficher le dialogue « Textures non enregistrées »",
+ "settings.dialog_unsaved_textures.desc": "Afficher le dialogue « Textures non sauvegardées »",
"settings.dialog_larger_cubes": "Modèle trop grand",
"settings.dialog_larger_cubes.desc": "Afficher le dialogue « Modèle trop grand »",
- "settings.dialog_rotation_limit": "Limites de rotation ",
+ "settings.dialog_rotation_limit": "Limites de rotation",
"settings.dialog_rotation_limit.desc": "Afficher le dialogue « Limites de rotation »",
- "settings.minifiedout": "Miniser l’exportation",
- "settings.minifiedout.desc": "Écrire le fichier JSON sur une ligne",
+ "settings.minifiedout": "Minimiser les fichiers",
+ "settings.minifiedout.desc": "Écrire tout le code du modèle sur une ligne",
"settings.export_groups": "Exporter les groupes",
- "settings.export_groups.desc": "Enregistrer les groupes dans les fichiers de blocs",
- "settings.credit": "Commentaire de crédit",
- "settings.credit.desc": "Ajouter un commentaire de crédit aux fichiers exportés",
+ "settings.export_groups.desc": "Enregistrer les données des groupes dans les fichiers des modèles",
+ "settings.credit": "Crédits",
+ "settings.credit.desc": "Commentaire personnalisé à ajouter en tant que crédit dans les fichiers",
"settings.default_path": "Chemin par défaut",
"settings.default_path.desc": "Dossier à partir duquel Blockbench charge les textures par défaut",
- "settings.image_editor": "Éditeur d’image",
- "settings.image_editor.desc": "Éditeur d’image par défaut pour éditeur les textures avec",
+ "settings.image_editor": "Éditeur d'images",
+ "settings.image_editor.desc": "Éditeur d'images par défaut pour éditer les textures",
"category.navigate": "Navigation",
"category.tools": "Outils",
"category.file": "Fichier",
@@ -275,42 +275,42 @@
"category.transform": "Transformer",
"category.filter": "Filtre",
"category.view": "Vue",
- "category.display": "Paramètres d’affichage",
+ "category.display": "Paramètres d'affichage",
"category.textures": "Textures",
"category.misc": "Divers",
"keybind.preview_select": "Sélectionner",
- "keybind.preview_rotate": "Vue en rotation",
- "keybind.preview_drag": "Glisser la vue",
+ "keybind.preview_rotate": "Rotation d'angle de vue",
+ "keybind.preview_drag": "Translation d'angle de vue",
"keybind.confirm": "Confirmer",
"keybind.cancel": "Annuler",
"action.slider_pos_x": "Deplacer X",
- "action.slider_pos_x.desc": "Déplacer des cubes sur l'axe des X",
+ "action.slider_pos_x.desc": "Déplacer des cubes selon l'axe X",
"action.slider_pos_y": "Déplacer Y",
- "action.slider_pos_y.desc": "Déplacer les cubes sur l’axe Y",
+ "action.slider_pos_y.desc": "Déplacer les cubes selon l'axe Y",
"action.slider_pos_z": "Déplacer Z",
- "action.slider_pos_z.desc": "Déplacer les cubes sur l’axe Z",
+ "action.slider_pos_z.desc": "Déplacer les cubes selon l'axe Z",
"action.slider_size_x": "Taille X",
- "action.slider_size_x.desc": "Redimensionner les cubes sur l'axe X",
+ "action.slider_size_x.desc": "Redimensionner les cubes selon l'axe X",
"action.slider_size_y": "Taille Y",
- "action.slider_size_y.desc": "Redimensionner les cubes sur l'axe des Y",
+ "action.slider_size_y.desc": "Redimensionner les cubes selon l'axe des Y",
"action.slider_size_z": "Taille Z",
- "action.slider_size_z.desc": "Redimensionner les cubes sur l'axe Z",
- "action.slider_inflate": "Gonfler",
+ "action.slider_size_z.desc": "Redimensionner les cubes selon l'axe Z",
+ "action.slider_inflate": "Gonflement",
"action.slider_inflate.desc": "Grossir les cubes dans toutes les directions sans changer les UV.",
- "action.slider_rotation_x": "Tourner X",
- "action.slider_rotation_x.desc": "Faire tourner les cubes sur l’axe X",
- "action.slider_rotation_y": "Rotate Y",
- "action.slider_rotation_y.desc": "Faire tourner les cube sur l’axe Y",
- "action.slider_rotation_z": "Rotate Z",
- "action.slider_rotation_z.desc": "Faire tourner les cubes sur l’axe Z",
+ "action.slider_rotation_x": "Rotation X",
+ "action.slider_rotation_x.desc": "Faire tourner les cubes autour de l'axe X",
+ "action.slider_rotation_y": "Rotation Y",
+ "action.slider_rotation_y.desc": "Faire tourner les cube autour de l'axe Y",
+ "action.slider_rotation_z": "Rotation Z",
+ "action.slider_rotation_z.desc": "Faire tourner les cubes autour de l'axe Z",
"action.slider_origin_x": "Origine X",
- "action.slider_origin_x.desc": "Déplacer l’origine sur l’axe X",
+ "action.slider_origin_x.desc": "Déplacer l’origine selon l'axe X",
"action.slider_origin_y": "Origine Y",
- "action.slider_origin_y.desc": "Déplacer l’origine sur l’axe Y",
+ "action.slider_origin_y.desc": "Déplacer l’origine selon l'axe Y",
"action.slider_origin_z": "Origne Z",
- "action.slider_origin_z.desc": "Déplacer l’origine sur l’axe Z",
- "action.brush_mode": "Mode",
- "action.brush_mode.desc": "Mode peinture",
+ "action.slider_origin_z.desc": "Déplacer l’origine selon l'axe Z",
+ "action.brush_mode": "Mode pinceau",
+ "action.brush_mode.desc": "Mode du pinceau",
"action.slider_brush_size": "Taille",
"action.slider_brush_size.desc": "Rayon du pinceau en pixels",
"action.slider_brush_opacity": "Opacité",
@@ -320,53 +320,53 @@
"action.background_color": "Couleur de fond",
"action.background_color.desc": "Couleur de fond de la texture créée",
"action.uv_slider_pos_x": "Déplacer horizontalement",
- "action.uv_slider_pos_x.desc": "Déplacer la sélection UV de tous les cubes sélectionnés horizontalement",
+ "action.uv_slider_pos_x.desc": "Déplacer la sélection UV horizontalement pour tous les cubes sélectionnés",
"action.uv_slider_pos_y": "Déplacer verticalement",
- "action.uv_slider_pos_y.desc": "Déplacer la sélection UV de tous les cubes sélectionnés verticalement",
- "action.uv_slider_size_x": "Échelle horizontale",
- "action.uv_slider_size_x.desc": "Échelle horizontale de la sélection UV de tous les cubes sélectionnés",
- "action.uv_slider_size_y": "Échelle verticale",
- "action.uv_slider_size_y.desc": "Échelle verticale de la sélection UV de tous les cubes sélectionnés",
- "action.vertex_snap_mode": "Mode",
- "action.vertex_snap_mode.desc": "Sélectionnez si Vertex Snap déplace les éléments à la position sélectionnée ou les redimensionner",
+ "action.uv_slider_pos_y.desc": "Déplacer la sélection UV verticalement pour tous les cubes sélectionnés",
+ "action.uv_slider_size_x": "Redimentionner horizontalement",
+ "action.uv_slider_size_x.desc": "Changer la taille horizontale de la sélection UV de tous les cubes sélectionnés",
+ "action.uv_slider_size_y": "Redimentionner verticalement",
+ "action.uv_slider_size_y.desc": "Changer la taille verticale de la sélection UV de tous les cubes sélectionnés",
+ "action.vertex_snap_mode": "Mode d'alignement",
+ "action.vertex_snap_mode.desc": "Sélectionner si Vertex Snap doit déplacer les éléments à la position voulu ou les redimentionner",
"action.move_tool": "Déplacer",
"action.move_tool.desc": "Outil pour sélectionner et déplacer des éléments",
"action.resize_tool": "Redimensionner",
"action.resize_tool.desc": "Outil pour sélectionner et redimensionner des éléments",
"action.brush_tool": "Pinceau",
"action.brush_tool.desc": "Outil pour peindre sur des textures bitmap, des surfaces ou l'éditeur UV.",
- "action.vertex_snap_tool": "Outil d'alignement",
- "action.vertex_snap_tool.desc": "Déplacez un cube vers un autre en connectant les deux sommets.",
- "action.swap_tools": "Outils d'échange",
- "action.swap_tools.desc": "Basculer entre le déplacement et l'outil de redimensionnement",
- "action.project_window": "Projet...",
- "action.project_window.desc": "Ouvre la fenêtre du projet où vous pouvez éditer les métadonnées de votre modèle.",
+ "action.vertex_snap_tool": "Alignement Vertex",
+ "action.vertex_snap_tool.desc": "Déplacez un cube vers un autre en connectant deux sommets",
+ "action.swap_tools": "Changer d'outil",
+ "action.swap_tools.desc": "Basculer entre les outils de déplacement de redimension",
+ "action.project_window": "Projet…",
+ "action.project_window.desc": "Ouvre la fenêtre Projet, d'où vous pouvez éditer les métadonnées de votre modèle",
"action.new_block_model": "Nouveau modèle",
- "action.new_block_model.desc": "Crée un nouveau modèle de bloc/d’objet\n",
+ "action.new_block_model.desc": "Crée un nouveau modèle de bloc/d'item",
"action.new_entity_model": "Nouveau modèle d'entité",
"action.new_entity_model.desc": "Crée un nouveau modèle d'entité Bedrock",
"action.open_model": "Ouvrir un modèle",
"action.open_model.desc": "Ouvrir un fichier de modèle à partir de votre ordinateur.",
"action.add_model": "Ajouter un modèle",
- "action.add_model.desc": "Ajouter un modèle d'un fichier au modèle actuel",
+ "action.add_model.desc": "Ajouter un modèle à l'espace de travail actuel partir d'un fichier",
"action.extrude_texture": "Texture extrudée",
"action.extrude_texture.desc": "Générer un modèle en étirant une texture",
- "action.export_blockmodel": "Exporter un modèle de bloc",
- "action.export_blockmodel.desc": "Exporter un bloc ou un objet de Minecraft",
+ "action.export_blockmodel": "Exporter le modèle",
+ "action.export_blockmodel.desc": "Exporter le modèle pour bloc ou item Minecraft",
"action.export_entity": "Exporter une entité Bedrock",
"action.export_entity.desc": "Ajouter le modèle actuel en tant qu'entité à un fichier mobs.json",
- "action.export_optifine_part": "Exporter OptiFine JPM",
- "action.export_optifine_part.desc": "Exporter un modèle de pièce d'entité pour OptiFine",
- "action.export_optifine_full": "Exporter OptiFine JEM",
+ "action.export_optifine_part": "Exporter partie OptiFine",
+ "action.export_optifine_part.desc": "Exporter une partie de modèle d'entité OptiFine",
+ "action.export_optifine_full": "Exporter JEM OptiFine",
"action.export_optifine_full.desc": "Exporter un modèle complet d'entité OptiFine",
"action.export_obj": "Exporter un modèle OBJ",
"action.export_obj.desc": "Exporter un modèle OBJ Wavefront pour l'utiliser dans d'autres programmes",
- "action.settings_window": "Réglages...",
- "action.settings_window.desc": "Ouvrir la boîte de dialogue des paramètres de Blockbench.",
- "action.plugins_window": "Plugins...",
- "action.plugins_window.desc": "Ouvrir la fenêtre du magasin de plugins",
- "action.update_window": "Mises à jour...",
- "action.update_window.desc": "Recherchez les mises à jour de Blockbench.",
+ "action.settings_window": "Paramètres…",
+ "action.settings_window.desc": "Ouvrir la boîte de dialogue des paramètres Blockbench.",
+ "action.plugins_window": "Plugins…",
+ "action.plugins_window.desc": "Ouvrir le plugin store",
+ "action.update_window": "Mises à jour…",
+ "action.update_window.desc": "Rechercher des mises à jour de Blockbench.",
"action.reset_keybindings": "Réinitialiser les raccourcis clavier",
"action.reset_keybindings.desc": "Réinitialiser tous les raccourcis clavier aux valeurs par défaut de Blockbench",
"action.import_layout": "Importer une mise en page",
@@ -374,132 +374,132 @@
"action.export_layout": "Exporter une mise en page",
"action.export_layout.desc": "Créer un fichier de mise en page basé sur les paramètres actuels",
"action.reset_layout": "Réinitialiser la mise en page",
- "action.reset_layout.desc": "Réinitialiser la mise en page à la valeur par défaut de Blockbench",
+ "action.reset_layout.desc": "Réinitialiser la mise en page aux valeurs par défaut de Blockbench",
"action.load_plugin": "Charger un plugin à partir d'un fichier",
- "action.load_plugin.desc": "Chargez un plugin en important le fichier source.",
+ "action.load_plugin.desc": "Charger un plugin en important son fichier source.",
"action.reload_plugins": "Recharger les plugins",
"action.reload_plugins.desc": "Recharger tous les plugins de développement.",
"action.uv_dialog": "Fenêtre UV",
"action.uv_dialog.desc": "Ouvrir la boîte de dialogue UV pour voir toutes les faces côte à côte",
"action.uv_dialog_full": "Vue complète",
- "action.uv_dialog_full.desc": "Ouvre la boîte de dialogue UV pour éditer une face en plein écran\n",
- "action.undo": "Annuler",
- "action.undo.desc": "Annule le dernier changement\n",
- "action.redo": "Rétablir",
- "action.redo.desc": "Annule la dernière annulation",
+ "action.uv_dialog_full.desc": "Ouvre la boîte de dialogue UV pour éditer une face en plein écran",
+ "action.undo": "Défaire",
+ "action.undo.desc": "Annule le dernier changement effectué",
+ "action.redo": "Refaire",
+ "action.redo.desc": "Rétablit le dernier changement annulé",
"action.copy": "Copier",
- "action.copy.desc": "Copier la sélection sélectionnée, les paramètres de face ou d'affichage",
+ "action.copy.desc": "Copier les éléments sélectionnés, les données de face ou les paramètres d'affichage",
"action.paste": "Coller",
- "action.paste.desc": "Coller la sélection sélectionnée, les paramètres de face ou d'affichage",
+ "action.paste.desc": "Coller les éléments sélectionnés, les données de face ou les paramètres d'affichage",
"action.cut": "Couper",
- "action.cut.desc": "Couper la sélection sélectionnée, les paramètres de face ou d'affichage",
+ "action.cut.desc": "Couper les éléments sélectionnés, les données de face ou les paramètres d'affichage",
"action.add_cube": "Ajouter un cube",
- "action.add_cube.desc": "Ajouter un nouveau cube",
+ "action.add_cube.desc": "Ajoute un nouveau cube",
"action.add_group": "Ajouter un groupe",
"action.add_group.desc": "Ajoute un nouveau groupe ou un nouvel os",
- "action.outliner_toggle": "Voir plus d’option",
- "action.outliner_toggle.desc": "Appuyez pour plus d'options concernant la liste",
+ "action.outliner_toggle": "Plus/moins d'options",
+ "action.outliner_toggle.desc": "Affiche/masque des options additionnelles dans la liste",
"action.duplicate": "Dupliquer",
- "action.duplicate.desc": "Dupliquer les cubes ou groupes sélectionnés",
+ "action.duplicate.desc": "Duplique les cubes ou groupes sélectionnés",
"action.delete": "Supprimer",
"action.delete.desc": "Supprime les cubes ou groupes sélectionnés",
- "action.sort_outliner": "Type de contour",
- "action.sort_outliner.desc": "Triez la liste des blocs par ordre alphabétique",
+ "action.sort_outliner": "Trier la liste",
+ "action.sort_outliner.desc": "Trie la liste par ordre alphabétique",
"action.local_move": "Mouvement relatif",
- "action.local_move.desc": "Déplacer les éléments pivotés sur leurs propres axes si possible",
- "action.select_window": "Sélectionner...",
+ "action.local_move.desc": "Déplacer les éléments pivotés selon leurs propres axes si possible",
+ "action.select_window": "Sélectionner…",
"action.select_window.desc": "Rechercher et sélectionner des cubes en fonction de leurs propriétés",
"action.invert_selection": "Inverser la sélection",
- "action.invert_selection.desc": "Inverser la sélection actuelle de cubes",
+ "action.invert_selection.desc": "Inverser la sélection actuelle",
"action.select_all": "Tout sélectionner",
"action.select_all.desc": "Sélectionner tous les cubes",
- "action.collapse_groups": "Réduire les groupes",
- "action.collapse_groups.desc": "Réduire tous les groupes",
- "action.scale": "Échelle...",
- "action.scale.desc": "Échelle des cubes sélectionnés",
- "action.rotate_x_cw": "Tourner CW",
- "action.rotate_x_cw.desc": "Faire pivoter les cubes sélectionnés de 90° sur l'axe X",
- "action.rotate_x_ccw": "Tourner contre-CW",
- "action.rotate_x_ccw.desc": "Faire pivoter les cubes sélectionnés de -90° sur l'axe X",
- "action.rotate_y_cw": "Tourner CW",
- "action.rotate_y_cw.desc": "Faire pivoter les cubes sélectionnés de 90° sur l'axe Y",
- "action.rotate_y_ccw": "Tourner contre-CW",
- "action.rotate_y_ccw.desc": "Faire pivoter les cubes sélectionnés de -90° sur l'axe Y",
- "action.rotate_z_cw": "Tourner CW",
- "action.rotate_z_cw.desc": "Faire pivoter les cubes sélectionnés de 90° sur l'axe Z",
- "action.rotate_z_ccw": "Tourner contre-CW",
- "action.rotate_z_ccw.desc": "Faire pivoter les cubes sélectionnés de -90° sur l'axe Z",
+ "action.collapse_groups": "Détruire les groupes",
+ "action.collapse_groups.desc": "Détruire tous les groupes",
+ "action.scale": "Mise à l'échelle",
+ "action.scale.desc": "Redimentionner les cubes sélectionnés",
+ "action.rotate_x_cw": "Rotation horaire",
+ "action.rotate_x_cw.desc": "Faire pivoter les cubes sélectionnés de 90° autour de l'axe X",
+ "action.rotate_x_ccw": "Rotation anti-horaire",
+ "action.rotate_x_ccw.desc": "Faire pivoter les cubes sélectionnés de −90° autour de l'axe X",
+ "action.rotate_y_cw": "Rotation horaire",
+ "action.rotate_y_cw.desc": "Faire pivoter les cubes sélectionnés de 90° autour de l'axe Y",
+ "action.rotate_y_ccw": "Rotation anti-horaire",
+ "action.rotate_y_ccw.desc": "Faire pivoter les cubes sélectionnés de −90° autour de l'axe Y",
+ "action.rotate_z_cw": "Rotation horaire",
+ "action.rotate_z_cw.desc": "Faire pivoter les cubes sélectionnés de 90° autour de l'axe Z",
+ "action.rotate_z_ccw": "Rotation anti-horaire",
+ "action.rotate_z_ccw.desc": "Faire pivoter les cubes sélectionnés de −90° autour de l'axe Z",
"action.flip_x": "Retourner X",
- "action.flip_x.desc": "Retourner les cubes sélectionnés sur l'axe X",
+ "action.flip_x.desc": "Retourner les cubes sélectionnés selon l'axe X",
"action.flip_y": "Retourner Y",
- "action.flip_y.desc": "Retourner les cubes sélectionnés sur l'axe Y",
+ "action.flip_y.desc": "Retourner les cubes sélectionnés selon l'axe Y",
"action.flip_z": "Retourner Z",
- "action.flip_z.desc": "Retourner les cubes sélectionnés sur l'axe Z",
+ "action.flip_z.desc": "Retourner les cubes sélectionnés selon l'axe Z",
"action.center_x": "Centrer X",
- "action.center_x.desc": "Centrer les cubes sélectionnés sur l'axe X",
+ "action.center_x.desc": "Centrer les cubes sélectionnés selon l'axe X",
"action.center_y": "Centrer Y",
- "action.center_y.desc": "Centrer les cubes sélectionnés sur l'axe Y",
+ "action.center_y.desc": "Centrer les cubes sélectionnés selon l'axe Y",
"action.center_z": "Centrer Z",
- "action.center_z.desc": "Centrer les cubes sélectionnés sur l'axe Z",
- "action.center_all": "Tout centrer",
- "action.center_all.desc": "Centrer les cubes sélectionnés.",
- "action.toggle_visibility": "Basculer la visibilité",
+ "action.center_z.desc": "Centrer les cubes sélectionnés selon l'axe Z",
+ "action.center_all": "Centrer (global)",
+ "action.center_all.desc": "Centrer les cubes sélectionnés selon tous les axes",
+ "action.toggle_visibility": "Visible/masqué",
"action.toggle_visibility.desc": "Basculer la visibilité des cubes sélectionnés.",
"action.toggle_export": "Basculer l'exportation",
"action.toggle_export.desc": "Basculer le paramètre d'exportation des cubes sélectionnés.",
- "action.toggle_autouv": "Basculer UV automatique",
- "action.toggle_autouv.desc": "Basculez le réglage UV automatique des cubes sélectionnés.",
- "action.toggle_shade": "Basculer l’ombrage",
- "action.toggle_shade.desc": "Basculer l'ombrage des cubes sélectionnés.",
+ "action.toggle_autouv": "UV auto/manuel",
+ "action.toggle_autouv.desc": "Basculer le réglage UV automatique des cubes sélectionnés.",
+ "action.toggle_shade": "Ombres",
+ "action.toggle_shade.desc": "Activer/désactiver l'ombrage des cubes sélectionnés.",
"action.rename": "Renommer",
"action.rename.desc": "Changer le nom des cubes sélectionnés.",
"action.add_display_preset": "Nouveau préréglage",
"action.add_display_preset.desc": "Ajouter un nouveau paramètre d'affichage prédéfini.",
"action.fullscreen": "Plein écran",
- "action.fullscreen.desc": "Basculer en mode plein écran.",
+ "action.fullscreen.desc": "Active/désactive le mode plein écran.",
"action.zoom_in": "Zoomer",
"action.zoom_in.desc": "Effectuer un zoom avant pour agrandir l'interface.",
"action.zoom_out": "Dézoomer",
"action.zoom_out.desc": "Effectuer un zoom arrière pour réduire l'interface.",
"action.zoom_reset": "Réinitialiser le zoom",
- "action.zoom_reset.desc": "Réinitialiser le zoom sur la valeur par défaut 100%.",
+ "action.zoom_reset.desc": "Réinitialiser le niveau de zoom à 100 %.",
"action.reset_interface": "Réinitialiser l'interface",
- "action.reset_interface.desc": "Réinitialiser la taille et les positions du GUI",
- "action.toggle_wireframe": "Voir l’armature",
- "action.toggle_wireframe.desc": "Basculer le mode d’affichage en armature",
+ "action.reset_interface.desc": "Réinitialiser la taille et les positions de l'IU",
+ "action.toggle_wireframe": "Vue squelettique",
+ "action.toggle_wireframe.desc": "Activer/désactiver le mode d’affichage squelettique.",
"action.screenshot_model": "Capture d'écran du modèle",
"action.screenshot_model.desc": "Prendre une capture d'écran recadrée du modèle sous l'angle actuel",
"action.screenshot_app": "Capture d'écran",
"action.screenshot_app.desc": "Prendre une capture d'écran de l'ensemble de l'application",
- "action.toggle_quad_view": "Basculer en vue quadruple ",
- "action.toggle_quad_view.desc": "Basculer en 4 modes d’afffichages",
+ "action.toggle_quad_view": "Basculer vue quadruple",
+ "action.toggle_quad_view.desc": "Activer/désactiver l'affichage quadruple",
"action.import_texture": "Importer une texture",
"action.import_texture.desc": "Importer une ou plusieurs textures de votre ordinateur",
"action.create_texture": "Créer une texture",
- "action.create_texture.desc": "Créer une texture vierge ou un modèle de texture",
+ "action.create_texture.desc": "Créer une texture vierge ou une texture de référence",
"action.save_textures": "Enregistrer les textures",
"action.save_textures.desc": "Sauvegarder toutes les textures non sauvegardées",
- "action.animated_textures": "Jouer des textures animées",
- "action.animated_textures.desc": "Lire et mettre en pause l'aperçu des textures animées",
- "action.origin_to_geometry": "Origine à la géométrie",
- "action.origin_to_geometry.desc": "Définissez l'origine au centre de la géométrie.",
- "action.rescale_toggle": "Basculer à l'échelle",
- "action.rescale_toggle.desc": "Redimensionnez les cubes en fonction de leur rotation actuelle",
+ "action.animated_textures": "Lire les animations de texture",
+ "action.animated_textures.desc": "Lecture/pause des textures animées",
+ "action.origin_to_geometry": "Centrer l'origine",
+ "action.origin_to_geometry.desc": "Mettre l'origine de rotation au centre de la sélection",
+ "action.rescale_toggle": "Basculer mise à l'échelle",
+ "action.rescale_toggle.desc": "Redimensionner les cubes selon leur rotation actuelle",
"action.bone_reset_toggle": "Réinitialiser le corps",
"action.bone_reset_toggle.desc": "Empêcher le corps d'afficher les cubes du modèle parent",
"action.reload": "Recharger Blockbench",
- "action.reload.desc": "Recharger Blockbench. Cela supprimera tout progrès non enregistré.",
+ "action.reload.desc": "Recharger Blockbench. Cela supprimera tout progrès non sauvegardé.",
"menu.file": "Fichier",
- "menu.edit": "Editer",
+ "menu.edit": "Édition",
"menu.transform": "Transformer",
"menu.filter": "Filtre",
- "menu.display": "Afficher",
+ "menu.display": "Affichage",
"menu.view": "Vue",
"menu.file.new": "Nouveau",
"menu.file.recent": "Récent",
"menu.file.import": "Importer",
"menu.file.export": "Exporter",
- "menu.transform.rotate": "Tourner",
+ "menu.transform.rotate": "Pivoter",
"menu.transform.flip": "Retourner",
"menu.transform.center": "Centrer",
"menu.transform.properties": "Propriétés",
@@ -513,32 +513,32 @@
"menu.cube.color": "Couleur du marqueur",
"menu.cube.texture": "Texture",
"menu.cube.texture.transparent": "Transparant",
- "menu.cube.texture.blank": "Blanc",
+ "menu.cube.texture.blank": "Vierge",
"menu.group.duplicate": "Dupliquer",
"menu.group.sort": "Trier",
"menu.group.resolve": "Résoudre",
- "menu.texture.face": "Appliquer aux faces",
+ "menu.texture.face": "Appliquer à la face",
"menu.texture.cube": "Appliquer aux cubes",
"menu.texture.file": "Fichier",
"menu.texture.refresh": "Actualiser",
- "menu.texture.change": "Changer fichier",
+ "menu.texture.change": "Changer de fichier",
"menu.texture.folder": "Ouvrir dans le dossier",
- "menu.texture.edit": "Modifier",
- "menu.texture.export": "Exporter",
- "menu.texture.save": "Sauvegarder",
- "menu.texture.properties": "Propriétés",
+ "menu.texture.edit": "Éditer",
+ "menu.texture.export": "Enregistrer sous",
+ "menu.texture.save": "Enregistrer",
+ "menu.texture.properties": "Propriétés…",
"menu.preview.background": "Arrière-plan",
"menu.preview.background.load": "Charger",
"menu.preview.background.position": "Position",
- "menu.preview.background.lock": "Verrouiller la caméra",
- "menu.preview.background.remove": "Supprimer",
+ "menu.preview.background.lock": "Verrouiller à la caméra",
+ "menu.preview.background.remove": "Retirer",
"menu.preview.screenshot": "Capture d’écran",
"menu.preview.perspective": "Perspective",
"menu.preview.perspective.normal": "Normal",
- "menu.preview.quadview": "Quadruple vue",
+ "menu.preview.quadview": "Vue quadruple",
"menu.preview.fullview": "Vue complète",
"menu.preview.stop_drag": "Arrêter le positionnement en arrière-plan",
- "menu.uv.mapping": "Cartographie UV",
+ "menu.uv.mapping": "Mapping UV",
"menu.uv.mapping.export": "Exporter",
"menu.uv.mapping.rotation": "Rotation",
"menu.uv.mapping.mirror_x": "Miroir X",
@@ -552,18 +552,18 @@
"cube.color.purple": "Mauve",
"cube.color.blue": "Bleu",
"cube.color.green": "Vert",
- "cube.color.lime": "Vert pale",
+ "cube.color.lime": "Vert clair",
"switches.visibility": "Visibilité",
"switches.export": "Exporter",
"switches.shading": "Ombre",
"switches.autouv": "UV automatique",
"panel.uv": "UV",
- "panel.display": "Afficher",
+ "panel.display": "Affichage",
"panel.textures": "Textures",
- "panel.outliner": "Liste des blocs",
+ "panel.outliner": "Liste d'éléments",
"uv_editor.title": "Éditeur UV",
"uv_editor.all_faces": "Toutes",
- "uv_editor.no_faces": "Aucun",
+ "uv_editor.no_faces": "Aucune",
"face.north": "Nord",
"face.south": "Sud",
"face.west": "Ouest",
@@ -576,61 +576,61 @@
"direction.east": "Est",
"direction.top": "Haut",
"direction.bottom": "Bas",
- "display.slot.third_right": "Troisième personne à droite",
- "display.slot.third_left": "Troisième personne à gauche",
- "display.slot.first_right": "Première personne à droite",
- "display.slot.first_left": "Première personne à gauche",
+ "display.slot.third_right": "3ᵉ personne droite",
+ "display.slot.third_left": "3ᵉ personne gauche",
+ "display.slot.first_right": "1ʳᵉ personne droite",
+ "display.slot.first_left": "1ʳᵉ personne gauche",
"display.slot.head": "Tête",
"display.slot.ground": "Sol",
"display.slot.frame": "Cadre",
"display.slot.gui": "GUI",
"display.rotation": "Rotation",
- "display.translation": "Déplacement",
- "display.scale": "Échelle",
+ "display.translation": "Translation",
+ "display.scale": "Taille",
"display.slot": "Emplacement",
"display.reference": "Modèle de référence",
"display.reference.player": "Joueur",
"display.reference.zombie": "Zombie",
"display.reference.armor_stand": "Porte-armure",
- "display.reference.baby_zombie": "Bébé Zombie",
- "display.reference.armor_stand_small": "Petit Porte-armure",
+ "display.reference.baby_zombie": "Bébé zombie",
+ "display.reference.armor_stand_small": "Petit porte-armure",
"display.reference.monitor": "Normal",
"display.reference.bow": "Arc",
"display.reference.block": "Bloc",
"display.reference.frame": "Cadre d'objet",
- "display.reference.inventory_nine": "3x3",
+ "display.reference.inventory_nine": "3×3",
"display.reference.inventory_full": "Inventaire",
"display.reference.hud": "HUD",
- "display.preset.blank_name": "S'il vous plaît entrer un nom",
- "display.preset.item": "Objet par défaut",
- "display.preset.block": "Arme par défaut",
+ "display.preset.blank_name": "Veuillez entrer un nom",
+ "display.preset.item": "Item par défaut",
+ "display.preset.block": "Bloc par défaut",
"display.preset.handheld": "Arme par défaut",
- "display.preset.rod": "Barre par défaut",
+ "display.preset.rod": "Bâton par défaut",
"dialog.continue": "Continuer",
"message.square_textures": "Les textures doivent être carrées",
"message.unsaved_texture.title": "Texture non sauvegardée",
- "message.unsaved_texture.message": "Toutes les modifications non enregistrées de cette texture seront perdues. Voulez-vous poursuivre ?",
- "dialog.update.no_connection": "Pas de connexion Internet\n",
+ "message.unsaved_texture.message": "Toute les modification non enregistrée de cette texture sera perdue. Voulez-vous poursuivre ?",
+ "dialog.update.no_connection": "Pas de connexion Internet",
"dialog.update.latest": "Dernière version",
"dialog.update.installed": "Version installée",
"dialog.update.update": "Mettre à jour",
- "action.brush_mode.brush": "Brosse",
+ "action.brush_mode.brush": "Rond",
"action.brush_mode.noise": "Bruit",
"action.vertex_snap_mode.move": "Déplacer",
- "action.vertex_snap_mode.scale": "Redimensionner ",
- "action.open_model_folder": "Ouvrir le dossier de modèle",
+ "action.vertex_snap_mode.scale": "Redimensionner",
+ "action.open_model_folder": "Ouvrir le dossier du modèle",
"action.open_model_folder.desc": "Ouvre le dossier dans lequel se trouve le modèle",
- "action.change_textures_folder": "Changer l'emplacement de la texture",
+ "action.change_textures_folder": "Changer l'emplacement des textures",
"action.change_textures_folder.desc": "Changer le dossier dans lequel toutes les textures sont enregistrées",
- "menu.texture.particle": "Utiliser pour les particules",
+ "menu.texture.particle": "Texture des particules",
"message.update_notification.title": "Une mise à jour est disponible",
- "message.update_notification.message": "La nouvelle version \"%0\" de Blockbench est disponible. Voulez-vous l'installer maintenant ?",
+ "message.update_notification.message": "La nouvelle version « %0 » de Blockbench est disponible. Voulez-vous l'installer maintenant ?",
"message.update_notification.install": "Installer",
"message.update_notification.later": "Plus tard",
"message.untextured": "Cette surface n'a pas de texture",
"dialog.toolbar_edit.title": "Personnaliser la barre d'outils",
"dialog.shift_uv.title": "Décalage UV",
- "dialog.shift_uv.message": "Entrez le nombre que vous souhaitez multiplier des coordonnées de décalage UV par les expressions mathématiques autorisées. Prévoyez un \"+\" si vous souhaitez ajouter ce numéro.",
+ "dialog.shift_uv.message": "Entrez le nombre par lequel vous souhaitez multiplier les coordonnées du décalage UV. Les expressions mathématiques sont autorisées. Mettez un « + » si vous voulez ajouter ce nombre.",
"dialog.shift_uv.horizontal": "Horizontal",
"dialog.shift_uv.vertical": "Vertical",
"keybindings.reset": "Réinitialiser",
@@ -639,55 +639,55 @@
"action.uv_rotation": "Rotation UV",
"action.uv_rotation.desc": "Rotation de la face UV",
"action.uv_grid": "Grille UV",
- "action.uv_grid.desc": "La résolution de la grille sur laquelle le sélecteur UV s’accroche",
+ "action.uv_grid.desc": "La résolution de la grille sur laquelle le sélecteur UV s'aligne",
"action.uv_grid.auto": "Auto",
- "action.uv_grid.none": "Aucun",
+ "action.uv_grid.none": "Rien",
"action.uv_maximize": "Maximiser les UV",
- "action.uv_maximize.desc": "Définit les UV de cette face sur la texture complète",
- "action.uv_auto": "UV automatique",
- "action.uv_auto.desc": "Définit la taille UV de cette face à la taille réelle de la face",
- "action.uv_rel_auto": "Rel. UV automatique",
- "action.uv_rel_auto.desc": "Règle les UV de cette face sur la position et la taille de la face actuelle",
+ "action.uv_maximize.desc": "Définit les UV pour prendre la texture entière",
+ "action.uv_auto": "UV auto",
+ "action.uv_auto.desc": "Règle les UV de cette face à la taille réelle de celle-ci",
+ "action.uv_rel_auto": "UV auto relatifs",
+ "action.uv_rel_auto.desc": "Règle les UV de cette face à la taille et la position réelles de celle-ci",
"action.uv_mirror_x": "Miroir UV X",
- "action.uv_mirror_x.desc": "Reflète les UV de cette face sur l'axe X",
+ "action.uv_mirror_x.desc": "Reflète les UV de cette face selon l'axe X",
"action.uv_mirror_y": "Miroir UV Y",
- "action.uv_mirror_y.desc": "Reflète les UV de cette face sur l'axe Y",
+ "action.uv_mirror_y.desc": "Reflète les UV de cette face selon l'axe Y",
"action.uv_transparent": "Face transparente",
"action.uv_transparent.desc": "Rend la face actuelle transparente",
"action.uv_reset": "Réinitialiser la face",
- "action.uv_reset.desc": "Réinitialiser la face actuelle",
+ "action.uv_reset.desc": "Réinitialise la face actuelle",
"action.cullface": "Cullface",
- "action.cullface.desc": "Désactive le rendu pour cette face si le côté sélectionné du modèle est couvert",
+ "action.cullface.desc": "Désactive le rendu de cette face si le côté en question du modèle est couvert",
"action.auto_cullface": "Cullface automatique",
- "action.auto_cullface.desc": "Définit le cullface pour cette face à lui-même",
+ "action.auto_cullface.desc": "Définit la cullface de cette face à elle-même",
"action.face_tint": "Teinte",
"action.face_tint.desc": "Active l'option de teinte pour la face actuelle",
"action.uv_shift": "Décalage UV",
- "action.uv_shift.desc": "Décalage de toutes les régions UV d'un montant fixe ou d'une expression mathématique",
+ "action.uv_shift.desc": "Décaler toutes les régions UV d'une grandeur fixe ou expression mathématique",
"menu.toolbar.edit": "Personnaliser",
"menu.toolbar.reset": "Réinitialiser",
- "uv_editor.rotated": "Tourné",
- "uv_editor.auto_cull": "Cullface à soi",
+ "uv_editor.rotated": "Pivoté",
+ "uv_editor.auto_cull": "Cullface à soi-même",
"uv_editor.copied": "Face copiée",
"uv_editor.pasted": "Face collée",
"uv_editor.copied_x": "%0 faces copiées",
- "uv_editor.reset": "Réinitialiser la face",
+ "uv_editor.reset": "Face réinitialisée",
"uv_editor.maximized": "Maximisé",
"uv_editor.autouv": "Taille automatique",
- "uv_editor.mirrored": "En mirroir",
- "uv_editor.to_all": "Appliquer à toutes les faces",
- "uv_editor.transparent": "Rendre transparent",
- "uv_editor.cullface_on": "Cullface activé",
- "uv_editor.cullface_off": "Cullface désativé",
+ "uv_editor.mirrored": "Miroir",
+ "uv_editor.to_all": "Appliqué à toutes les faces",
+ "uv_editor.transparent": "Rendue transparente",
+ "uv_editor.cullface_on": "Cullface activée",
+ "uv_editor.cullface_off": "Cullface désativée",
"uv_editor.tint_on": "Teinte activée",
"uv_editor.tint_off": "Teinte désactivée",
"action.uv_apply_all": "Appliquer à toutes les faces",
"action.uv_apply_all.desc": "Applique les paramètres de la face actuelle à toutes les faces",
- "message.image_editor_missing.title": "Éditeur d'image par défaut",
+ "message.image_editor_missing.title": "Éditeur d'images par défaut",
"message.image_editor_missing.message": "Sélectionnez le fichier exécutable de votre éditeur d'image.",
- "message.image_editor_missing.detail": "Blockbench n'a pas pu trouver d'éditeur d'image sur votre ordinateur. Sélectionnez le fichier exécutable de votre éditeur d'image préféré.",
+ "message.image_editor_missing.detail": "Blockbench n'a pas pu trouver d'éditeur d'images sur votre ordinateur. Sélectionnez le fichier exécutable de l'éditeur d'images que vous utilisez.",
"action.update_autouv": "Mettre à jour l'UV automatique",
- "action.update_autouv.desc": "Mettre à jour le mappage UV automatique des cubes sélectionnés",
+ "action.update_autouv.desc": "Mettre à jour le mapping UV automatique des cubes sélectionnés",
"category.uv": "UV",
"status_bar.saved": "Le modèle est enregistré",
"status_bar.unsaved": "Il y a des modifications non enregistrées",
@@ -700,30 +700,30 @@
"action.move_right": "Déplacer vers la droite",
"action.move_right.desc": "Déplacer les cubes sélectionnés vers la droite par rapport à l'angle de caméra actuel",
"action.move_forth": "Déplacer vers l'avant",
- "action.move_forth.desc": "Reculer les cubes sélectionnés vers l'avant par rapport à l'angle de la caméra actuelle",
+ "action.move_forth.desc": "Déplacer les cubes sélectionnés vers l'avant par rapport à l'angle de la caméra actuelle",
"action.move_back": "Déplacer vers l'arrière",
- "action.move_back.desc": "Reculer les cubes sélectionnés vers l'arrière par rapport à l'angle de la caméra actuel",
- "layout.color.wireframe": "Maquette",
- "layout.color.wireframe.desc": "Vue en ligne de la maquette",
+ "action.move_back.desc": "Déplacer les cubes sélectionnés vers l'arrière par rapport à l'angle de la caméra actuel",
+ "layout.color.wireframe": "Squelette",
+ "layout.color.wireframe.desc": "Vue squelettique",
"action.add_animation": "Ajouter une animation",
- "action.add_animation.desc": "Créer un animation vide",
+ "action.add_animation.desc": "Créer une animation vierge",
"action.load_animation_file": "Importer une animation",
"action.load_animation_file.desc": "Importer un fichier d'animation",
- "action.play_animation": "Jouer les animations",
+ "action.play_animation": "Jouer l'animation",
"action.play_animation.desc": "Prévisualiser l'animation sélectionnée",
- "action.export_animation_file": "Exporter l'animation",
- "action.export_animation_file.desc": "Exporter un fichier json avec les animations en cours",
- "action.slider_keyframe_time": "Code temporel",
- "action.slider_keyframe_time.desc": "Modifier le code temporel des images clés sélectionnées",
- "timeline.rotation": "Tourner",
+ "action.export_animation_file": "Exporter les animations",
+ "action.export_animation_file.desc": "Exporter un fichier json avec les animations actuelles",
+ "action.slider_keyframe_time": "Timecode",
+ "action.slider_keyframe_time.desc": "Modifier le timecode des images sélectionnées",
+ "timeline.rotation": "Rotation",
"timeline.position": "Position",
- "timeline.scale": "Échelle",
- "menu.timeline.add": "Ajouter une image clé",
+ "timeline.scale": "Taille",
+ "menu.timeline.add": "Ajouter une image",
"menu.keyframe.quaternion": "Quaternion",
"panel.animations": "Animations",
- "panel.keyframe": "Image clé",
- "panel.keyframe.type": "Image clé (%0)",
- "generic.delete": "Effacer",
+ "panel.keyframe": "Image",
+ "panel.keyframe.type": "Image (%0)",
+ "generic.delete": "Supprimer",
"generic.rename": "Renommer",
"message.rename_animation": "Renommer l'animation",
"message.animation_update_var": "Variable de mise à jour de l'animation",
@@ -731,34 +731,34 @@
"message.no_bone_selected": "Vous devez sélectionner un os pour faire cela",
"message.duplicate_groups.title": "Dupliquer le nom de l'os",
"message.duplicate_groups.message": "Le nom de cet os existe sur plusieurs os. Cela peut créer des problèmes.",
- "action.select_all_keyframes": "Sélectionner toutes les images clés",
- "action.select_all_keyframes.desc": "Sélectionner toutes les images clés de l'os actuel",
- "action.delete_keyframes": "Supprimer des images clés",
- "action.delete_keyframes.desc": "Supprimer toutes les images clés sélectionnées",
+ "action.select_all_keyframes": "Sélectionner toutes les images",
+ "action.select_all_keyframes.desc": "Sélectionner toutes les images de l'os actuel",
+ "action.delete_keyframes": "Supprimer des images",
+ "action.delete_keyframes.desc": "Supprimer toutes les images sélectionnées",
"menu.animation": "Animation",
"menu.animation.loop": "Boucle",
"menu.animation.override": "Outrepasser",
- "menu.animation.anim_time_update": "Mettre à jour la variable",
- "message.display_skin_model.title": "Skin modèle",
+ "menu.animation.anim_time_update": "Mettre la variable à jour",
+ "message.display_skin_model.title": "Modèle de skin",
"message.display_skin_model.message": "Choisissez le type de votre skin",
"message.display_skin_model.classic": "Classique",
"message.display_skin_model.slim": "Mince",
- "message.bone_material": "Changer le matériel d'un os",
+ "message.bone_material": "Changer le matériau d'un os",
"action.slider_animation_length": "Longueur de l'animation",
"action.slider_animation_length.desc": "Changer la longueur de l'animation selectionnée",
- "menu.group.material": "Mettre un matériel",
+ "menu.group.material": "Sélectionner le matériau",
"action.camera_reset": "Réinitialiser la caméra",
- "action.camera_reset.desc": "Réinitialiser l'angle de la caméra de la prévisualisation actuelle",
- "panel.variable_placeholders": "Espaces réservés aux variables",
+ "action.camera_reset.desc": "Réinitialiser la prévisualisation actuelle à l'angle par défaut",
+ "panel.variable_placeholders": "Espaces de variables",
"panel.variable_placeholders.info": "Lister les variables à prévisualiser par nom=valeur",
- "status_bar.vertex_distance": "Distance: %0",
+ "status_bar.vertex_distance": "Distance : %0",
"dialog.create_gif.title": "Enregistrer un GIF",
"dialog.create_gif.length": "Durée (secondes)",
- "dialog.create_gif.fps": "FPS (Images Par Seconde)",
+ "dialog.create_gif.fps": "FPS",
"dialog.create_gif.compression": "Taux de compression",
"dialog.create_gif.play": "Démarrer l'animation",
"category.animation": "Animation",
- "action.record_model_gif": "Enregistrer le GIF",
+ "action.record_model_gif": "Enregistrer un GIF",
"action.record_model_gif.desc": "Enregistrer un GIF animé du modèle à partir de l'angle actuel",
"display.mirror": "Miroir",
"data.separator": "Séparateur",
@@ -767,31 +767,31 @@
"dialog.toolbar_edit.hidden": "Caché",
"action.export_class_entity": "Exporter une entité Java",
"action.export_class_entity.desc": "Exporter la modèle d'entité en tant que classe Java",
- "settings.seethrough_outline": "Contours de rayons X",
+ "settings.seethrough_outline": "Contours rayons X",
"settings.seethrough_outline.desc": "Afficher les contours à travers des objets",
- "mode.edit": "Editer",
+ "mode.edit": "Éditer",
"mode.paint": "Peindre",
"mode.display": "Afficher",
"mode.animate": "Animer",
- "status_bar.recording_gif": "Enregistrement d'un GIF",
- "status_bar.processing_gif": "Traitement d'un GIF",
- "settings.backup_retain": "Durée de conservation de la sauvegarde",
- "settings.backup_retain.desc": "Définir la durée (en jour) pendant laquelle Blockbench conserve les anciennes sauvegardes",
- "action.rotate_tool": "Tourner",
+ "status_bar.recording_gif": "GIF en cours d'enregistrement",
+ "status_bar.processing_gif": "GIF en cours de traitement",
+ "settings.backup_retain": "Durée de conservation d'une sauvegarde",
+ "settings.backup_retain.desc": "Définir la durée (en jours) pendant laquelle Blockbench conserve les anciennes sauvegardes",
+ "action.rotate_tool": "Pivoter",
"action.rotate_tool.desc": "Outil pour sélectionner et faire pivoter des éléments",
"action.fill_tool": "Pot de peinture",
"action.fill_tool.desc": "Pot de peinture pour remplir les faces entières avec une couleur",
"action.eraser": "Gomme",
- "action.eraser.desc": "Outil de gomme pour remplacer les couleurs d'une texture par de la transparence",
- "action.color_picker": "Pipette à couleurs",
- "action.color_picker.desc": "Outil pour choisir la couleur des pixels sur votre texture",
+ "action.eraser.desc": "Gomme pour remplacer les couleurs d'une texture par de la transparence",
+ "action.color_picker": "Pipette",
+ "action.color_picker.desc": "Sélecteur pour choisir la couleur des pixels sur votre texture",
"action.open_backup_folder": "Ouvrir le dossier de sauvegarde",
- "action.open_backup_folder.desc": "Ouvre le dossier de sauvegarde de Blockbench",
+ "action.open_backup_folder.desc": "Ouvre le dossier de sauvegarde Blockbench",
"switches.mirror": "Miroir UV",
"language_name": "Français",
- "message.plugin_reload": "Recharger %0 plugins locaux",
+ "message.plugin_reload": "%0 plugins locaux rechargés",
"settings.brightness": "Luminosité",
- "settings.brightness.desc": "Luminosité de l'aperçu. La valeur par défaut est 50",
+ "settings.brightness.desc": "Luminosité de l'aperçu. La valeur par défaut est 50.",
"menu.preview.perspective.reset": "Réinitialiser la camera",
"action.fill_mode": "Mode de remplissage",
"action.fill_mode.desc": "Mode de l'outil de remplissage",
@@ -799,66 +799,66 @@
"action.fill_mode.color": "Couleur",
"action.fill_mode.cube": "Cube",
"action.toggle_mirror_uv": "Miroir UV",
- "action.toggle_mirror_uv.desc": "Changer la mise en miroir UV sur l'axe X des cubes sélectionnés.",
- "action.toggle_uv_overlay": "Changer le recouvrement UV",
- "action.toggle_uv_overlay.desc": "Quand c'est activé, affiche toutes les superpositions de cartographie UV au-dessus de la texture.",
+ "action.toggle_mirror_uv.desc": "Activer/désactiver la mise en miroir UV sur l'axe X des cubes sélectionnés.",
+ "action.toggle_uv_overlay": "Changer l'overlay UV",
+ "action.toggle_uv_overlay.desc": "Si activé, affiche toutes les superpositions de mapping UV au-dessus de la texture.",
"menu.texture.blank": "Appliquer aux faces non texturées",
- "dialog.scale.select_overflow": "Sélectionnez débordement",
- "dialog.create_texture.compress": "Compresser le modèle",
+ "dialog.scale.select_overflow": "Sélectionner le débordement",
+ "dialog.create_texture.compress": "Compresser l'étalon",
"action.action_control": "Contrôle d'action",
"action.action_control.desc": "Rechercher et exécuter toute action disponible",
- "keybindings.recording": "Enregistrement des touches de clavier",
+ "keybindings.recording": "Enregistrer un raccourci clavier",
"keybindings.press": "Appuyez sur une touche ou une combinaison de touches ou cliquez n'importe où sur l'écran pour enregistrer votre raccourci clavier.",
- "action.pivot_tool": "Outil de pivot",
- "action.pivot_tool.desc": "Outil pour changer le point de pivot des cubes et des os",
+ "action.pivot_tool": "Outil de rotation",
+ "action.pivot_tool.desc": "Outil pour changer l'origine de rotation des cubes et os",
"action.slider_animation_speed": "Vitesse de lecture",
"action.slider_animation_speed.desc": "Vitesse de lecture de la chronologie en pourcentage",
- "action.previous_keyframe": "Image clé précédente",
- "action.previous_keyframe.desc": "Aller à l'image clé précédente",
- "action.next_keyframe": "Image clé suivante",
- "action.next_keyframe.desc": "Passer à l'image clé suivante",
- "message.outdated_client.title": "Client plus à jour",
+ "action.previous_keyframe": "Image précédente",
+ "action.previous_keyframe.desc": "Aller à l'image précédente",
+ "action.next_keyframe": "Image suivante",
+ "action.next_keyframe.desc": "Passer à l'image suivante",
+ "message.outdated_client.title": "Client obsolète",
"message.outdated_client.message": "Veuillez effectuer la mise à jour vers la dernière version de Blockbench.",
- "action.export_asset_archive": "Télécharger une archive",
+ "action.export_asset_archive": "Télécharger l'archive",
"action.export_asset_archive.desc": "Télécharger une archive avec le modèle et toutes les textures qu'elle contient",
- "action.upload_sketchfab": "Exporter sur Sketchfab",
+ "action.upload_sketchfab": "Upload Sketchfab",
"message.sketchfab.name_or_token": "Veuillez entrer votre jeton Sketchfab et un nom",
- "dialog.sketchfab_uploader.title": "Télécharger un modèle Sketchfab",
+ "dialog.sketchfab_uploader.title": "Uploader un modèle Sketchfab",
"dialog.sketchfab_uploader.token": "Jeton d'API",
- "dialog.sketchfab_uploader.about_token": "Le jeton est utilisé pour connecter Blockbench à votre compte Sketchfab. Vous pouvez le trouver sur %0",
+ "dialog.sketchfab_uploader.about_token": "Le jeton est utilisé pour connecter Blockbench à votre compte Sketchfab. Vous pouvez le trouver sur %0.",
"dialog.sketchfab_uploader.name": "Nom du modèle",
"dialog.sketchfab_uploader.description": "Description",
"dialog.sketchfab_uploader.tags": "Tags",
"settings.sketchfab_token": "Jeton Sketchfab",
- "settings.sketchfab_token.desc": "Jeton autorisant Blockbench à télécharger sur votre compte Sketchfab",
- "panel.color": "Couleur\n",
+ "settings.sketchfab_token.desc": "Jeton autorisant Blockbench à uploader sur votre compte Sketchfab",
+ "panel.color": "Couleur",
"data.origin": "Origine",
- "message.sketchfab.success": "Modèle téléchargé avec succès",
- "message.sketchfab.error": "Échec du téléchargement du modèle dans Sketchfab",
- "settings.outliner_colors": "Couleurs du contour",
- "settings.outliner_colors.desc": "Afficher les couleurs du cube dans le contour",
- "action.upload_sketchfab.desc": "Téléchargez votre modèle sur Sketchfab",
+ "message.sketchfab.success": "Modèle uploadé avec succès",
+ "message.sketchfab.error": "Échec de l'upload du modèle sur Sketchfab",
+ "settings.outliner_colors": "Couleurs de la liste",
+ "settings.outliner_colors.desc": "Afficher les couleurs du cube dans la liste",
+ "action.upload_sketchfab.desc": "Uploader votre modèle sur Sketchfab",
"action.element_colors": "Couleurs du cube",
- "action.element_colors.desc": "Afficher les couleurs du cube dans le contour",
- "texture.error.file": "Fichier non trouvé",
- "texture.error.invalid": "Fichier non valide",
+ "action.element_colors.desc": "Montrer les couleurs du cube dans la liste",
+ "texture.error.file": "Fichier introuvable",
+ "texture.error.invalid": "Fichier invalide",
"texture.error.ratio": "Ratio d'aspect invalide",
- "texture.error.parent": "Fichier de texture fourni par le modèle parent",
+ "texture.error.parent": "Texture fournie par le modèle parent",
"message.recover_backup.title": "Récupérer le modèle",
- "message.recover_backup.message": "Blockbench a été fermé sans sauvegarde. Voulez-vous récupérer le modèle ?",
- "message.install_plugin": "Installer le plugin %0",
+ "message.recover_backup.message": "Blockbench a été fermé sans sauvegarder. Voulez-vous récupérer le modèle ?",
+ "message.install_plugin": "Plugin %0 en cours d'installation",
"message.invalid_session.title": "Jeton de session invalide",
"message.invalid_session.message": "La session que vous essayez de rejoindre a expiré ou le jeton fourni n'est pas valide.",
- "dialog.create_texture.power": "Power-of-2 Taille",
- "dialog.create_gif.turn": "Vitesse de pivotement",
- "action.edit_session": "Editer la session...",
- "action.edit_session.desc": "Connectez-vous à une session pour collaborer avec d'autres utilisateurs.",
- "action.reset_keyframe": "Réinitialiser l'image clé",
- "action.reset_keyframe.desc": "Réinitialiser toutes les valeurs des images clés sélectionnées",
- "dialog.edit_session.title": "Editer la session",
- "edit_session.username": "Nom d'utilisateur",
+ "dialog.create_texture.power": "Taille puissance-de-2",
+ "dialog.create_gif.turn": "Vitesse de rotation",
+ "action.edit_session": "Éditer la session…",
+ "action.edit_session.desc": "Connectez-vous à une session de travail pour collaborer avec d'autres utilisateurs",
+ "action.reset_keyframe": "Réinitialiser l'image",
+ "action.reset_keyframe.desc": "Réinitialiser toutes les valeurs des images sélectionnées",
+ "dialog.edit_session.title": "Éditer la session",
+ "edit_session.username": "Pseudo",
"edit_session.token": "Jeton",
- "edit_session.about": "Les sessions d'édition peuvent être utilisées pour collaborer sur des modèles sur Internet. Créez une session, copiez le jeton et envoyez-le à des amis, qui peuvent ensuite l'utiliser pour se joindre.",
+ "edit_session.about": "Les sessions de travail peuvent être utilisées pour collaborer sur des modèles apr Internet. Créez une session, copiez le jeton et envoyez-le à des amis, qui peuvent ensuite l'utiliser pour rejoindre.",
"edit_session.join": "Rejoindre la session",
"edit_session.create": "Créer une session",
"edit_session.quit": "Quitter la session",
@@ -868,17 +868,17 @@
"edit_session.status": "Statut",
"edit_session.hosting": "Hébergement",
"edit_session.connected": "Connecté à une session",
- "dialog.sketchfab_uploader.private": "Privé (Pro)",
- "dialog.sketchfab_uploader.password": "Mot de passe (Pro)",
- "action.toggle_chat": "Voir le chat",
+ "dialog.sketchfab_uploader.private": "Privé (pro)",
+ "dialog.sketchfab_uploader.password": "Mot de passe (pro)",
+ "action.toggle_chat": "Afficher/masquer le chat",
"action.toggle_chat.desc": "Afficher la visibilité de l'historique du chat",
"action.uv_select_all": "Tout sélectionner",
"action.uv_select_all.desc": "Sélectionner toutes les faces dans la boîte de dialogue UV",
"panel.chat": "Chat",
- "edit_session.welcome": "Bienvenue à cette session par %0",
+ "edit_session.welcome": "Bienvenue dans la session de %0",
"dialog.yes": "Oui",
"dialog.no": "Non",
- "generic.remove": "Supprimer",
+ "generic.remove": "Retirer",
"generic.download": "Télécharger",
"generic.search": "Rechercher",
"dates.today": "Aujourd'hui",
@@ -889,25 +889,25 @@
"mode.start.new": "Nouveau",
"mode.start.recent": "Récent",
"format.free": "Modèle libre",
- "format.free.desc": "Modèle sans limites pour Unity etc.",
- "format.java_block": "Bloc/Objet Java",
+ "format.free.desc": "Modèle sans restrictions pour Unity etc.",
+ "format.java_block": "Bloc/item Java",
"format.java_block.desc": "Model de bloc pour Java Edition. La taille et les rotations sont limitées.",
"format.bedrock": "Modèle Bedrock",
"format.bedrock.desc": "Modèle pour Bedrock Edition",
"format.bedrock_old": "Ancien modèle Bedrock",
"format.bedrock_old.desc": "Modèle d'entité Bedrock antérieur à la 1.12",
"format.modded_entity": "Entité modifiée",
- "format.modded_entity.desc": "Modèle d'entité pour les mods. Peut être exporté sous forme de fichiers .java.",
+ "format.modded_entity.desc": "Modèle d'entité pour mods. Peut être exporté sous forme de fichiers .java.",
"format.optifine_entity": "Entité OptiFine",
"format.optifine_entity.desc": "Modèle d'entité personnalisé pour OptiFine",
"keys.mouse": "Bouton de la souris %0",
"message.cleared_blank_faces.title": "Faces vierges",
- "message.cleared_blank_faces.message": "Blockbench a trouvé %0 cubes sans texture. Voulez-vous supprimer ces éléments ?",
- "message.wireframe.enabled": "Vue filaire activée",
- "message.wireframe.disabled": "Vue filaire désactivée",
+ "message.cleared_blank_faces.message": "Blockbench a trouvé %0 cubes sans texture. Voulez-vous supprimer ces éléments ?",
+ "message.wireframe.enabled": "Vue squelettique activée",
+ "message.wireframe.disabled": "Vue squelettique désactivée",
"dialog.project.box_uv": "Boîte UV",
"dialog.convert_project.title": "Convertir le projet",
- "dialog.convert_project.text": "Êtes-vous sûr de vouloir convertir ce projet ? Vous ne pouvez pas annuler cette étape.",
+ "dialog.convert_project.text": "Êtes-vous sûr·e de vouloir convertir ce projet ? Vous ne pourrez pas revenir en arrière.",
"dialog.create_texture.double_use": "Conserver l'occupation de textures multiples",
"dialog.model_stats.title": "Statistiques du modèle",
"dialog.model_stats.cubes": "Cubes",
@@ -915,41 +915,41 @@
"dialog.model_stats.groups": "Groupes",
"dialog.model_stats.vertices": "Sommets",
"dialog.model_stats.faces": "Faces",
- "settings.username": "Nom d'utilisateur",
- "settings.username.desc": "Nom d'utilisateur pour les sessions d'édition",
+ "settings.username": "Pseudo",
+ "settings.username.desc": "Pseudo pour les sessions de travail",
"settings.painting_grid": "Grille de peinture",
"settings.painting_grid.desc": "Afficher la grille sur les cubes texturés en mode peinture",
"action.slider_brush_min_opacity": "Opacité minimale",
- "action.slider_brush_min_opacity.desc": "Opacité minimale de la brosse de bruit en pourcentage",
+ "action.slider_brush_min_opacity.desc": "Opacité minimale de la brosse à bruit en pourcentage",
"action.convert_project": "Convertir le projet",
- "action.convert_project.desc": "Convertir le projet en cours en un projet pour un autre format de modèle",
+ "action.convert_project.desc": "Convertit le projet en cours en un projet pour un autre format de modèle",
"action.close_project": "Fermer le projet",
- "action.close_project.desc": "Fermer le projet actuellement ouvert",
+ "action.close_project.desc": "Ferme le projet actuellement ouvert",
"action.export_bedrock": "Exporter la geométrie Bedrock",
"action.export_bedrock.desc": "Exporter le modèle sous forme de fichier de géométrie Bedrock Edition.",
- "action.save_project": "Sauvegarder le projet",
- "action.save_project.desc": "Sauvegarder le modèle actuel en tant que fichier de projet",
+ "action.save_project": "Enregistrer le projet",
+ "action.save_project.desc": "Enregistre le modèle actuel en tant que fichier de projet",
"action.save_project_as": "Enregistrer le projet sous",
"action.save_project_as.desc": "Enregistre le modèle actuel en tant que fichier de projet à un nouvel emplacement",
"action.export_over": "Écraser le modèle",
- "action.export_over.desc": "Sauvegarde le modèle, les textures et les animations en écrasant les fichiers",
+ "action.export_over.desc": "Enregistre le modèle, les textures et les animations en écrasant les fichiers",
"action.add_locator": "Ajouter un localisateur",
- "action.add_locator.desc": "Ajoute un nouveau localisateur pour contrôler la position des particules, des laisses, etc",
+ "action.add_locator.desc": "Ajoute un nouveau localisateur pour contrôler la position des particules, des laisses, etc.",
"action.sidebar_left": "Textures et UV",
"action.sidebar_left.desc": "Ouvrir l'interface pour les UV et les textures",
- "action.sidebar_right": "Elements",
+ "action.sidebar_right": "Éléments",
"action.sidebar_right.desc": "Ouvrir l'interface pour éditer les éléments",
- "action.uv_turn_mapping": "Tourner le mappage UV",
- "action.uv_turn_mapping.desc": "Tourner le mappage UV d'environ 90 degrés",
- "action.remove_blank_faces": "Enlever les faces vierges",
+ "action.uv_turn_mapping": "Tourner le mapping UV",
+ "action.uv_turn_mapping.desc": "Faire pivoter le mappage UV de 90 degrés",
+ "action.remove_blank_faces": "Retirer les faces vierges",
"action.remove_blank_faces.desc": "Supprime toutes les faces non texturées de la sélection",
"menu.uv.select": "Sélectionner des cubes",
- "web.download_app": "Télécharger l'application",
- "uv_editor.turned": "Mappage UV retournée",
+ "web.download_app": "Télécharger le logiciel",
+ "uv_editor.turned": "Mapping UV tourné",
"display.reference.crossbow": "Arbalète",
- "dialog.settings.search_results": "Rechercher les résultats",
+ "dialog.settings.search_results": "Résultats de recherche",
"settings.animation_snap": "Aligner les animations",
- "settings.animation_snap.desc": "Intervalle de Snap des clés d'animation dans la ligne de temps, en pas par seconde",
+ "settings.animation_snap.desc": "Intervalle d'alignement des images de l'animation dans la timeline en pas par seconde",
"action.import_optifine_part": "Importer une partie OptiFine",
"action.import_optifine_part.desc": "Importer une partie d'entité pour un modèle OptiFine",
"data.locator": "Localisateur",
@@ -957,31 +957,33 @@
"panel.element": "Élément",
"panel.element.position": "Position",
"panel.element.size": "Taille",
- "panel.element.origin": "Point de pivot",
+ "panel.element.origin": "Origine de rotation",
"panel.element.rotation": "Rotation",
- "message.canvas_limit_error.title": "Canvas Limit Error",
- "message.canvas_limit_error.message": "The action could not be performed correctly because the format limits the canvas to 48 units. Shift the pivot point to prevent this.",
- "data.effect": "Effect",
- "generic.name": "Name",
- "settings.recent_projects": "Recent Model Cap",
- "settings.recent_projects.desc": "Maximum number of recent models to remember",
+ "message.canvas_limit_error.title": "Erreur de limite du canevas",
+ "message.canvas_limit_error.message": "L'action n'a pu être effectuée correctement car le format limite le canevas à 48 unités. Décalez l'origine de rotation pour empêcher cela.",
+ "data.effect": "Effet",
+ "generic.name": "Nom",
+ "settings.recent_projects": "Limite de modèles récents",
+ "settings.recent_projects.desc": "Nombre maximal de modèles récents à garder en mémoire",
"settings.volume": "Volume",
- "settings.volume.desc": "Volume control for sound effects in animations",
- "action.change_keyframe_file": "Select File",
- "action.change_keyframe_file.desc": "Select an audio file to preview a sound effect.",
- "action.clear_timeline": "Clear Timeline",
- "action.clear_timeline.desc": "Clear all unselected bones from the timeline",
- "action.select_effect_animator": "Animate Effects",
- "action.select_effect_animator.desc": "Opens timeline to add sound and particle effects",
- "action.timeline_focus": "Channel",
- "action.timeline_focus.desc": "Select the animation channels to display in the timeline",
- "action.timeline_focus.all": "All",
- "timeline.particle": "Particle",
- "timeline.sound": "Sound",
- "timeline.effects": "Effects",
+ "settings.volume.desc": "Contrôle du volume pour les effets sonores des animations",
+ "action.change_keyframe_file": "Sélectionner un fichier",
+ "action.change_keyframe_file.desc": "Sélectionner un fichier audio pour prévisualiser un effet sonore.",
+ "action.clear_timeline": "Vider la timeline",
+ "action.clear_timeline.desc": "Effacer tous les os non sélectionnés de la timeline",
+ "action.select_effect_animator": "Effets et animation",
+ "action.select_effect_animator.desc": "Ouvre la timeline pour ajouter du son et des particules",
+ "action.timeline_focus": "Canal",
+ "action.timeline_focus.desc": "Sélectionner les canaux d'animation à afficher dans la timeline",
+ "action.timeline_focus.all": "Tout",
+ "timeline.particle": "Particule",
+ "timeline.sound": "Son",
+ "timeline.effects": "Effets",
"data.format": "Format",
- "format.optifine_part": "OptiFine Part",
- "format.optifine_part.desc": "JPM part for OptiFine entity models",
- "action.reverse_keyframes": "Reverse Keyframes",
- "action.reverse_keyframes.desc": "Reverse the order of the selected keyframes"
+ "format.optifine_part": "Partie OptiFine",
+ "format.optifine_part.desc": "Partie JPM pour modèle d'entité OptiFine",
+ "action.reverse_keyframes": "Retourner la séquence",
+ "action.reverse_keyframes.desc": "Renverse l'ordre des images sélectionnées",
+ "message.no_format_import.title": "Write-only Format",
+ "message.no_format_import.message": "Please note that this export format is write-only. To be able to open the model again, you need to also save it as a project."
}
\ No newline at end of file
diff --git a/lang/it.json b/lang/it.json
index 21cda1a2..95e2d994 100644
--- a/lang/it.json
+++ b/lang/it.json
@@ -983,5 +983,7 @@
"format.optifine_part": "OptiFine Part",
"format.optifine_part.desc": "JPM part for OptiFine entity models",
"action.reverse_keyframes": "Reverse Keyframes",
- "action.reverse_keyframes.desc": "Reverse the order of the selected keyframes"
+ "action.reverse_keyframes.desc": "Reverse the order of the selected keyframes",
+ "message.no_format_import.title": "Write-only Format",
+ "message.no_format_import.message": "Please note that this export format is write-only. To be able to open the model again, you need to also save it as a project."
}
\ No newline at end of file
diff --git a/lang/ja.json b/lang/ja.json
index dc76aa16..c61697e3 100644
--- a/lang/ja.json
+++ b/lang/ja.json
@@ -831,7 +831,7 @@
"dialog.sketchfab_uploader.tags": "Tag",
"settings.sketchfab_token": "Sketchfab Token",
"settings.sketchfab_token.desc": "BlockbenchにSketchfabアカウントへのアップロードを許可する",
- "panel.color": "カラー",
+ "panel.color": "Color",
"data.origin": "原点",
"message.sketchfab.success": "モデルのアップロードに成功",
"message.sketchfab.error": "Sketchfab:モデルアップロードに失敗しました",
@@ -954,22 +954,22 @@
"action.import_optifine_part.desc": "OptiFineエンティティモデルをインポートします",
"data.locator": "ロケーター",
"mode.start.no_recents": "最近開いたモデルはありません",
- "panel.element": "エレメント",
+ "panel.element": "Element",
"panel.element.position": "Position",
"panel.element.size": "Size",
"panel.element.origin": "Center",
"panel.element.rotation": "Rotation",
"message.canvas_limit_error.title": "キャンバス制限エラー",
"message.canvas_limit_error.message": "フォーマットによってキャンバスが48単位に制限されているため、アクションを正しく実行できませんでした。",
- "data.effect": "Effect",
- "generic.name": "Name",
+ "data.effect": "エフェクト",
+ "generic.name": "名前",
"settings.recent_projects": "Recent Model Cap",
"settings.recent_projects.desc": "Maximum number of recent models to remember",
"settings.volume": "Volume",
"settings.volume.desc": "Volume control for sound effects in animations",
- "action.change_keyframe_file": "Select File",
+ "action.change_keyframe_file": "ファイルを選択",
"action.change_keyframe_file.desc": "Select an audio file to preview a sound effect.",
- "action.clear_timeline": "Clear Timeline",
+ "action.clear_timeline": "タイムラインをクリアー",
"action.clear_timeline.desc": "Clear all unselected bones from the timeline",
"action.select_effect_animator": "Animate Effects",
"action.select_effect_animator.desc": "Opens timeline to add sound and particle effects",
@@ -983,5 +983,7 @@
"format.optifine_part": "OptiFine Part",
"format.optifine_part.desc": "JPM part for OptiFine entity models",
"action.reverse_keyframes": "Reverse Keyframes",
- "action.reverse_keyframes.desc": "Reverse the order of the selected keyframes"
+ "action.reverse_keyframes.desc": "Reverse the order of the selected keyframes",
+ "message.no_format_import.title": "Write-only Format",
+ "message.no_format_import.message": "Please note that this export format is write-only. To be able to open the model again, you need to also save it as a project."
}
\ No newline at end of file
diff --git a/lang/nl.json b/lang/nl.json
index 3286eda4..b858bb11 100644
--- a/lang/nl.json
+++ b/lang/nl.json
@@ -983,5 +983,7 @@
"format.optifine_part": "OptiFine Part",
"format.optifine_part.desc": "JPM part for OptiFine entity models",
"action.reverse_keyframes": "Reverse Keyframes",
- "action.reverse_keyframes.desc": "Reverse the order of the selected keyframes"
+ "action.reverse_keyframes.desc": "Reverse the order of the selected keyframes",
+ "message.no_format_import.title": "Write-only Format",
+ "message.no_format_import.message": "Please note that this export format is write-only. To be able to open the model again, you need to also save it as a project."
}
\ No newline at end of file
diff --git a/lang/pl.json b/lang/pl.json
index c5b1adac..1c6c1d6b 100644
--- a/lang/pl.json
+++ b/lang/pl.json
@@ -983,5 +983,7 @@
"format.optifine_part": "OptiFine Part",
"format.optifine_part.desc": "JPM part for OptiFine entity models",
"action.reverse_keyframes": "Reverse Keyframes",
- "action.reverse_keyframes.desc": "Reverse the order of the selected keyframes"
+ "action.reverse_keyframes.desc": "Reverse the order of the selected keyframes",
+ "message.no_format_import.title": "Write-only Format",
+ "message.no_format_import.message": "Please note that this export format is write-only. To be able to open the model again, you need to also save it as a project."
}
\ No newline at end of file
diff --git a/lang/pt.json b/lang/pt.json
index 9f2fae6e..daaad95b 100644
--- a/lang/pt.json
+++ b/lang/pt.json
@@ -983,5 +983,7 @@
"format.optifine_part": "OptiFine Part",
"format.optifine_part.desc": "JPM part for OptiFine entity models",
"action.reverse_keyframes": "Reverse Keyframes",
- "action.reverse_keyframes.desc": "Reverse the order of the selected keyframes"
+ "action.reverse_keyframes.desc": "Reverse the order of the selected keyframes",
+ "message.no_format_import.title": "Write-only Format",
+ "message.no_format_import.message": "Please note that this export format is write-only. To be able to open the model again, you need to also save it as a project."
}
\ No newline at end of file
diff --git a/lang/ru.json b/lang/ru.json
index 74353612..6e8fb71f 100644
--- a/lang/ru.json
+++ b/lang/ru.json
@@ -1,19 +1,19 @@
{
- "dialog.ok": "Ок",
- "dialog.cancel": "Отмена",
- "dialog.confirm": "Подтвердить",
- "dialog.close": "Закрыть",
- "dialog.import": "Импорт",
- "dialog.save": "Сохранить",
- "dialog.discard": "Не сохранять",
- "dialog.dontshowagain": "Не показывать снова",
- "data.cube": "Куб",
- "data.group": "Группа",
- "data.texture": "Текстура",
- "data.plugin": "Плагин",
- "data.preview": "Предпросмотр",
- "data.toolbar": "Инструменты",
- "data.image": "Изображение",
+ "dialog.ok": "OK",
+ "dialog.cancel": "Cancel",
+ "dialog.confirm": "Confirm",
+ "dialog.close": "Close",
+ "dialog.import": "Import",
+ "dialog.save": "Save",
+ "dialog.discard": "Discard",
+ "dialog.dontshowagain": "Don't Show Again",
+ "data.cube": "Cube",
+ "data.group": "Group",
+ "data.texture": "Texture",
+ "data.plugin": "Plugin",
+ "data.preview": "Preview",
+ "data.toolbar": "Toolbar",
+ "data.image": "Image",
"keys.ctrl": "Control",
"keys.shift": "Shift",
"keys.alt": "Alt",
@@ -983,5 +983,7 @@
"format.optifine_part": "OptiFine Part",
"format.optifine_part.desc": "JPM part for OptiFine entity models",
"action.reverse_keyframes": "Reverse Keyframes",
- "action.reverse_keyframes.desc": "Reverse the order of the selected keyframes"
+ "action.reverse_keyframes.desc": "Reverse the order of the selected keyframes",
+ "message.no_format_import.title": "Write-only Format",
+ "message.no_format_import.message": "Please note that this export format is write-only. To be able to open the model again, you need to also save it as a project."
}
\ No newline at end of file
diff --git a/lang/sv.json b/lang/sv.json
index bf177c54..cd96f7cf 100644
--- a/lang/sv.json
+++ b/lang/sv.json
@@ -983,5 +983,7 @@
"format.optifine_part": "OptiFine Part",
"format.optifine_part.desc": "JPM part for OptiFine entity models",
"action.reverse_keyframes": "Reverse Keyframes",
- "action.reverse_keyframes.desc": "Reverse the order of the selected keyframes"
+ "action.reverse_keyframes.desc": "Reverse the order of the selected keyframes",
+ "message.no_format_import.title": "Write-only Format",
+ "message.no_format_import.message": "Please note that this export format is write-only. To be able to open the model again, you need to also save it as a project."
}
\ No newline at end of file
diff --git a/lang/zh.json b/lang/zh.json
index 6fd8df56..0c60f0b8 100644
--- a/lang/zh.json
+++ b/lang/zh.json
@@ -983,5 +983,7 @@
"format.optifine_part": "OptiFine Part",
"format.optifine_part.desc": "JPM part for OptiFine entity models",
"action.reverse_keyframes": "Reverse Keyframes",
- "action.reverse_keyframes.desc": "Reverse the order of the selected keyframes"
+ "action.reverse_keyframes.desc": "Reverse the order of the selected keyframes",
+ "message.no_format_import.title": "Write-only Format",
+ "message.no_format_import.message": "Please note that this export format is write-only. To be able to open the model again, you need to also save it as a project."
}
\ No newline at end of file
diff --git a/package.json b/package.json
index d1379e0d..130c365d 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "Blockbench",
"description": "Model editing and animation software",
- "version": "3.1.0",
+ "version": "3.1.1",
"license": "MIT",
"author": {
"name": "JannisX11",