Merge branch 'develop' of https://bitbucket.org/wisemapping/wisemapping-frontend into feature/import-freemind-to-wisemapping

This commit is contained in:
Ezequiel-Vega 2022-03-18 14:23:26 -03:00
commit 968623e4f0
53 changed files with 2039 additions and 111 deletions

View File

@ -0,0 +1,14 @@
{
"editor.try-welcome": {
"defaultMessage": "这个编辑区域展示了一些思维导图编辑器的功能!"
},
"editor.try-welcome-description": {
"defaultMessage": "注册后可以免费创建、分享和发布无限数量的思维导图。"
},
"login.signup": {
"defaultMessage": "注册"
},
"action.share": {
"defaultMessage": "分享"
}
}

View File

@ -8,8 +8,8 @@
"cy:run": "cypress run",
"test:integration": "start-server-and-test 'yarn playground' http-get://localhost:8081 'yarn cy:run'",
"test": "yarn test:integration",
"extract": "for lang in {'es','en','fr','de'};do formatjs extract 'src/**/*.ts*' --ignore 'src/@types/**/*' --out-file lang/${lang}.json;done",
"compile": "formatjs compile"
"i18n:extract": "formatjs extract 'src/**/*.ts*' --ignore 'src/@types/**/*' --out-file lang/es.json",
"i18n:compile": "for lang in {'es','en','fr','de','zh','ru'};do formatjs compile lang/${lang}.json --ast --out-file src/compiled-lang/${lang}.json;done"
},
"repository": "http://www.wisemapping.com",
"author": "Paulo Veiga <pveiga@gmail.com>, Ezequiel Bergamaschi <ezequielbergamaschi@gmail.com>",

View File

