react-cheminfo 0.32.0 → 0.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/lib/axis/core/axisMarks.d.ts +54 -0
- package/lib/axis/core/axisMarks.d.ts.map +1 -0
- package/lib/axis/core/axisMarks.js +69 -0
- package/lib/axis/core/axisMarks.js.map +1 -0
- package/lib/axis/core/axisScale.d.ts +31 -0
- package/lib/axis/core/axisScale.d.ts.map +1 -0
- package/lib/axis/core/axisScale.js +31 -0
- package/lib/axis/core/axisScale.js.map +1 -0
- package/lib/axis/core/index.d.ts +16 -0
- package/lib/axis/core/index.d.ts.map +1 -0
- package/lib/axis/core/index.js +13 -0
- package/lib/axis/core/index.js.map +1 -0
- package/lib/axis/core/logAxisBounds.d.ts +78 -0
- package/lib/axis/core/logAxisBounds.d.ts.map +1 -0
- package/lib/axis/core/logAxisBounds.js +129 -0
- package/lib/axis/core/logAxisBounds.js.map +1 -0
- package/lib/axis/ui/AxisScaleControl.d.ts +66 -0
- package/lib/axis/ui/AxisScaleControl.d.ts.map +1 -0
- package/lib/axis/ui/AxisScaleControl.js +26 -0
- package/lib/axis/ui/AxisScaleControl.js.map +1 -0
- package/lib/axis/ui/index.d.ts +6 -0
- package/lib/axis/ui/index.d.ts.map +1 -0
- package/lib/axis/ui/index.js +5 -0
- package/lib/axis/ui/index.js.map +1 -0
- package/lib/core.d.ts +1 -0
- package/lib/core.d.ts.map +1 -1
- package/lib/core.js +1 -0
- package/lib/core.js.map +1 -1
- package/lib/delimited/core/index.d.ts +2 -0
- package/lib/delimited/core/index.d.ts.map +1 -1
- package/lib/delimited/core/index.js +1 -0
- package/lib/delimited/core/index.js.map +1 -1
- package/lib/delimited/core/tableRows.d.ts +49 -0
- package/lib/delimited/core/tableRows.d.ts.map +1 -0
- package/lib/delimited/core/tableRows.js +63 -0
- package/lib/delimited/core/tableRows.js.map +1 -0
- package/lib/delimited/ui/DelimitedTextPanel.d.ts +9 -0
- package/lib/delimited/ui/DelimitedTextPanel.d.ts.map +1 -1
- package/lib/delimited/ui/DelimitedTextPanel.js +3 -2
- package/lib/delimited/ui/DelimitedTextPanel.js.map +1 -1
- package/lib/delimited/ui/TableDataButton.d.ts +96 -0
- package/lib/delimited/ui/TableDataButton.d.ts.map +1 -0
- package/lib/delimited/ui/TableDataButton.js +39 -0
- package/lib/delimited/ui/TableDataButton.js.map +1 -0
- package/lib/delimited/ui/index.d.ts +2 -0
- package/lib/delimited/ui/index.d.ts.map +1 -1
- package/lib/delimited/ui/index.js +1 -0
- package/lib/delimited/ui/index.js.map +1 -1
- package/lib/i18n/core/chromeCatalog.d.ts +2 -2
- package/lib/i18n/core/chromeCatalog.d.ts.map +1 -1
- package/lib/i18n/core/chromeCatalog.js +10 -4
- package/lib/i18n/core/chromeCatalog.js.map +1 -1
- package/lib/i18n/core/index.d.ts +2 -0
- package/lib/i18n/core/index.d.ts.map +1 -1
- package/lib/i18n/core/index.js +1 -0
- package/lib/i18n/core/index.js.map +1 -1
- package/lib/i18n/core/languages.d.ts +4 -4
- package/lib/i18n/core/languages.d.ts.map +1 -1
- package/lib/i18n/core/languages.js +5 -4
- package/lib/i18n/core/languages.js.map +1 -1
- package/lib/i18n/core/prose.d.ts +32 -0
- package/lib/i18n/core/prose.d.ts.map +1 -0
- package/lib/i18n/core/prose.js +45 -0
- package/lib/i18n/core/prose.js.map +1 -0
- package/lib/i18n/ui/Prose.d.ts +28 -0
- package/lib/i18n/ui/Prose.d.ts.map +1 -0
- package/lib/i18n/ui/Prose.js +14 -0
- package/lib/i18n/ui/Prose.js.map +1 -0
- package/lib/i18n/ui/index.d.ts +2 -0
- package/lib/i18n/ui/index.d.ts.map +1 -1
- package/lib/i18n/ui/index.js +1 -0
- package/lib/i18n/ui/index.js.map +1 -1
- package/lib/locales/de.json +10 -0
- package/lib/locales/en.json +10 -0
- package/lib/locales/es.json +10 -0
- package/lib/locales/fr.json +10 -0
- package/lib/locales/it.json +465 -0
- package/lib/orbital/ui/AtomicOrbitalCanvas.d.ts +12 -2
- package/lib/orbital/ui/AtomicOrbitalCanvas.d.ts.map +1 -1
- package/lib/orbital/ui/AtomicOrbitalCanvas.js +17 -3
- package/lib/orbital/ui/AtomicOrbitalCanvas.js.map +1 -1
- package/lib/orbital/ui/AtomicOrbitalControls.d.ts +10 -5
- package/lib/orbital/ui/AtomicOrbitalControls.d.ts.map +1 -1
- package/lib/orbital/ui/AtomicOrbitalControls.js +12 -7
- package/lib/orbital/ui/AtomicOrbitalControls.js.map +1 -1
- package/lib/orbital/ui/AtomicOrbitalViewer.d.ts +8 -1
- package/lib/orbital/ui/AtomicOrbitalViewer.d.ts.map +1 -1
- package/lib/orbital/ui/AtomicOrbitalViewer.js.map +1 -1
- package/lib/periodic/core/index.d.ts +1 -1
- package/lib/periodic/core/index.d.ts.map +1 -1
- package/lib/periodic/core/index.js +1 -1
- package/lib/periodic/core/index.js.map +1 -1
- package/lib/periodic/core/layout.d.ts +18 -0
- package/lib/periodic/core/layout.d.ts.map +1 -1
- package/lib/periodic/core/layout.js +9 -0
- package/lib/periodic/core/layout.js.map +1 -1
- package/lib/periodic/ui/ElementCell.js +15 -3
- package/lib/periodic/ui/ElementCell.js.map +1 -1
- package/lib/periodic/ui/PeriodicTable.d.ts +12 -1
- package/lib/periodic/ui/PeriodicTable.d.ts.map +1 -1
- package/lib/periodic/ui/PeriodicTable.js +25 -3
- package/lib/periodic/ui/PeriodicTable.js.map +1 -1
- package/lib/ui.d.ts +1 -0
- package/lib/ui.d.ts.map +1 -1
- package/lib/ui.js +1 -0
- package/lib/ui.js.map +1 -1
- package/package.json +1 -1
- package/src/axis/core/axisMarks.ts +114 -0
- package/src/axis/core/axisScale.ts +41 -0
- package/src/axis/core/index.ts +20 -0
- package/src/axis/core/logAxisBounds.ts +198 -0
- package/src/axis/ui/AxisScaleControl.tsx +103 -0
- package/src/axis/ui/index.ts +9 -0
- package/src/core.ts +1 -0
- package/src/delimited/core/index.ts +2 -0
- package/src/delimited/core/tableRows.ts +93 -0
- package/src/delimited/ui/DelimitedTextPanel.tsx +25 -9
- package/src/delimited/ui/TableDataButton.tsx +162 -0
- package/src/delimited/ui/index.ts +2 -0
- package/src/i18n/core/chromeCatalog.ts +10 -4
- package/src/i18n/core/index.ts +2 -0
- package/src/i18n/core/languages.ts +5 -4
- package/src/i18n/core/prose.ts +53 -0
- package/src/i18n/ui/Prose.tsx +47 -0
- package/src/i18n/ui/index.ts +2 -0
- package/src/locales/de.json +10 -0
- package/src/locales/en.json +10 -0
- package/src/locales/es.json +10 -0
- package/src/locales/fr.json +10 -0
- package/src/locales/it.json +465 -0
- package/src/orbital/ui/AtomicOrbitalCanvas.tsx +32 -5
- package/src/orbital/ui/AtomicOrbitalControls.tsx +26 -6
- package/src/orbital/ui/AtomicOrbitalViewer.tsx +8 -1
- package/src/periodic/core/index.ts +1 -0
- package/src/periodic/core/layout.ts +19 -0
- package/src/periodic/ui/ElementCell.tsx +15 -3
- package/src/periodic/ui/PeriodicTable.tsx +45 -1
- package/src/ui.ts +1 -0
- package/styles/chrome.css +71 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The languages the family speaks.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Decided together rather than site by site: a visitor who switches to German
|
|
5
|
+
* on one tool and follows a link to the next must land in German there too, and
|
|
6
|
+
* a list that differs between two sites makes that impossible.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
/** Every language a site of the family is written in. */
|
|
10
|
-
export const LANGUAGES = ['en', 'fr', 'de', 'es'] as const;
|
|
10
|
+
export const LANGUAGES = ['en', 'fr', 'de', 'es', 'it'] as const;
|
|
11
11
|
|
|
12
12
|
/** One of {@link LANGUAGES}. */
|
|
13
13
|
export type Language = (typeof LANGUAGES)[number];
|
|
@@ -31,6 +31,7 @@ export const LANGUAGE_LABELS: Record<Language, string> = {
|
|
|
31
31
|
fr: 'Français',
|
|
32
32
|
de: 'Deutsch',
|
|
33
33
|
es: 'Español',
|
|
34
|
+
it: 'Italiano',
|
|
34
35
|
};
|
|
35
36
|
|
|
36
37
|
/**
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cutting a paragraph at the placeholders that stand for something drawn.
|
|
3
|
+
*
|
|
4
|
+
* Pure, and its own module: where a link falls in a sentence is the
|
|
5
|
+
* translator's decision — German puts the verb last, French rewrites the
|
|
6
|
+
* possessive around it — so the paragraph is one message with a `{name}` in it
|
|
7
|
+
* rather than fragments glued around a fixed anchor. What the pieces are drawn
|
|
8
|
+
* as is `Prose` in `react-cheminfo/ui`.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/** One piece of a paragraph: authored prose, or something the page draws. */
|
|
12
|
+
export type ProsePiece =
|
|
13
|
+
| { kind: 'text'; at: number; text: string }
|
|
14
|
+
| { kind: 'node'; at: number; name: string };
|
|
15
|
+
|
|
16
|
+
const PLACEHOLDER = /\{(?<name>\w+)\}/g;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Split a paragraph at the placeholders the page has something to draw for.
|
|
20
|
+
*
|
|
21
|
+
* A placeholder nobody named is left inside its text piece: it is either a
|
|
22
|
+
* value the message already had filled in, or a key a translation has got
|
|
23
|
+
* wrong, and neither is worth throwing the paragraph away for.
|
|
24
|
+
* @param text - The message, already written in the language of the page.
|
|
25
|
+
* @param names - The placeholders that stand for something drawn.
|
|
26
|
+
* @returns The pieces, in order, with no empty text piece between two nodes.
|
|
27
|
+
* `at` is the offset in the message, which makes it a stable React key.
|
|
28
|
+
*/
|
|
29
|
+
export function splitProse(
|
|
30
|
+
text: string,
|
|
31
|
+
names: readonly string[],
|
|
32
|
+
): ProsePiece[] {
|
|
33
|
+
const wanted = new Set(names);
|
|
34
|
+
const pieces: ProsePiece[] = [];
|
|
35
|
+
let cursor = 0;
|
|
36
|
+
for (const match of text.matchAll(PLACEHOLDER)) {
|
|
37
|
+
const name = match.groups?.name ?? '';
|
|
38
|
+
if (!wanted.has(name)) continue;
|
|
39
|
+
if (match.index > cursor) {
|
|
40
|
+
pieces.push({
|
|
41
|
+
kind: 'text',
|
|
42
|
+
at: cursor,
|
|
43
|
+
text: text.slice(cursor, match.index),
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
pieces.push({ kind: 'node', at: match.index, name });
|
|
47
|
+
cursor = match.index + match[0].length;
|
|
48
|
+
}
|
|
49
|
+
if (cursor < text.length) {
|
|
50
|
+
pieces.push({ kind: 'text', at: cursor, text: text.slice(cursor) });
|
|
51
|
+
}
|
|
52
|
+
return pieces;
|
|
53
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A paragraph of authored prose, with its inline marks drawn and its links put
|
|
3
|
+
* back where the sentence wants them.
|
|
4
|
+
*
|
|
5
|
+
* An explanation page is prose, not labels: it carries bold lead-ins, italics
|
|
6
|
+
* and a handful of links into the tool. `**strong**`, `*emphasis*` and
|
|
7
|
+
* `` `code` `` are the inline marks `InlineText` reads. A link is a `{name}`
|
|
8
|
+
* placeholder instead, cut out by `splitProse`, so a translation decides where
|
|
9
|
+
* in the sentence it falls.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import type { ReactElement, ReactNode } from 'react';
|
|
13
|
+
import { Fragment } from 'react';
|
|
14
|
+
|
|
15
|
+
import { InlineText } from '../../pedagogy/ui/InlineText.tsx';
|
|
16
|
+
import { splitProse } from '../core/prose.ts';
|
|
17
|
+
|
|
18
|
+
/** Props of {@link Prose}. */
|
|
19
|
+
export interface ProseProps {
|
|
20
|
+
/** The message, already written in the language of the page. */
|
|
21
|
+
text: string;
|
|
22
|
+
/**
|
|
23
|
+
* What each `{name}` placeholder of the message stands for.
|
|
24
|
+
* @default {}
|
|
25
|
+
*/
|
|
26
|
+
nodes?: Readonly<Record<string, ReactNode>>;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Draw one piece of prose.
|
|
31
|
+
* @param props - See {@link ProseProps}.
|
|
32
|
+
* @returns The prose, marks drawn and placeholders replaced.
|
|
33
|
+
*/
|
|
34
|
+
export function Prose(props: ProseProps): ReactElement {
|
|
35
|
+
const { text, nodes = {} } = props;
|
|
36
|
+
return (
|
|
37
|
+
<>
|
|
38
|
+
{splitProse(text, Object.keys(nodes)).map((piece) =>
|
|
39
|
+
piece.kind === 'text' ? (
|
|
40
|
+
<InlineText key={piece.at} text={piece.text} />
|
|
41
|
+
) : (
|
|
42
|
+
<Fragment key={piece.at}>{nodes[piece.name]}</Fragment>
|
|
43
|
+
),
|
|
44
|
+
)}
|
|
45
|
+
</>
|
|
46
|
+
);
|
|
47
|
+
}
|
package/src/i18n/ui/index.ts
CHANGED
package/src/locales/de.json
CHANGED
|
@@ -232,7 +232,14 @@
|
|
|
232
232
|
"overlay.reset": "Zurücksetzen",
|
|
233
233
|
"overlay.hoverAName": "Fahren Sie über einen Namen, um zu sehen, was er bewirkt.",
|
|
234
234
|
"overlay.dismiss": "Schließen",
|
|
235
|
+
"axis.scale": "Skala",
|
|
236
|
+
"axis.xScale": "X-Skala",
|
|
237
|
+
"axis.yScale": "Y-Skala",
|
|
238
|
+
"axis.linear": "Linear",
|
|
239
|
+
"axis.logarithmic": "Log",
|
|
240
|
+
"axis.scaleHelp": "Wie die Achse geteilt ist. Linear bekommt jede Einheit gleich viel Platz, so werden die größten Werte miteinander verglichen; logarithmisch bekommt jeder Faktor zehn gleich viel Platz, so sind die kleinen überhaupt sichtbar.",
|
|
235
241
|
"delimited.copyTable": "Tabelle kopieren",
|
|
242
|
+
"delimited.copyOrDownload": "Daten kopieren oder herunterladen",
|
|
236
243
|
"delimited.close": "Schließen",
|
|
237
244
|
"delimited.separator": "Trennzeichen",
|
|
238
245
|
"delimited.save": "Speichern",
|
|
@@ -262,6 +269,9 @@
|
|
|
262
269
|
"orbital.axesTitle": "Kartesische Achsen",
|
|
263
270
|
"orbital.axesBody": "x, y und z durch den Kern zeichnen. Die Bezeichnung benennt ein Orbital danach, wo seine Keulen gegenüber ihnen liegen.",
|
|
264
271
|
"orbital.axesExample": "vier Keulen zwischen der y- und der z-Achse, keine auf einer von beiden.",
|
|
272
|
+
"orbital.spin": "Das Orbital drehen",
|
|
273
|
+
"orbital.spinTitle": "Drehung",
|
|
274
|
+
"orbital.spinBody": "Das Orbital langsam um seine senkrechte Achse drehen. Ein fester Blickwinkel verbirgt, welche Keulen auf Sie zeigen; ein drehendes Orbital nicht.",
|
|
265
275
|
"orbital.resetTitle": "Ansicht zurücksetzen",
|
|
266
276
|
"orbital.resetBody": "Zurück zu Blickwinkel und Zoom, mit denen das Orbital geöffnet wurde. Ein Wechsel des Orbitals behält die Ansicht bei, in die Sie es gedreht haben.",
|
|
267
277
|
"viewer.capability.noWindow": "Der 3D-Betrachter braucht ein Browserfenster.",
|
package/src/locales/en.json
CHANGED
|
@@ -232,7 +232,14 @@
|
|
|
232
232
|
"overlay.reset": "Reset",
|
|
233
233
|
"overlay.hoverAName": "Hover a name for what it does.",
|
|
234
234
|
"overlay.dismiss": "Dismiss",
|
|
235
|
+
"axis.scale": "Scale",
|
|
236
|
+
"axis.xScale": "X scale",
|
|
237
|
+
"axis.yScale": "Y scale",
|
|
238
|
+
"axis.linear": "Linear",
|
|
239
|
+
"axis.logarithmic": "Log",
|
|
240
|
+
"axis.scaleHelp": "How the axis is spaced. Linear gives every unit the same room, so the largest values are read against each other; logarithmic gives every factor of ten the same room, so the small ones are visible at all.",
|
|
235
241
|
"delimited.copyTable": "Copy the table",
|
|
242
|
+
"delimited.copyOrDownload": "Copy or download data",
|
|
236
243
|
"delimited.close": "Close",
|
|
237
244
|
"delimited.separator": "Separator",
|
|
238
245
|
"delimited.save": "Save",
|
|
@@ -435,6 +442,9 @@
|
|
|
435
442
|
"orbital.axesTitle": "Cartesian axes",
|
|
436
443
|
"orbital.axesBody": "Draw x, y and z through the nucleus. The label names an orbital by where its lobes sit against them.",
|
|
437
444
|
"orbital.axesExample": "four lobes between the y and z axes, none on either.",
|
|
445
|
+
"orbital.spin": "Spin the orbital",
|
|
446
|
+
"orbital.spinTitle": "Spin",
|
|
447
|
+
"orbital.spinBody": "Turn the orbital slowly on its vertical axis. One fixed angle hides which lobes point towards you; a turning one does not.",
|
|
438
448
|
"orbital.resetTitle": "Reset the view",
|
|
439
449
|
"orbital.resetBody": "Back to the angle and zoom the orbital opened on. A change of orbital keeps whatever view you have turned it to.",
|
|
440
450
|
"viewer.capability.noWindow": "The 3D viewer needs a browser window.",
|
package/src/locales/es.json
CHANGED
|
@@ -232,7 +232,14 @@
|
|
|
232
232
|
"overlay.reset": "Reiniciar",
|
|
233
233
|
"overlay.hoverAName": "Pase el puntero sobre un nombre para ver qué hace.",
|
|
234
234
|
"overlay.dismiss": "Cerrar",
|
|
235
|
+
"axis.scale": "Escala",
|
|
236
|
+
"axis.xScale": "Escala X",
|
|
237
|
+
"axis.yScale": "Escala Y",
|
|
238
|
+
"axis.linear": "Lineal",
|
|
239
|
+
"axis.logarithmic": "Log",
|
|
240
|
+
"axis.scaleHelp": "Cómo se gradúa el eje. En lineal cada unidad ocupa el mismo espacio, de modo que se comparan los valores mayores entre sí; en logarítmica cada factor diez ocupa el mismo espacio, de modo que los pequeños llegan a verse.",
|
|
235
241
|
"delimited.copyTable": "Copiar la tabla",
|
|
242
|
+
"delimited.copyOrDownload": "Copiar o descargar los datos",
|
|
236
243
|
"delimited.close": "Cerrar",
|
|
237
244
|
"delimited.separator": "Separador",
|
|
238
245
|
"delimited.save": "Guardar",
|
|
@@ -262,6 +269,9 @@
|
|
|
262
269
|
"orbital.axesTitle": "Ejes cartesianos",
|
|
263
270
|
"orbital.axesBody": "Trazar x, y y z a través del núcleo. La etiqueta nombra un orbital por dónde quedan sus lóbulos respecto a ellos.",
|
|
264
271
|
"orbital.axesExample": "cuatro lóbulos entre los ejes y y z, ninguno sobre ninguno de los dos.",
|
|
272
|
+
"orbital.spin": "Girar el orbital",
|
|
273
|
+
"orbital.spinTitle": "Giro",
|
|
274
|
+
"orbital.spinBody": "Girar lentamente el orbital sobre su eje vertical. Un ángulo fijo oculta qué lóbulos apuntan hacia usted; uno que gira, no.",
|
|
265
275
|
"orbital.resetTitle": "Reiniciar la vista",
|
|
266
276
|
"orbital.resetBody": "Volver al ángulo y al zoom con los que se abrió el orbital. Un cambio de orbital conserva la vista a la que usted lo haya girado.",
|
|
267
277
|
"viewer.capability.noWindow": "El visor 3D necesita una ventana de navegador.",
|
package/src/locales/fr.json
CHANGED
|
@@ -232,7 +232,14 @@
|
|
|
232
232
|
"overlay.reset": "Réinitialiser",
|
|
233
233
|
"overlay.hoverAName": "Survolez un nom pour savoir ce qu'il fait.",
|
|
234
234
|
"overlay.dismiss": "Fermer",
|
|
235
|
+
"axis.scale": "Échelle",
|
|
236
|
+
"axis.xScale": "Échelle X",
|
|
237
|
+
"axis.yScale": "Échelle Y",
|
|
238
|
+
"axis.linear": "Linéaire",
|
|
239
|
+
"axis.logarithmic": "Log",
|
|
240
|
+
"axis.scaleHelp": "Comment l'axe est gradué. En linéaire, chaque unité occupe la même place, ce qui compare les grandes valeurs entre elles ; en logarithmique, chaque facteur dix occupe la même place, ce qui rend les petites visibles.",
|
|
235
241
|
"delimited.copyTable": "Copier le tableau",
|
|
242
|
+
"delimited.copyOrDownload": "Copier ou télécharger les données",
|
|
236
243
|
"delimited.close": "Fermer",
|
|
237
244
|
"delimited.separator": "Séparateur",
|
|
238
245
|
"delimited.save": "Enregistrer",
|
|
@@ -262,6 +269,9 @@
|
|
|
262
269
|
"orbital.axesTitle": "Axes cartésiens",
|
|
263
270
|
"orbital.axesBody": "Tracer x, y et z à travers le noyau. L'étiquette nomme une orbitale par la position de ses lobes par rapport à eux.",
|
|
264
271
|
"orbital.axesExample": "quatre lobes entre les axes y et z, aucun sur l'un ou l'autre.",
|
|
272
|
+
"orbital.spin": "Faire tourner l'orbitale",
|
|
273
|
+
"orbital.spinTitle": "Rotation",
|
|
274
|
+
"orbital.spinBody": "Faire tourner lentement l'orbitale sur son axe vertical. Un angle fixe cache quels lobes pointent vers vous ; une orbitale qui tourne, non.",
|
|
265
275
|
"orbital.resetTitle": "Réinitialiser la vue",
|
|
266
276
|
"orbital.resetBody": "Revenir à l'angle et au zoom d'ouverture de l'orbitale. Un changement d'orbitale conserve la vue à laquelle vous l'avez tournée.",
|
|
267
277
|
"viewer.capability.noWindow": "La visionneuse 3D a besoin d'une fenêtre de navigateur.",
|