@ -3,6 +3,8 @@ import ES from './../../compiled-lang/es.json';
import EN from './../../compiled-lang/en.json';
import DE from './../../compiled-lang/de.json';
import RU from './../../compiled-lang/ru.json';
import ZH from './../../compiled-lang/zh.json';
class I18nMsg {
static loadLocaleData(locale: string) {
@ -17,6 +19,8 @@ class I18nMsg {
return DE;
case 'ru':
return RU;
case 'zh':
return ZH;
default:
return EN;
}

View File

@ -126,6 +126,16 @@ class KeyboardShortcutDialog extends BootstrapDialog {
<td>Ctrl + b</td>
<td> + b</td>
</tr>
<tr>
<td>${$msg('TOPIC_NOTE')}</td>
<td>Ctrl + k</td>
<td> + k</td>
</tr>
<tr>
<td>${$msg('TOPIC_LINK')}</td>
<td>Ctrl + l</td>
<td> + l</td>
</tr>
</tbody>
</table>
</div>`);

View File

@ -33,8 +33,6 @@ import { $msg } from '@wisemapping/mindplot';
class Menu extends IMenu {
constructor(designer: Designer, containerId: string, readOnly = false, baseUrl = '') {
super(designer, containerId);
const saveElem = $('#save');
const widgetsBaseUrl = `${baseUrl}css/widget`;
// Create panels ...
@ -213,7 +211,7 @@ class Menu extends IMenu {
if (undoButton) {
undoButton.disable();
}
Menu._registerTooltip('undoEdition', $msg('UNDO'), 'meta+Z');
Menu._registerTooltip('undoEdition', $msg('UNDO'));
const redoButton = this._addButton('redoEdition', false, false, () => {
designer.redo();
@ -221,7 +219,7 @@ class Menu extends IMenu {
if (redoButton) {
redoButton.disable();
}
Menu._registerTooltip('redoEdition', $msg('REDO'), 'meta+shift+Z');
Menu._registerTooltip('redoEdition', $msg('REDO'));
if (redoButton && undoButton) {
designer.addEvent('modelUpdate', (event) => {
@ -241,12 +239,12 @@ class Menu extends IMenu {
this._addButton('addTopic', true, false, () => {
designer.createSiblingForSelectedNode();
});
Menu._registerTooltip('addTopic', $msg('ADD_TOPIC'), 'Enter');
Menu._registerTooltip('addTopic', $msg('ADD_TOPIC'));
this._addButton('deleteTopic', true, true, () => {
designer.deleteSelectedEntities();
});
Menu._registerTooltip('deleteTopic', $msg('TOPIC_DELETE'), 'Delete');
Menu._registerTooltip('deleteTopic', $msg('TOPIC_DELETE'));
this._addButton('topicLink', true, false, () => {
designer.addLink();
@ -274,14 +272,16 @@ class Menu extends IMenu {
Menu._registerTooltip('fontItalic', $msg('FONT_ITALIC'), 'meta+I');
if (saveElem) {
if (!readOnly) {
// Register action on save ...
const saveElem = $('#save');
this._addButton('save', false, false,
() => {
this.save(saveElem, designer, true);
});
Menu._registerTooltip('save', $msg('SAVE'), 'meta+S');
Menu._registerTooltip('save', $msg('SAVE'));
if (!readOnly) {
// Register unload save ...
window.addEventListener('beforeunload', () => {
if (this.isSaveRequired()) {
this.save(saveElem, designer, false);
@ -299,7 +299,6 @@ class Menu extends IMenu {
);
}
}
}
Menu._registerTooltip('export', $msg('EXPORT'));

View File

@ -0,0 +1,26 @@
{
"action.share": [
{
"type": 0,
"value": "分享"
}
],
"editor.try-welcome": [
{
"type": 0,
"value": "这个编辑区域展示了一些思维导图编辑器的功能!"
}
],
"editor.try-welcome-description": [
{
"type": 0,
"value": "注册后可以免费创建、分享和发布无限数量的思维导图。"
}
],
"login.signup": [
{
"type": 0,
"value": "注册"
}
]
}

View File

@ -30,7 +30,7 @@ const initialization = (designer: Designer) => {
});
};
const persistence = new LocalStorageManager('samples/{id}.wxml', false);
const persistence = new LocalStorageManager('samples/{id}.wxml', false, false);
const mapId = 'welcome';
const options: EditorOptions = {
zoom: 0.8,

View File

@ -0,0 +1 @@
<map name="1276321" version="tango"><topic central="true" text="sss" id="1"><icon id="onoff_status_offline"/><topic position="99,0" order="0" text="sssss" shrink="true" id="7" bgColor="rgb(224,229,239)"><icon id="chart_organisation"/><topic position="176,5" order="0" text="sss" id="2" bgColor="rgb(224,229,239)"/></topic><topic position="-79,0" order="1" text="1" id="5" bgColor="rgb(224,229,239)"><topic position="-133,-112" order="0" text="2" id="4" bgColor="rgb(224,229,239)"/><topic position="-133,0" order="1" text="1" id="6" bgColor="rgb(224,229,239)"><topic position="-186,-80" order="0" text="1" id="14" bgColor="rgb(224,229,239)"/><topic position="-186,-48" order="1" text="2" id="15" bgColor="rgb(224,229,239)"/><topic position="-186,-16" order="2" text="4" id="17" bgColor="rgb(224,229,239)"/><topic position="-186,16" order="3" text="3" id="16" bgColor="rgb(224,229,239)"/><topic position="-186,48" order="4" text="5" id="18" bgColor="rgb(224,229,239)"/><topic position="-186,80" order="5" text="6" id="19" bgColor="rgb(224,229,239)"/></topic><topic position="-133,112" order="2" text="1" id="13" bgColor="rgb(224,229,239)"/></topic></topic></map>

View File

@ -1,6 +1,6 @@
{
"name": "@wisemapping/mindplot",
"version": "5.0.8",
"version": "5.0.9",
"description": "WiseMapping - Mindplot Canvas Library",
"homepage": "http://www.wisemapping.org/",
"directories": {

View File

@ -117,6 +117,20 @@ class DesignerKeyboard extends Keyboard {
designer.copyToClipboard();
},
);
this.addShortcut(
['ctrl+l', 'meta+l'], (event: Event) => {
event.preventDefault();
event.stopPropagation();
designer.addLink();
},
);
this.addShortcut(
['ctrl+k', 'meta+k'], (event: Event) => {
event.preventDefault();
event.stopPropagation();
designer.addNote();
},
);
this.addShortcut(
['ctrl+v', 'meta+v'], (event: Event) => {
event.preventDefault();

View File

@ -32,12 +32,13 @@ class LocalStorageManager extends PersistenceManager {
this.readOnly = readOnly;
}
saveMapXml(mapId: string, mapDoc: Document): void {
saveMapXml(mapId: string, mapDoc: Document, _pref: string, _saveHistory: boolean, events): void {
const mapXml = new XMLSerializer().serializeToString(mapDoc);
if (!this.readOnly) {
localStorage.setItem(`${mapId}-xml`, mapXml);
events.onSuccess();
}
console.log(`Map XML to save => ${this.saveMapXml}`);
console.log(`Map XML to save => ${mapXml}`);
}
discardChanges(mapId: string) {

View File

@ -21,6 +21,7 @@ import EN from './en';
import DE from './de';
import FR from './fr';
import RU from './ru';
import ZH from './zh';
const Bundle = {
es: ES,
@ -28,6 +29,7 @@ const Bundle = {
de: DE,
fr: FR,
ru: RU,
zh: ZH,
};
export default Bundle;

View File

@ -79,7 +79,7 @@ const DE = {
MULTIPLE_LINES: 'Füge mehrer Textzeilen hinzu',
BACK_TO_MAP_LIST: 'Zurück zur Kartenliste',
KEYBOARD_SHOTCUTS: 'Tastaturkürzel',
PASTE_URL_HERE: 'Fügen Sie hier die gewünschte URL-Adresse ein:',
};
export default DE;

View File

@ -79,6 +79,7 @@ const EN = {
MULTIPLE_LINES: 'Add multiple text lines',
BACK_TO_MAP_LIST: 'Back to Maps List',
KEYBOARD_SHOTCUTS: 'Keyboard Shorcuts',
PASTE_URL_HERE: 'Paste your url address here:',
};
export default EN;

View File

@ -79,6 +79,7 @@ const ES = {
MULTIPLE_LINES: 'Ajouter plusieurs lignes de texte',
BACK_TO_MAP_LIST: 'Volver a la lista de mapas',
KEYBOARD_SHOTCUTS: 'Métodos abreviados de teclado',
PASTE_URL_HERE: 'Copie la URL que desea aca:',
};
export default ES;

View File

@ -79,6 +79,7 @@ const FR = {
MULTIPLE_LINES: 'Ajouter plusieurs lignes de texte',
BACK_TO_MAP_LIST: 'Retour à la liste des cartes',
KEYBOARD_SHOTCUTS: 'Raccourcis clavier',
PASTE_URL_HERE: 'Collez l\'adresse URL souhaitée ici :',
};
export default FR;

View File

@ -79,6 +79,7 @@ const EN = {
MULTIPLE_LINES: 'Add multiple text lines',
BACK_TO_MAP_LIST: 'Back to Maps List',
KEYBOARD_SHOTCUTS: 'Keyboard Shorcuts',
PASTE_URL_HERE: 'Вставьте нужный URL-адрес здесь:',
};
export default EN;

View File

@ -0,0 +1,86 @@
const ZH = {
ZOOM_IN: '放大',
ZOOM_OUT: '缩小',
TOPIC_SHAPE: '主题形状',
TOPIC_ADD: '添加主题',
TOPIC_DELETE: '删除主题',
TOPIC_ICON: '添加图标',
TOPIC_LINK: '添加链接',
TOPIC_RELATIONSHIP: '关系',
TOPIC_COLOR: '主题颜色',
TOPIC_BORDER_COLOR: '主题边框颜色',
TOPIC_NOTE: '添加注释',
FONT_FAMILY: '字体类型',
FONT_SIZE: '文本大小',
FONT_BOLD: '粗体文本',
FONT_ITALIC: '斜体文本',
UNDO: '撤销',
REDO: '重做',
INSERT: '插入',
SAVE: '保存',
NOTE: '注释',
ADD_TOPIC: '添加主题',
LOADING: '加载......',
EXPORT: '导出',
PRINT: '打印',
PUBLISH: '发布',
COLLABORATE: '分享',
HISTORY: '历史',
DISCARD_CHANGES: '放弃更改',
FONT_COLOR: '文本颜色',
SAVING: '保存......',
SAVE_COMPLETE: '保存完成',
ZOOM_IN_ERROR: '放大比例过高。',
ZOOM_ERROR: '无法再缩放了。',
ONLY_ONE_TOPIC_MUST_BE_SELECTED: '无法创建主题。只能选择一个主题。',
ONE_TOPIC_MUST_BE_SELECTED: '无法创建主题。必须选择一个主题。',
ONLY_ONE_TOPIC_MUST_BE_SELECTED_COLLAPSE: '无法折叠子节点,必须只选择一个主题。',
SAVE_COULD_NOT_BE_COMPLETED: '无法完成保存,请稍后再试。',
UNEXPECTED_ERROR_LOADING: '我们很抱歉,发生了意外错误。\n再次尝试重新加载编辑器。如果问题仍然存在请联系我们support@wisemapping.com。',
MAIN_TOPIC: '重点主题',
SUB_TOPIC: '子主题',
ISOLATED_TOPIC: '独立主题',
CENTRAL_TOPIC: '中心主题',
SHORTCUTS: '键盘快捷键',
ENTITIES_COULD_NOT_BE_DELETED: '无法删除主题或关系。至少选择一个脑图实体。',
AT_LEAST_ONE_TOPIC_MUST_BE_SELECTED: '至少要选择一个主题',
CLIPBOARD_IS_EMPTY: '没有东西可以复制。剪贴板是空的。',
CENTRAL_TOPIC_CAN_NOT_BE_DELETED: '无法删除中心主题。',
RELATIONSHIP_COULD_NOT_BE_CREATED: '无法创建关系。必须先选择要建立关系的主题。',
SELECTION_COPIED_TO_CLIPBOARD: '主题已复制到剪贴板',
WRITE_YOUR_TEXT_HERE: '在这里写你的注释......',
REMOVE: '删除',
ACCEPT: '接受',
CANCEL: '取消',
LINK: '链接',
OPEN_LINK: '打开URL',
SESSION_EXPIRED: '您的会话已过期,请重新登录。',
URL_ERROR: 'URL无效',
ACTION: '操作',
CREATE_SIBLING_TOPIC: '创建并行主题',
CREATE_CHILD_TOPIC: '创建子主题',
DELETE_TOPIC: '删除主题',
EDIT_TOPIC_TEXT: '编辑主题文本',
JUST_START_TYPING: '开始打字',
CANCEL_TEXT_CHANGES: '取消文本更改',
TOPIC_NAVIGATION: '主题导航',
ARROW_KEYS: '方向按键',
SELECT_MULTIPLE_NODES: '选择多个节点',
UNDO_EDITION: '撤销编辑',
REDO_EDITION: '重做修改',
SELECT_ALL_TOPIC: '选择所有主题',
CHANGE_TEXT_BOLD: '更改粗体文本',
SAVE_CHANGES: '保存更改',
CHANGE_TEXT_ITALIC: '更改斜体文本',
DESELECT_ALL_TOPIC: '取消选择所有主题',
COLLAPSE_CHILDREN: '折叠子节点',
KEYBOARD_SHORTCUTS_MSG: '键盘快捷键可以让你永远不用把手从键盘上拿开来使用鼠标,从而帮助你节省时间。',
COPY_AND_PASTE_TOPICS: '复制和粘贴主题',
MULTIPLE_LINES: '添加多行文本',
BACK_TO_MAP_LIST: '回到脑图列表',
KEYBOARD_SHOTCUTS: '键盘快捷键',
PASTE_URL_HERE: '在此处粘贴所需的 URL 地址:',
};
export default ZH;

View File

@ -411,6 +411,7 @@ class XMLSerializerTango implements XMLMindmapSerializer {
if (topic.getType() !== 'CentralTopic') {
topic
.getChildren()
.sort((a, b) => a.getOrder() - b.getOrder())
.forEach((child, index) => {
if (child.getOrder() !== index) {
child.setOrder(index);
@ -444,7 +445,7 @@ class XMLSerializerTango implements XMLMindmapSerializer {
return value;
}
static _deserializeNodeText(domElem) {
static _deserializeNodeText(domElem: ChildNode) {
const children = domElem.childNodes;
let value = null;
for (let i = 0; i < children.length; i++) {
@ -456,7 +457,7 @@ class XMLSerializerTango implements XMLMindmapSerializer {
return value;
}
static _deserializeRelationship(domElement, mindmap) {
static _deserializeRelationship(domElement: Element, mindmap: Mindmap): RelationshipModel {
const srcId = Number.parseInt(domElement.getAttribute('srcTopicId'), 10);
const destId = Number.parseInt(domElement.getAttribute('destTopicId'), 10);
const lineType = Number.parseInt(domElement.getAttribute('lineType'), 10);
@ -467,6 +468,7 @@ class XMLSerializerTango implements XMLMindmapSerializer {
if (srcId === destId) {
throw new Error('Invalid relationship, dest and source are equals');
}
// Is the connections points valid ?. If it's not, do not load the relationship ...
if (mindmap.findNodeById(srcId) == null || mindmap.findNodeById(destId) == null) {
throw new Error('Transition could not created, missing node for relationship');
@ -480,8 +482,8 @@ class XMLSerializerTango implements XMLMindmapSerializer {
if ($defined(destCtrlPoint) && destCtrlPoint !== '') {
model.setDestCtrlPoint(Point.fromString(destCtrlPoint));
}
model.setEndArrow('false');
model.setStartArrow('true');
model.setEndArrow(false);
model.setStartArrow(true);
return model;
}

View File

@ -49,7 +49,7 @@ class LinkEditor extends BootstrapDialog {
action: 'none',
id: 'linkFormId',
});
const text = $('<p></p>').text('Paste your url here:');
const text = $('<p></p>').text($msg('PASTE_URL_HERE'));
text.css('margin', '0px 0px 20px');
this.form.append(text);

View File

@ -23,7 +23,7 @@ import { $msg } from '../Messages';
class NoteEditor extends BootstrapDialog {
constructor(model) {
$assert(model, 'model can not be null');
super($msg('Note'), {
super($msg('NOTE'), {
cancelButton: true,
closeButton: true,
acceptButton: true,

View File

@ -6,14 +6,14 @@
- Naturaleza
- Animales, Plantas, Piedras
- Arqueología
- Culturas Antiguas
- Egipto, Grecia, China...
- Energía
- Paleontología
- Astronomía
- Arquitectura
- Cocina
- Poesía
- Culturas Antiguas
- Egipto, Grecia, China...
- Paleontología
- Duración limitada: 5-6 semanas
- Niños y niñas que quieren saber más
- Alternativa a otras actividades de ocio
@ -25,11 +25,11 @@
- Actividades centradas en el contexto cercano
- Flexibilidad en el uso de las lenguas de trabajo (inglés, castellano, esukara?)
- Complementamos el trabajo de la escuela[^1]
- SaberMás trabaja con, desde y para la motivación
- Trabajamos en equipo en nuestros proyectos
- Cada uno va a su ritmo, y cada cual pone sus límites
- Aprendemos todos de todos
- Valoramos lo que hemos aprendido
- SaberMás trabaja con, desde y para la motivación
- Trabajamos en equipo en nuestros proyectos

View File

@ -7,15 +7,15 @@
<node ID="ID_17" POSITION="right" STYLE="fork" TEXT="Animales, Plantas, Piedras"/>
</node>
<node ID="ID_21" POSITION="right" STYLE="fork" TEXT="Arqueología"/>
<node ID="ID_25" POSITION="right" STYLE="fork" TEXT="Culturas Antiguas">
<node ID="ID_26" POSITION="right" STYLE="fork" TEXT="Egipto, Grecia, China..."/>
</node>
<node ID="ID_18" POSITION="right" STYLE="fork" TEXT="Energía"/>
<node ID="ID_38" POSITION="right" STYLE="fork" TEXT="Paleontología"/>
<node ID="ID_16" POSITION="right" STYLE="fork" TEXT="Astronomía"/>
<node ID="ID_20" POSITION="right" STYLE="fork" TEXT="Arquitectura"/>
<node ID="ID_11" POSITION="right" STYLE="fork" TEXT="Cocina"/>
<node ID="ID_24" POSITION="right" STYLE="fork" TEXT="Poesía"/>
<node ID="ID_25" POSITION="right" STYLE="fork" TEXT="Culturas Antiguas">
<node ID="ID_26" POSITION="right" STYLE="fork" TEXT="Egipto, Grecia, China..."/>
</node>
<node ID="ID_38" POSITION="right" STYLE="fork" TEXT="Paleontología"/>
</node>
<node ID="ID_6" POSITION="left" STYLE="fork" TEXT="Duración limitada: 5-6 semanas"/>
<node ID="ID_7" POSITION="left" STYLE="fork" TEXT="Niños y niñas que quieren saber más"/>
@ -41,11 +41,11 @@
</body>
</html>
</richcontent>
<node ID="ID_28" POSITION="right" TEXT="SaberMás trabaja con, desde y para la motivación"/>
<node ID="ID_32" POSITION="right" STYLE="fork" TEXT="Trabajamos en equipo en nuestros proyectos "/>
<node ID="ID_30" POSITION="right" STYLE="fork" TEXT="Cada uno va a su ritmo, y cada cual pone sus límites"/>
<node ID="ID_31" POSITION="right" STYLE="fork" TEXT="Aprendemos todos de todos"/>
<node ID="ID_33" POSITION="right" STYLE="fork" TEXT="Valoramos lo que hemos aprendido"/>
<node ID="ID_28" POSITION="right" TEXT="SaberMás trabaja con, desde y para la motivación"/>
<node ID="ID_32" POSITION="right" STYLE="fork" TEXT="Trabajamos en equipo en nuestros proyectos "/>
</node>
</node>
</map>

View File

@ -5,14 +5,14 @@
1.3.1 Naturaleza
1.3.1.1 Animales, Plantas, Piedras
1.3.2 Arqueología
1.3.3 Energía
1.3.4 Astronomía
1.3.5 Arquitectura
1.3.6 Cocina
1.3.7 Poesía
1.3.8 Culturas Antiguas
1.3.8.1 Egipto, Grecia, China...
1.3.9 Paleontología
1.3.3 Culturas Antiguas
1.3.3.1 Egipto, Grecia, China...
1.3.4 Energía
1.3.5 Paleontología
1.3.6 Astronomía
1.3.7 Arquitectura
1.3.8 Cocina
1.3.9 Poesía
1.4 Duración limitada: 5-6 semanas
1.5 Niños y niñas que quieren saber más
1.6 Alternativa a otras actividades de ocio
@ -30,8 +30,8 @@ ayudándole a que encuentre respuesta a las preguntas que él o ella se plantea.
Por ese motivo, SaberMás proyecta estar al lado de los niños que necesitan una motivación extra para entender la escuela y fluir en ella,
y también al lado de aquellos a quienes la curiosidad y las ganas de saber les lleva más allá.]
1.14.1 Cada uno va a su ritmo, y cada cual pone sus límites
1.14.2 Aprendemos todos de todos
1.14.3 Valoramos lo que hemos aprendido
1.14.4 SaberMás trabaja con, desde y para la motivación
1.14.5 Trabajamos en equipo en nuestros proyectos
1.14.1 SaberMás trabaja con, desde y para la motivación
1.14.2 Trabajamos en equipo en nuestros proyectos
1.14.3 Cada uno va a su ritmo, y cada cual pone sus límites
1.14.4 Aprendemos todos de todos
1.14.5 Valoramos lo que hemos aprendido

View File

@ -1,6 +1,6 @@
<map name="bug2" version="tango"><topic central="true" text="SaberMás" id="1"><topic position="271,-39" order="8" text="Utilización de medios de expresión artística, digitales y analógicos" id="5"/><topic position="-181,-17" order="5" text="Precio también limitado: 100-120?" id="9"/><topic position="132,165" order="14" text="Talleres temáticos" id="2"><topic position="242,57" order="0" text="Naturaleza" id="13"><topic position="362,57" order="0" text="Animales, Plantas, Piedras" id="17"/></topic><topic position="245,84" order="1" text="Arqueología" id="21"/><topic position="236,138" order="2" text="Energía" id="18"/><topic position="244,192" order="3" text="Astronomía" id="16"/><topic position="245,219" order="4" text="Arquitectura" id="20"/><topic position="234,246" order="5" text="Cocina" id="11"/><topic position="234,273" order="6" text="Poesía" id="24"/><topic position="256,111" order="7" text="Culturas Antiguas" id="25"><topic position="378,111" order="0" text="Egipto, Grecia, China..." id="26"/></topic><topic position="248,165" order="8" text="Paleontología" id="38"/></topic><topic position="-168,-49" order="3" text="Duración limitada: 5-6 semanas" id="6"/><topic position="-181,16" order="7" text="Niños y niñas que quieren saber más" id="7"/><topic position="-184,-81" order="1" text="Alternativa a otras actividades de ocio" id="8"/><topic position="255,-6" order="10" text="Uso de la tecnología durante todo el proceso de aprendizaje" id="23"/><topic position="336,-137" order="2" text="Estructura PBL: aprendemos cuando buscamos respuestas a nuestras propias preguntas " id="3"/><topic position="238,-105" order="4" text="Trabajo basado en la experimentación y en la investigación" id="4"/><topic position="-201,48" order="9" text="De 8 a 12 años, sin separación por edades" id="10"/><topic position="-146,81" order="11" text="Máximo 10/1 por taller" id="19"/><topic position="211,-72" order="6" text="Actividades centradas en el contexto cercano" id="37"/><topic position="303,27" order="12" text="Flexibilidad en el uso de las lenguas de trabajo (inglés, castellano, esukara?)" id="22"/><topic position="206,-220" order="0" text="Complementamos el trabajo de la escuela" shape="rounded rectagle" id="27"><note><![CDATA[Todos los contenidos de los talleres están relacionados con el currículo de la enseñanza básica.
<map name="bug2" version="tango"><topic central="true" text="SaberMás" id="1"><topic position="271,-39" order="8" text="Utilización de medios de expresión artística, digitales y analógicos" id="5"/><topic position="-181,-17" order="5" text="Precio también limitado: 100-120?" id="9"/><topic position="132,165" order="14" text="Talleres temáticos" id="2"><topic position="242,57" order="0" text="Naturaleza" id="13"><topic position="362,57" order="0" text="Animales, Plantas, Piedras" id="17"/></topic><topic position="245,84" order="1" text="Arqueología" id="21"/><topic position="256,111" order="2" text="Culturas Antiguas" id="25"><topic position="378,111" order="0" text="Egipto, Grecia, China..." id="26"/></topic><topic position="236,138" order="3" text="Energía" id="18"/><topic position="248,165" order="4" text="Paleontología" id="38"/><topic position="244,192" order="5" text="Astronomía" id="16"/><topic position="245,219" order="6" text="Arquitectura" id="20"/><topic position="234,246" order="7" text="Cocina" id="11"/><topic position="234,273" order="8" text="Poesía" id="24"/></topic><topic position="-168,-49" order="3" text="Duración limitada: 5-6 semanas" id="6"/><topic position="-181,16" order="7" text="Niños y niñas que quieren saber más" id="7"/><topic position="-184,-81" order="1" text="Alternativa a otras actividades de ocio" id="8"/><topic position="255,-6" order="10" text="Uso de la tecnología durante todo el proceso de aprendizaje" id="23"/><topic position="336,-137" order="2" text="Estructura PBL: aprendemos cuando buscamos respuestas a nuestras propias preguntas " id="3"/><topic position="238,-105" order="4" text="Trabajo basado en la experimentación y en la investigación" id="4"/><topic position="-201,48" order="9" text="De 8 a 12 años, sin separación por edades" id="10"/><topic position="-146,81" order="11" text="Máximo 10/1 por taller" id="19"/><topic position="211,-72" order="6" text="Actividades centradas en el contexto cercano" id="37"/><topic position="303,27" order="12" text="Flexibilidad en el uso de las lenguas de trabajo (inglés, castellano, esukara?)" id="22"/><topic position="206,-220" order="0" text="Complementamos el trabajo de la escuela" shape="rounded rectagle" id="27"><note><![CDATA[Todos los contenidos de los talleres están relacionados con el currículo de la enseñanza básica.
A diferencia de la práctica tradicional, pretendemos ahondar en el conocimiento partiendo de lo que realmente interesa al niño o niña,
ayudándole a que encuentre respuesta a las preguntas que él o ella se plantea.
Por ese motivo, SaberMás proyecta estar al lado de los niños que necesitan una motivación extra para entender la escuela y fluir en ella,
y también al lado de aquellos a quienes la curiosidad y las ganas de saber les lleva más allá.]]></note><topic position="477,-220" order="0" text="Cada uno va a su ritmo, y cada cual pone sus límites" id="30"/><topic position="425,-193" order="1" text="Aprendemos todos de todos" id="31"/><topic position="440,-167" order="2" text="Valoramos lo que hemos aprendido" id="33"/><topic position="468,-273" order="3" text="SaberMás trabaja con, desde y para la motivación" shape="line" id="28"/><topic position="458,-247" order="4" text="Trabajamos en equipo en nuestros proyectos " id="32"/></topic></topic></map>
y también al lado de aquellos a quienes la curiosidad y las ganas de saber les lleva más allá.]]></note><topic position="468,-273" order="0" text="SaberMás trabaja con, desde y para la motivación" shape="line" id="28"/><topic position="458,-247" order="1" text="Trabajamos en equipo en nuestros proyectos " id="32"/><topic position="477,-220" order="2" text="Cada uno va a su ritmo, y cada cual pone sus límites" id="30"/><topic position="425,-193" order="3" text="Aprendemos todos de todos" id="31"/><topic position="440,-167" order="4" text="Valoramos lo que hemos aprendido" id="33"/></topic></topic></map>

View File

@ -332,7 +332,7 @@
<node ID="ID_334" POSITION="right" STYLE="fork" TEXT="Internet penetration"/>
<node ID="ID_335" POSITION="right" STYLE="fork" TEXT="Computer literacy "/>
</node>
<arrowlink DESTINATION="ID_76" STARTARROW="Default" ENDARROW="Default"/>
<arrowlink DESTINATION="ID_76" STARTARROW="Default"/>
</node>
<node ID="ID_10" POSITION="right" STYLE="fork" TEXT="Behavior of innovation actors">
<node ID="ID_167" POSITION="right" STYLE="fork" TEXT="Access to markets">
@ -944,7 +944,7 @@
<icon BUILTIN="sign_warning"/>
</node>
</node>
<arrowlink DESTINATION="ID_114" STARTARROW="Default" ENDARROW="Default"/>
<arrowlink DESTINATION="ID_114" STARTARROW="Default"/>
</node>
<node ID="ID_7" POSITION="right" STYLE="bubble" TEXT="What investments in innovative projects">
<richcontent TYPE="NOTE">

View File

@ -40,6 +40,7 @@ variance is desired, complete censuses are essential.[^1]
the investment in complete sampling may be worthwhile
for at least some traits.[^2]
- Chazdon 2010. Biotropica. 42(1): 3140
- Falar no artigo que esse trabalho fala que é inadequada a divisão entre pioneira e não pioneira devido a grande variação que há entre elas. Além de terem descoberto que durante a ontogenia a resposta a luminosidade muda dentro de uma mesma espécie. Porém recomendar que essa classificação continue sendo usada em curto prazo enquanto não há informações confiáveis suficiente para esta simples classificação. Outras classificações como esta do artigo são bem vinda, contanto que tenham dados confiáveis. Porém dados estáticos já são difíceis de se obter, dados temporais, como taxa de crescimento em diâmetro ou altura, são mais difíceis ainda. Falar que vários tipos de classificações podem ser utilizadas e quanto mais detalhe melhor, porém os dados é que são mais limitantes. Se focarmos em dados de germinação e crescimento limitantes, como sugerem sainete e whitmore, da uma idéia maismrápida e a curto prazo da classificação destas espécies. Depois com o tempo conseguiremos construir classificações mais detalhadas e com mais dados confiáveis.
- Here, we develop a new approach that links functional attributes
of tree species with studies of forest recovery and regional
land-use transitions (Chazdon et al. 2007). Grouping species according
@ -53,7 +54,6 @@ and wood functional traits for only a subset of the species in our
study sites, we based our functional type classification on information
for a large number of tree species obtained through vegetation
monitoring studies.
- Falar no artigo que esse trabalho fala que é inadequada a divisão entre pioneira e não pioneira devido a grande variação que há entre elas. Além de terem descoberto que durante a ontogenia a resposta a luminosidade muda dentro de uma mesma espécie. Porém recomendar que essa classificação continue sendo usada em curto prazo enquanto não há informações confiáveis suficiente para esta simples classificação. Outras classificações como esta do artigo são bem vinda, contanto que tenham dados confiáveis. Porém dados estáticos já são difíceis de se obter, dados temporais, como taxa de crescimento em diâmetro ou altura, são mais difíceis ainda. Falar que vários tipos de classificações podem ser utilizadas e quanto mais detalhe melhor, porém os dados é que são mais limitantes. Se focarmos em dados de germinação e crescimento limitantes, como sugerem sainete e whitmore, da uma idéia maismrápida e a curto prazo da classificação destas espécies. Depois com o tempo conseguiremos construir classificações mais detalhadas e com mais dados confiáveis.
- Our approach avoided preconceived notions of successional
behavior or shade tolerance of tree species by developing an objective
and independent classification of functional types based on vegetation

View File

@ -86,6 +86,7 @@
</node>
<node ID="ID_17" POSITION="right" STYLE="rectagle" BACKGROUND_COLOR="#cccccc" COLOR="#000000" TEXT="Chazdon 2010. Biotropica. 42(1): 3140">
<edge COLOR="#cccccc"/>
<node ID="ID_24" POSITION="right" STYLE="fork" TEXT="Falar no artigo que esse trabalho fala que é inadequada a divisão entre pioneira e não pioneira devido a grande variação que há entre elas. Além de terem descoberto que durante a ontogenia a resposta a luminosidade muda dentro de uma mesma espécie. Porém recomendar que essa classificação continue sendo usada em curto prazo enquanto não há informações confiáveis suficiente para esta simples classificação. Outras classificações como esta do artigo são bem vinda, contanto que tenham dados confiáveis. Porém dados estáticos já são difíceis de se obter, dados temporais, como taxa de crescimento em diâmetro ou altura, são mais difíceis ainda. Falar que vários tipos de classificações podem ser utilizadas e quanto mais detalhe melhor, porém os dados é que são mais limitantes. Se focarmos em dados de germinação e crescimento limitantes, como sugerem sainete e whitmore, da uma idéia maismrápida e a curto prazo da classificação destas espécies. Depois com o tempo conseguiremos construir classificações mais detalhadas e com mais dados confiáveis. "/>
<node ID="ID_22" POSITION="right" STYLE="fork">
<richcontent TYPE="NODE">
<html xmlns="http://www.w3.org/1999/xhtml">
@ -117,7 +118,6 @@
</html>
</richcontent>
</node>
<node ID="ID_24" POSITION="right" STYLE="fork" TEXT="Falar no artigo que esse trabalho fala que é inadequada a divisão entre pioneira e não pioneira devido a grande variação que há entre elas. Além de terem descoberto que durante a ontogenia a resposta a luminosidade muda dentro de uma mesma espécie. Porém recomendar que essa classificação continue sendo usada em curto prazo enquanto não há informações confiáveis suficiente para esta simples classificação. Outras classificações como esta do artigo são bem vinda, contanto que tenham dados confiáveis. Porém dados estáticos já são difíceis de se obter, dados temporais, como taxa de crescimento em diâmetro ou altura, são mais difíceis ainda. Falar que vários tipos de classificações podem ser utilizadas e quanto mais detalhe melhor, porém os dados é que são mais limitantes. Se focarmos em dados de germinação e crescimento limitantes, como sugerem sainete e whitmore, da uma idéia maismrápida e a curto prazo da classificação destas espécies. Depois com o tempo conseguiremos construir classificações mais detalhadas e com mais dados confiáveis. "/>
<node ID="ID_25" POSITION="right" STYLE="fork">
<richcontent TYPE="NODE">
<html xmlns="http://www.w3.org/1999/xhtml">

View File

@ -41,7 +41,8 @@ the investment in complete sampling may be worthwhile
for at least some traits.
[Note: Falar que isso corrobora nossa sugestão de utilizar poucas medidas, mas que elas sejam confiáveis.]
1.2 Chazdon 2010. Biotropica. 42(1): 3140
1.2.1 Here, we develop a new approach that links functional attributes
1.2.1 Falar no artigo que esse trabalho fala que é inadequada a divisão entre pioneira e não pioneira devido a grande variação que há entre elas. Além de terem descoberto que durante a ontogenia a resposta a luminosidade muda dentro de uma mesma espécie. Porém recomendar que essa classificação continue sendo usada em curto prazo enquanto não há informações confiáveis suficiente para esta simples classificação. Outras classificações como esta do artigo são bem vinda, contanto que tenham dados confiáveis. Porém dados estáticos já são difíceis de se obter, dados temporais, como taxa de crescimento em diâmetro ou altura, são mais difíceis ainda. Falar que vários tipos de classificações podem ser utilizadas e quanto mais detalhe melhor, porém os dados é que são mais limitantes. Se focarmos em dados de germinação e crescimento limitantes, como sugerem sainete e whitmore, da uma idéia maismrápida e a curto prazo da classificação destas espécies. Depois com o tempo conseguiremos construir classificações mais detalhadas e com mais dados confiáveis.
1.2.2 Here, we develop a new approach that links functional attributes
of tree species with studies of forest recovery and regional
land-use transitions (Chazdon et al. 2007). Grouping species according
to their functional attributes or demographic rates provides
@ -49,12 +50,11 @@ insight into both applied and theoretical questions, such as selecting
species for reforestation programs, assessing ecosystem services, and
understanding community assembly processes in tropical forests
(Diaz et al. 2007, Kraft et al. 2008).
1.2.2 Since we have data on leaf
1.2.3 Since we have data on leaf
and wood functional traits for only a subset of the species in our
study sites, we based our functional type classification on information
for a large number of tree species obtained through vegetation
monitoring studies.
1.2.3 Falar no artigo que esse trabalho fala que é inadequada a divisão entre pioneira e não pioneira devido a grande variação que há entre elas. Além de terem descoberto que durante a ontogenia a resposta a luminosidade muda dentro de uma mesma espécie. Porém recomendar que essa classificação continue sendo usada em curto prazo enquanto não há informações confiáveis suficiente para esta simples classificação. Outras classificações como esta do artigo são bem vinda, contanto que tenham dados confiáveis. Porém dados estáticos já são difíceis de se obter, dados temporais, como taxa de crescimento em diâmetro ou altura, são mais difíceis ainda. Falar que vários tipos de classificações podem ser utilizadas e quanto mais detalhe melhor, porém os dados é que são mais limitantes. Se focarmos em dados de germinação e crescimento limitantes, como sugerem sainete e whitmore, da uma idéia maismrápida e a curto prazo da classificação destas espécies. Depois com o tempo conseguiremos construir classificações mais detalhadas e com mais dados confiáveis.
1.2.4 Our approach avoided preconceived notions of successional
behavior or shade tolerance of tree species by developing an objective
and independent classification of functional types based on vegetation

View File

@ -28,18 +28,18 @@ failed to accurately estimate the variance of trait values. This
indicates that in situations where accurate estimation of plotlevel
variance is desired, complete censuses are essential.]]></text><note><![CDATA[Isso significa que estudos de característica de história de vida compensam? Ver nos m&m.]]></note></topic><topic position="-915,219" order="7" id="15"><text><![CDATA[We suggest that, in these studies,
the investment in complete sampling may be worthwhile
for at least some traits.]]></text><note><![CDATA[Falar que isso corrobora nossa sugestão de utilizar poucas medidas, mas que elas sejam confiáveis.]]></note></topic></topic><topic position="297,0" order="0" text="Chazdon 2010. Biotropica. 42(1): 3140" shape="rectagle" id="17" fontStyle=";;#000000;;;" bgColor="#cccccc" brColor="#cccccc"><topic position="586,-383" order="0" id="22"><text><![CDATA[Here, we develop a new approach that links functional attributes
for at least some traits.]]></text><note><![CDATA[Falar que isso corrobora nossa sugestão de utilizar poucas medidas, mas que elas sejam confiáveis.]]></note></topic></topic><topic position="297,0" order="0" text="Chazdon 2010. Biotropica. 42(1): 3140" shape="rectagle" id="17" fontStyle=";;#000000;;;" bgColor="#cccccc" brColor="#cccccc"><topic position="2883,-437" order="0" text="Falar no artigo que esse trabalho fala que é inadequada a divisão entre pioneira e não pioneira devido a grande variação que há entre elas. Além de terem descoberto que durante a ontogenia a resposta a luminosidade muda dentro de uma mesma espécie. Porém recomendar que essa classificação continue sendo usada em curto prazo enquanto não há informações confiáveis suficiente para esta simples classificação. Outras classificações como esta do artigo são bem vinda, contanto que tenham dados confiáveis. Porém dados estáticos já são difíceis de se obter, dados temporais, como taxa de crescimento em diâmetro ou altura, são mais difíceis ainda. Falar que vários tipos de classificações podem ser utilizadas e quanto mais detalhe melhor, porém os dados é que são mais limitantes. Se focarmos em dados de germinação e crescimento limitantes, como sugerem sainete e whitmore, da uma idéia maismrápida e a curto prazo da classificação destas espécies. Depois com o tempo conseguiremos construir classificações mais detalhadas e com mais dados confiáveis. " id="24"/><topic position="586,-383" order="1" id="22"><text><![CDATA[Here, we develop a new approach that links functional attributes
of tree species with studies of forest recovery and regional
land-use transitions (Chazdon et al. 2007). Grouping species according
to their functional attributes or demographic rates provides
insight into both applied and theoretical questions, such as selecting
species for reforestation programs, assessing ecosystem services, and
understanding community assembly processes in tropical forests
(Diaz et al. 2007, Kraft et al. 2008).]]></text></topic><topic position="583,-313" order="1" id="23"><text><![CDATA[Since we have data on leaf
(Diaz et al. 2007, Kraft et al. 2008).]]></text></topic><topic position="583,-313" order="2" id="23"><text><![CDATA[Since we have data on leaf
and wood functional traits for only a subset of the species in our
study sites, we based our functional type classification on information
for a large number of tree species obtained through vegetation
monitoring studies.]]></text></topic><topic position="2883,-437" order="2" text="Falar no artigo que esse trabalho fala que é inadequada a divisão entre pioneira e não pioneira devido a grande variação que há entre elas. Além de terem descoberto que durante a ontogenia a resposta a luminosidade muda dentro de uma mesma espécie. Porém recomendar que essa classificação continue sendo usada em curto prazo enquanto não há informações confiáveis suficiente para esta simples classificação. Outras classificações como esta do artigo são bem vinda, contanto que tenham dados confiáveis. Porém dados estáticos já são difíceis de se obter, dados temporais, como taxa de crescimento em diâmetro ou altura, são mais difíceis ainda. Falar que vários tipos de classificações podem ser utilizadas e quanto mais detalhe melhor, porém os dados é que são mais limitantes. Se focarmos em dados de germinação e crescimento limitantes, como sugerem sainete e whitmore, da uma idéia maismrápida e a curto prazo da classificação destas espécies. Depois com o tempo conseguiremos construir classificações mais detalhadas e com mais dados confiáveis. " id="24"/><topic position="720,-239" order="3" id="25"><text><![CDATA[Our approach avoided preconceived notions of successional
monitoring studies.]]></text></topic><topic position="720,-239" order="3" id="25"><text><![CDATA[Our approach avoided preconceived notions of successional
behavior or shade tolerance of tree species by developing an objective
and independent classification of functional types based on vegetation
monitoring data from permanent sample plots in mature and

View File

@ -37,8 +37,8 @@
<node ID="ID_30" POSITION="right" TEXT="In 2010, 2,500 referrals forwarded to OneLegacy"/>
</node>
<node ID="ID_31" POSITION="right" STYLE="bubble" BACKGROUND_COLOR="#00ffd5" TEXT="Doheny Eye and Tissue Transplant Bank" LINK="http://www.dohenyeyebank.org/"/>
<arrowlink DESTINATION="ID_32" STARTARROW="Default" ENDARROW="Default"/>
<arrowlink DESTINATION="ID_36" STARTARROW="Default" ENDARROW="Default"/>
<arrowlink DESTINATION="ID_32" STARTARROW="Default"/>
<arrowlink DESTINATION="ID_36" STARTARROW="Default"/>
</node>
<node ID="ID_32" POSITION="right" STYLE="bubble" BACKGROUND_COLOR="#00ffd5" TEXT="OneLegacy">
<node ID="ID_33" POSITION="right" TEXT="In 2010, 11,828 referrals"/>

View File

@ -12,7 +12,7 @@
</html>
</richcontent>
<icon BUILTIN="hard_computer"/>
<arrowlink DESTINATION="ID_11" STARTARROW="Default" ENDARROW="Default"/>
<arrowlink DESTINATION="ID_11" STARTARROW="Default"/>
</node>
<node ID="ID_11" POSITION="left" STYLE="fork" COLOR="#525c61" TEXT="Try it Now!">
<icon BUILTIN="face_surprise"/>

View File

@ -500,5 +500,14 @@
},
"label.title": {
"defaultMessage": "Etikett hinzufügen"
},
"footer.donations": {
"defaultMessage": "Spenden"
},
"footer.support": {
"defaultMessage": "Unterstützt"
},
"footer.team": {
"defaultMessage": "Ausrüstung"
}
}

View File

@ -167,6 +167,15 @@
"footer.others": {
"defaultMessage": "Others"
},
"footer.support": {
"defaultMessage": "Support"
},
"footer.team": {
"defaultMessage": "Our Team"
},
"footer.donations": {
"defaultMessage": "Donations"
},
"footer.termsandconditions": {
"defaultMessage": "Term And Conditions"
},
@ -258,7 +267,7 @@
"defaultMessage": "Add label"
},
"label.add-for": {
"defaultMessage": "Editing labels for maps:"
"defaultMessage": "Editing labels for"
},
"label.add-placeholder": {
"defaultMessage": "Label title"
@ -275,6 +284,9 @@
"label.description": {
"defaultMessage": "Use labels to organize your maps."
},
"label.maps-count": {
"defaultMessage": "{count} maps"
},
"label.title": {
"defaultMessage": "Add a label"
},

View File

@ -141,7 +141,16 @@
"defaultMessage": "El export a formatos de imagen (SVG, PNG, JPEG, PDF) solo está disponible en la barra de herramientas del editor."
},
"footer.aboutus": {
"defaultMessage": "Sobre nosotros"
"defaultMessage": "Sobre Nosotros"
},
"footer.donations": {
"defaultMessage": "Donaciones"
},
"footer.support": {
"defaultMessage": "Soporte"
},
"footer.team": {
"defaultMessage": "Equipo"
},
"footer.contactus": {
"defaultMessage": "Contáctenos"

View File

@ -500,5 +500,14 @@
},
"label.title": {
"defaultMessage": "Ajouter une étiquette"
},
"footer.donations": {
"defaultMessage": "Des dons"
},
"footer.support": {
"defaultMessage": "Service"
},
"footer.team": {
"defaultMessage": "Equipe"
}
}

View File

@ -473,5 +473,14 @@
},
"editor.try-welcome-description": {
"defaultMessage": "Зарегистрируйтесь, чтобы создавать, делиться и публиковать майнд-карты бесплатно и без ограничений!"
},
"footer.donations": {
"defaultMessage": "Пожертвования"
},
"footer.support": {
"defaultMessage": "Услуги"
},
"footer.team": {
"defaultMessage": "команда"
}
}

View File

@ -0,0 +1,513 @@
{
"account.delete-warning警告": {
"defaultMessage": "请记住,您将无法访问您添加的任何思维导图。您的所有信息都将被删除,并且无法恢复。"
},
"accountinfo.button": {
"defaultMessage": "接受"
},
"accountinfo.deleteaccount": {
"defaultMessage": "删除账号"
},
"accountinfo.email": {
"defaultMessage": "Email电子邮件"
},
"accountinfo.firstname": {
"defaultMessage": "名字"
},
"accountinfo.lastname": {
"defaultMessage": "姓氏"
},
"accountinfo.title": {
"defaultMessage": "账户信息"
},
"action.cancel-button": {
"defaultMessage": "取消"
},
"action.close-button": {
"defaultMessage": "关闭"
},
"action.delete": {
"defaultMessage": "删除"
},
"action.delete-description": {
"defaultMessage": "已删除的思维导图无法恢复。您想继续吗?"
},
"action.delete-title": {
"defaultMessage": "删除"
},
"action.duplicate": {
"defaultMessage": "复制"
},
"action.export": {
"defaultMessage": "导出"
},
"action.history": {
"defaultMessage": "历史"
},
"action.history-description": {
"defaultMessage": "过去90天内引入的更改列表。"
},
"action.history-title": {
"defaultMessage": "历史版本"
},
"action.import": {
"defaultMessage": "导入"
},
"action.info": {
"defaultMessage": "信息"
},
"action.label": {
"defaultMessage": "添加标签"
},
"action.new": {
"defaultMessage": "新建脑图"
},
"action.open": {
"defaultMessage": "打开"
},
"action.print": {
"defaultMessage": "打印"
},
"action.publish": {
"defaultMessage": "发布"
},
"action.rename": {
"defaultMessage": "重命名"
},
"action.rename-description-placeholder": {
"defaultMessage": "描述"
},
"action.rename-name-placeholder": {
"defaultMessage": "名称"
},
"action.share": {
"defaultMessage": "分享"
},
"changepwd.button": {
"defaultMessage": "更改"
},
"changepwd.confirm-password": {
"defaultMessage": "确认密码"
},
"changepwd.description": {
"defaultMessage": "请为您的账户提供新密码"
},
"changepwd.password": {
"defaultMessage": "密码"
},
"changepwd.password-match": {
"defaultMessage": "密码不一致,请再试一次"
},
"changepwd.title": {
"defaultMessage": "更改密码"
},
"common.wait": {
"defaultMessage": "请等待。。。"
},
"create.button": {
"defaultMessage": "创建"
},
"create.description": {
"defaultMessage": "请填写新的脑图名称和描述"
},
"create.title": {
"defaultMessage": "创建一个新的思维导图"
},
"deletem.title": {
"defaultMessage": "所有选中的脑图将被删除"
},
"duplicate.title": {
"defaultMessage": "复制"
},
"expired.description": {
"defaultMessage": "您的当前会话已过期。请登录后重试。"
},
"expired.title": {
"defaultMessage": "您的会话已过期"
},
"export.desc": {
"defaultMessage": "以您需要的格式导出此脑图,并在演示文稿中使用或通过电子邮件分享"
},
"export.document": {
"defaultMessage": "思维导图工具:以第三方思维导图格式导出您的思维导图"
},
"export.document-label": {
"defaultMessage": "文档:将你的思维导图导出到一个独立的文档中来分享"
},
"export.image": {
"defaultMessage": "图像:以图片形式获取包含所有颜色和形状的脑图"
},
"export.img-center": {
"defaultMessage": "居中并缩放合适大小"
},
"export.title": {
"defaultMessage": "导出"
},
"export.warning": {
"defaultMessage": "导出到图像SVGPNGJPEGPDF仅在编辑器工具栏中可用。"
},
"footer.aboutus": {
"defaultMessage": "关于我们"
},
"footer.contactus": {
"defaultMessage": "联系我们"
},
"footer.faq": {
"defaultMessage": "常见问题"
},
"footer.faqandhelp": {
"defaultMessage": "帮助和常见问题"
},
"footer.feedback": {
"defaultMessage": "反馈"
},
"footer.opensource": {
"defaultMessage": "开源"
},
"footer.others": {
"defaultMessage": "其它"
},
"footer.termsandconditions": {
"defaultMessage": "条款和条件"
},
"forgot.desc": {
"defaultMessage": "我们将向您发送电子邮件以重置您的密码。"
},
"forgot.email": {
"defaultMessage": "电子邮件"
},
"forgot.page-title": {
"defaultMessage": "忘记密码|WiseMapping"
},
"forgot.register": {
"defaultMessage": "发送恢复链接"
},
"forgot.success.desc": {
"defaultMessage": "我们已经向您发送了一封电子邮件,允许您重置密码。您应该会在几分钟内收到"
},
"forgot.success.title": {
"defaultMessage": "您的临时密码已发送。"
},
"forgot.title": {
"defaultMessage": "重置密码"
},
"forgotsuccess.page-title": {
"defaultMessage": "密码已恢复|WiseMapping"
},
"header.donthaveaccount": {
"defaultMessage": "没有账号?"
},
"header.haveaccount": {
"defaultMessage": "已经有一个账号?"
},
"help.support": {
"defaultMessage": "支持"
},
"history.no-changes": {
"defaultMessage": "没有可用的更改"
},
"import.button": {
"defaultMessage": "创建"
},
"import.description": {
"defaultMessage": "您可以将WiseMapping脑图导入到您的脑图列表中。选择要导入的文件。"
},
"import.title": {
"defaultMessage": "导入现有的思维导图"
},
"info.basic-info": {
"defaultMessage": "基本信息"
},
"info.button": {
"defaultMessage": "接受"
},
"info.creation-time": {
"defaultMessage": "创建日期"
},
"info.creator": {
"defaultMessage": "创建人"
},
"info.description": {
"defaultMessage": "描述"
},
"info.description-msg": {
"defaultMessage": "通过发布脑图,你让互联网上的每个人都能看到它。"
},
"info.modified-time": {
"defaultMessage": "最后修改日期"
},
"info.modified-tny": {
"defaultMessage": "最后修改人"
},
"info.name": {
"defaultMessage": "名称"
},
"info.public-visibility": {
"defaultMessage": "公开可见"
},
"info.sharing": {
"defaultMessage": "分享"
},
"info.starred": {
"defaultMessage": "收藏"
},
"info.title": {
"defaultMessage": "信息"
},
"label.add-button": {
"defaultMessage": "添加标签"
},
"label.add-for": {
"defaultMessage": "编辑脑图标签:"
},
"label.add-placeholder": {
"defaultMessage": "标签标题"
},
"label.change-color": {
"defaultMessage": "更改标签颜色"
},
"label.delete-description": {
"defaultMessage": "将被删除,包括它与所有现有脑图的关联。是否继续?"
},
"label.delete-title": {
"defaultMessage": "确认标签删除"
},
"label.description": {
"defaultMessage": "使用标签来组织你的脑图。"
},
"label.title": {
"defaultMessage": "添加标签"
},
"language.change": {
"defaultMessage": "更改语言"
},
"language.help": {
"defaultMessage": "帮助翻译"
},
"login.desc": {
"defaultMessage": "登录您的账号"
},
"login.email": {
"defaultMessage": "电子邮件"
},
"login.error": {
"defaultMessage": "您输入的电子邮件地址或密码无效。"
},
"login.forgotpwd": {
"defaultMessage": "忘记密码?"
},
"login.hsqldbcofig": {
"defaultMessage": "虽然HSQLDB在安装过程中默认与WiseMapping捆绑在一起但我们不建议将此数据库用于生产用途。请考虑使用MySQL 5.7代替。您可以找到更多关于如何配置MySQL的信息",
"description": "缺少已配置的生产数据库"
},
"login.page-title": {
"defaultMessage": "登录|WiseMapping"
},
"login.password": {
"defaultMessage": "密码"
},
"login.remberme": {
"defaultMessage": "记住我的登录"
},
"login.signin": {
"defaultMessage": "登录"
},
"login.signup": {
"defaultMessage": "注册"
},
"login.title": {
"defaultMessage": "欢迎"
},
"login.userinactive": {
"defaultMessage": "对不起,您的账号尚未激活。当它激活时,您将收到一封通知电子邮件。敬请关注!"
},
"map.creator": {
"defaultMessage": "创建人"
},
"map.delete-selected": {
"defaultMessage": "删除选中项"
},
"map.last-update": {
"defaultMessage": "最后更新"
},
"map.more-actions": {
"defaultMessage": "更多操作"
},
"map.name": {
"defaultMessage": "名称"
},
"map.tooltip-add": {
"defaultMessage": "将标签添加到选定项"
},
"maps.choose-file": {
"defaultMessage": "选择一个文件"
},
"maps.create-tooltip": {
"defaultMessage": "创建一个新的思维导图"
},
"maps.empty-result": {
"defaultMessage": "没有找到与当前筛选条件匹配的思维导图。"
},
"maps.import-desc": {
"defaultMessage": "从其它工具导入"
},
"maps.modified": {
"defaultMessage": "修改"
},
"maps.modified-by": {
"defaultMessage": "修改人"
},
"maps.modified-by-desc": {
"defaultMessage": "{on}由{by}修改"
},
"maps.nav-all": {
"defaultMessage": "所有"
},
"maps.nav-onwned": {
"defaultMessage": "我的"
},
"maps.nav-public": {
"defaultMessage": "公开"
},
"maps.nav-shared": {
"defaultMessage": "与我分享"
},
"maps.nav-starred": {
"defaultMessage": "收藏"
},
"maps.page-title": {
"defaultMessage": "我的脑图|WiseMapping"
},
"maps.revert": {
"defaultMessage": "恢复"
},
"maps.search-action": {
"defaultMessage": "搜索。。。"
},
"maps.tooltip-open": {
"defaultMessage": "打开编辑"
},
"maps.tooltip-starred": {
"defaultMessage": "收藏"
},
"maps.view": {
"defaultMessage": "查看"
},
"menu.account": {
"defaultMessage": "账号"
},
"menu.change-password": {
"defaultMessage": "更改密码"
},
"menu.signout": {
"defaultMessage": "注销"
},
"publish.button": {
"defaultMessage": "接受"
},
"publish.checkbox": {
"defaultMessage": "开启公共分享"
},
"publish.description": {
"defaultMessage": "通过发布脑图,你让互联网上的每个人都能看到它。"
},
"publish.embedded": {
"defaultMessage": "嵌入"
},
"publish.embedded-msg": {
"defaultMessage": "复制这段代码以嵌入到您的博客或页面中:"
},
"publish.public-url": {
"defaultMessage": "公共UPL"
},
"publish.public-url-msg": {
"defaultMessage": "复制并粘贴下面的链接,与同事分享您的脑图:"
},
"publish.title": {
"defaultMessage": "发布"
},
"registation.success-title": {
"defaultMessage": "注册成功|WiseMapping"
},
"registration.desc": {
"defaultMessage": "注册免费,分分钟就好"
},
"registration.email": {
"defaultMessage": "电子邮件"
},
"registration.firstname": {
"defaultMessage": "名字"
},
"registration.lastname": {
"defaultMessage": "姓氏"
},
"registration.page-title": {
"defaultMessage": "注册|WiseMapping"
},
"registration.password": {
"defaultMessage": "密码"
},
"registration.register": {
"defaultMessage": "注册"
},
"registration.success.desc": {
"defaultMessage": "点击下面的登录按钮,开始创建思维导图。"
},
"registration.termandconditions": {
"defaultMessage": "客户条款请检查您在上面输入的WiseMapping账号信息并在此处查看客户条款。点击下面的'注册'即表示您同意上面的客户条款和隐私政策"
},
"registration.title": {
"defaultMessage": "成为成员"
},
"rename.description": {
"defaultMessage": "请填写新的脑图名称和描述。"
},
"rename.title": {
"defaultMessage": "重命名"
},
"resetpassword.success.title": {
"defaultMessage": "您的账号已成功创建"
},
"role.editor": {
"defaultMessage": "编辑人"
},
"role.owner": {
"defaultMessage": "所有人"
},
"role.viewer": {
"defaultMessage": "查看人"
},
"share.add-button": {
"defaultMessage": "添加"
},
"share.add-message": {
"defaultMessage": "添加消息"
},
"share.can-edit": {
"defaultMessage": "可编辑"
},
"share.can-view": {
"defaultMessage": "可查看"
},
"share.delete": {
"defaultMessage": "删除协作人"
},
"share.delete-description": {
"defaultMessage": "邀请人们与你合作创建你的思维导图。他们将通过电子邮件得到通知。"
},
"share.delete-title": {
"defaultMessage": "与人分享"
},
"share.message": {
"defaultMessage": "消息"
},
"footer.support": {
"defaultMessage": "支持"
},
"footer.team": {
"defaultMessage": "学期"
},
"footer.donations": {
"defaultMessage": "捐款"
}
}

View File

@ -1,6 +1,6 @@
{
"name": "@wisemapping/webapp",
"version": "5.0.8",
"version": "5.0.9",
"main": "app.jsx",
"scripts": {
"start": "webpack serve --config webpack.dev.js ",
@ -9,8 +9,8 @@
"lint": "eslint src",
"cy:run": "cypress run",
"test:integration": "start-server-and-test start http-get://localhost:3000 cy:run",
"extract": "formatjs extract 'src/**/*.ts*' --ignore 'src/@types/**/*' --out-file lang/en.json",
"compile": "formatjs compile",
"i18n:extract": "formatjs extract 'src/**/*.ts*' --ignore 'src/@types/**/*' --out-file lang/en.json",
"i18n:compile": "for lang in {'es','en','fr','de','zh','ru'};do formatjs compile lang/${lang}.json --ast --out-file src/compiled-lang/${lang}.json;done",
"test": "yarn test:integration"
},
"files": [

View File

@ -38,7 +38,7 @@ const queryClient = new QueryClient({
});
const App = (): ReactElement => {
const locale = AppI18n.getBrowserLocale();
const locale = AppI18n.getDefaultLocale();
const EnhacedEditorPage = withSessionExpirationHandling(EditorPage);
return locale.message ? (
@ -81,7 +81,7 @@ const App = (): ReactElement => {
component={withSessionExpirationHandling(MapsPage)}
/>
<Route exact path="/c/maps/:id/edit">
<EnhacedEditorPage isTryMode={false}/>
<EnhacedEditorPage isTryMode={false} />
</Route>
<Route exact path="/c/maps/:id/try">
<EnhacedEditorPage isTryMode={true} />

View File

@ -2,7 +2,9 @@ import { fetchAccount } from './../../redux/clientSlice';
import 'dayjs/locale/fr';
import 'dayjs/locale/en';
import 'dayjs/locale/es';
import 'dayjs/locale/de';
import 'dayjs/locale/ru';
import 'dayjs/locale/zh';
export class Locale {
code: LocaleCode;
@ -17,15 +19,23 @@ export class Locale {
}
export default abstract class AppI18n {
private static LOCAL_STORAGE_KEY = 'user.locale';
public static getUserLocale(): Locale {
// @Todo Hack: Try page must not account info. Add this to avoid 403 errors.
const isTryPage = window.location.href.endsWith('/try');
let result: Locale;
if (!isTryPage) {
const account = fetchAccount();
result = account?.locale ? account.locale : this.getBrowserLocale();
result = account?.locale ? account.locale : this.getDefaultLocale();
// If the local storage value is different, update ...
if (account?.locale && result.code !== localStorage.getItem(AppI18n.LOCAL_STORAGE_KEY)) {
localStorage.setItem(AppI18n.LOCAL_STORAGE_KEY, result.code);
}
} else {
result = this.getBrowserLocale();
result = this.getDefaultLocale();
}
return result;
}
@ -45,9 +55,24 @@ export default abstract class AppI18n {
return result;
}
public static getDefaultLocale(): Locale {
// Fetch local from local storage ...
let result: Locale;
const userLocaleCode: string = localStorage.getItem(AppI18n.LOCAL_STORAGE_KEY);
if (userLocaleCode) {
result = localeFromStr(userLocaleCode);
}
// Ok, use browser default ...
if (!result) {
result = this.getBrowserLocale();
}
return result;
}
}
export type LocaleCode = 'en' | 'es' | 'fr' | 'de' | 'ru';
export type LocaleCode = 'en' | 'es' | 'fr' | 'de' | 'ru' | 'zh';
export const Locales = {
EN: new Locale('en', 'English', require('./../../compiled-lang/en.json')), // eslint-disable-line
@ -55,10 +80,10 @@ export const Locales = {
DE: new Locale('fr', 'Français', require('./../../compiled-lang/fr.json')), // eslint-disable-line
FR: new Locale('de', 'Deutsch', require('./../../compiled-lang/de.json')), // eslint-disable-line
RU: new Locale('ru', 'Pусский', require('./../../compiled-lang/ru.json')), // eslint-disable-line
ZH: new Locale('zh', '中文 (简体)', require('./../../compiled-lang/zh.json')), // eslint-disable-line
};
export const localeFromStr = (code: string): Locale => {
const locales: Locale[] = Object.values(Locales);

View File

@ -311,6 +311,12 @@
"value": "Kontaktiere uns"
}
],
"footer.donations": [
{
"type": 0,
"value": "Spenden"
}
],
"footer.faq": [
{
"type": 0,
@ -341,6 +347,18 @@
"value": "Andere"
}
],
"footer.support": [
{
"type": 0,
"value": "Unterstützt"
}
],
"footer.team": [
{
"type": 0,
"value": "Ausrüstung"
}
],
"footer.termsandconditions": [
{
"type": 0,

View File

@ -275,6 +275,12 @@
"value": "Image: Get a graphic representation of your map including all colors and shapes."
}
],
"export.img-center": [
{
"type": 0,
"value": "Center and zoom to fit"
}
],
"export.title": [
{
"type": 0,
@ -299,6 +305,12 @@
"value": "Contact Us"
}
],
"footer.donations": [
{
"type": 0,
"value": "Donations"
}
],
"footer.faq": [
{
"type": 0,
@ -329,6 +341,18 @@
"value": "Others"
}
],
"footer.support": [
{
"type": 0,
"value": "Support"
}
],
"footer.team": [
{
"type": 0,
"value": "Our Team"
}
],
"footer.termsandconditions": [
{
"type": 0,
@ -512,7 +536,7 @@
"label.add-for": [
{
"type": 0,
"value": "Editing labels for maps:"
"value": "Editing labels for"
}
],
"label.add-placeholder": [
@ -545,6 +569,16 @@
"value": "Use labels to organize your maps."
}
],
"label.maps-count": [
{
"type": 1,
"value": "count"
},
{
"type": 0,
"value": " maps"
}
],
"label.title": [
{
"type": 0,
@ -887,6 +921,12 @@
"value": "Last Name"
}
],
"registration.page-title": [
{
"type": 0,
"value": "Registration | WiseMapping"
}
],
"registration.password": [
{
"type": 0,
@ -914,7 +954,7 @@
"registration.title": [
{
"type": 0,
"value": "Registration | WiseMapping"
"value": "Become a member"
}
],
"rename.description": [

View File

@ -296,7 +296,7 @@
"footer.aboutus": [
{
"type": 0,
"value": "Sobre nosotros"
"value": "Sobre Nosotros"
}
],
"footer.contactus": [
@ -305,6 +305,12 @@
"value": "Contáctenos"
}
],
"footer.donations": [
{
"type": 0,
"value": "Donaciones"
}
],
"footer.faq": [
{
"type": 0,
@ -335,6 +341,18 @@
"value": "Otros"
}
],
"footer.support": [
{
"type": 0,
"value": "Soporte"
}
],
"footer.team": [
{
"type": 0,
"value": "Equipo"
}
],
"footer.termsandconditions": [
{
"type": 0,

View File

@ -303,6 +303,12 @@
"value": "Nous contacter"
}
],
"footer.donations": [
{
"type": 0,
"value": "Des dons"
}
],
"footer.faq": [
{
"type": 0,
@ -333,6 +339,18 @@
"value": "Autres"
}
],
"footer.support": [
{
"type": 0,
"value": "Service"
}
],
"footer.team": [
{
"type": 0,
"value": "Equipe"
}
],
"footer.termsandconditions": [
{
"type": 0,

View File

@ -305,6 +305,12 @@
"value": "Контакты"
}
],
"footer.donations": [
{
"type": 0,
"value": "Пожертвования"
}
],
"footer.faq": [
{
"type": 0,
@ -335,6 +341,18 @@
"value": "Прочее"
}
],
"footer.support": [
{
"type": 0,
"value": "Услуги"
}
],
"footer.team": [
{
"type": 0,
"value": "команда"
}
],
"footer.termsandconditions": [
{
"type": 0,

File diff suppressed because it is too large Load Diff

View File

@ -2,7 +2,7 @@ import { EditorOptions } from '@wisemapping/editor';
import { EditorRenderMode } from '@wisemapping/mindplot';
import AppConfig from '../../classes/app-config';
export default class EditorOptionsBuilder {
class EditorOptionsBuilder {
static build(locale: string, mode: EditorRenderMode, hotkeys: boolean): EditorOptions {
let options: EditorOptions = {
@ -38,3 +38,4 @@ export default class EditorOptionsBuilder {
return !AppConfig.isDevelopEnv() ? global.mapId : 11;
}
}
export default EditorOptionsBuilder;

View File

@ -3,8 +3,8 @@ import ActionDispatcher from '../maps-page/action-dispatcher';
import { ActionType } from '../maps-page/action-chooser';
import Editor from '@wisemapping/editor';
import { EditorRenderMode, PersistenceManager } from '@wisemapping/mindplot';
import AppI18n from '../../classes/app-i18n';
import { IntlProvider } from 'react-intl';
import AppI18n, { Locales } from '../../classes/app-i18n';
import { useSelector } from 'react-redux';
import { hotkeysEnabled } from '../../redux/editorSlice';
import ReactGA from 'react-ga';
@ -23,7 +23,6 @@ const EditorPage = ({ isTryMode }: EditorPropsType): React.ReactElement => {
const client: Client = useSelector(activeInstance);
useEffect(() => {
document.title = `${global.mapTitle ? global.mapTitle : 'unknown'} | WiseMapping `;
ReactGA.pageview(window.location.pathname + window.location.search);
}, []);
@ -37,9 +36,13 @@ const EditorPage = ({ isTryMode }: EditorPropsType): React.ReactElement => {
const fetchResult = fetchMapById(mapId);
if (!fetchResult.isLoading) {
if (fetchResult.error) {
throw new Error(`Map information could not be loaded: ${JSON.stringify(fetchResult)}`);
throw new Error(`Map info could not be loaded: ${JSON.stringify(fetchResult.error)}`);
}
result = `edition-${fetchResult?.map?.role}`;
if (!fetchResult.map) {
throw new Error(`Map info could not be loaded. Info not present: ${JSON.stringify(fetchResult)}`);
}
result = `edition-${fetchResult.map.role}`;
}
}
return result;
@ -61,7 +64,11 @@ const EditorPage = ({ isTryMode }: EditorPropsType): React.ReactElement => {
}
return loadCompleted ? (
<>
<IntlProvider
locale={userLocale.code}
defaultLocale={Locales.EN.code}
messages={userLocale.message as Record<string, string>}
>
<Editor onAction={setActiveDialog}
options={options}
persistenceManager={persistence}
@ -75,7 +82,7 @@ const EditorPage = ({ isTryMode }: EditorPropsType): React.ReactElement => {
fromEditor
/>
}
</>) : <></>
</IntlProvider>) : <></>
}

View File

@ -16,6 +16,11 @@ const Footer = (): React.ReactElement => {
<h4>
<FormattedMessage id="footer.faqandhelp" defaultMessage="Help & FAQ" />
</h4>
<div>
<a href="https://www.wisemapping.com/aboutus.html">
<FormattedMessage id="footer.aboutus" defaultMessage="About Us" />
</a>
</div>
<div>
<a href="https://www.wisemapping.com/faq.html">
<FormattedMessage id="footer.faq" defaultMessage="F.A.Q." />
@ -29,9 +34,24 @@ const Footer = (): React.ReactElement => {
/>
</a>
</div>
</div>
<div>
<h4>
<FormattedMessage id="footer.contactus" defaultMessage="Contact Us" />
</h4>
<div>
<a href="mailto:support@wisemapping.com">
<FormattedMessage id="footer.support" defaultMessage="Support" />
</a>
</div>
<div>
<a href="mailto:feedback@wisemapping.com">
<FormattedMessage id="footer.feedback" defaultMessage="Feedback" />
</a>
</div>
<div>
<a href="mailto:team@wisemapping.com">
<FormattedMessage id="footer.contactus" defaultMessage="Contact Us" />
<FormattedMessage id="footer.team" defaultMessage="Our Team" />
</a>
</div>
</div>
@ -40,13 +60,11 @@ const Footer = (): React.ReactElement => {
<FormattedMessage id="footer.others" defaultMessage="Others" />
</h4>
<div>
<a href="https://www.wisemapping.com/aboutus.html">
<FormattedMessage id="footer.aboutus" defaultMessage="About Us" />
</a>
</div>
<div>
<a href="mailto:feedback@wisemapping.com">
<FormattedMessage id="footer.feedback" defaultMessage="Feedback" />
<a href="https://www.paypal.com/donate/?hosted_button_id=CF7GJ7T6E4RS4">
<FormattedMessage
id="footer.donations"
defaultMessage="Donations"
/>
</a>
</div>
<div>

View File

@ -4,10 +4,10 @@ import styled from 'styled-components';
export const StyledFooter = styled.footer`
height: 250px;
margin-top: 80px;
padding: 60px 40px 10px 50px;
padding: 30px 40px 10px 50px;
background-color: #f9a826;
display: grid;
grid-template-columns: 200px 1fr 1fr 3fr;
grid-template-columns: 200px 1fr 1fr 1fr 3fr;
& a {
font-size: 14px;
@ -34,9 +34,12 @@ export const StyledFooter = styled.footer`
& div:nth-child(3) {
grid-column: 3;
}
& div:nth-child(4) {
grid-column: 4;
}
& div:nth-child(5) {
grid-column: 5;
text-align: right;
display: inline-block;
visibility: visible;

View File

@ -106,6 +106,10 @@ const LanguageMenu = (): React.ReactElement => {
{Locales.RU.label}
</MenuItem>
<MenuItem onClick={handleOnClick} id={Locales.ZH.code}>
{Locales.ZH.label}
</MenuItem>
<Divider />
<MenuItem

View File

@ -57,8 +57,8 @@ export const fetchMapById = (id: number): MapLoadResult => {
}
// Seach for object...
map = data?.find((m) => m.id == id);
if (map === null && !errorMsg) {
errorMsg = { msg: `Map with id ${id} could not be found. Please, reflesh the page` }
if (!map && !errorMsg) {
errorMsg = { msg: `Map with id ${id} could not be found. Please, reflesh the page. Map: ${JSON.stringify(data)}` }
}
}
return { isLoading: isLoading, error: errorMsg, map: map };