diff --git a/locales/de/gallery.json b/locales/de/gallery.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/locales/de/gallery.json @@ -0,0 +1 @@ +{} diff --git a/locales/de/modules.json b/locales/de/modules.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/locales/de/modules.json @@ -0,0 +1 @@ +{} diff --git a/locales/de/simulator.json b/locales/de/simulator.json index cb87765d..16f51074 100644 --- a/locales/de/simulator.json +++ b/locales/de/simulator.json @@ -1,104 +1,104 @@ { - "welcome": { - "title": "Willkommen bei der Strahlenoptik-Simulation", - "instruction": "Um eine optische Komponente hinzuzufügen, wählen Sie ein Werkzeug aus und klicken Sie auf das leere Feld.\nUm ein Beispiel zu laden, [wechseln Sie bitte zur Galerie](/gallery)." - }, - "common": { - "saveButton": "Speichern", - "cancelButton": "Abbrechen" - }, - "file": { - "title": "Datei", - "undo": { - "title": "Rückgängig" + "welcome": { + "title": "Willkommen bei der Strahlenoptik-Simulation", + "instruction": "Um eine optische Komponente hinzuzufügen, wählen Sie ein Werkzeug aus und klicken Sie auf das leere Feld.\nUm ein Beispiel zu laden, [wechseln Sie bitte zur Galerie](/gallery)." }, - "redo": { - "title": "Wiederherstellen" - }, - "reset": { - "title": "Zurücksetzen" - }, - "save": { - "title": "Speichern" - }, - "open": { - "title": "Öffnen", - "description": "Öffnet eine existierende Datei oder ein Hintergrundbild. Das Hintergundbild wird relativ zum Koordinatenursprung angezeigt. (Oder Datei hierher ziehen.)" - }, - "viewGallery": { - "title": "Galerie ansehen", - "description": "Zur Galerie-Seite wechseln und ein Beispiel laden." - } - }, - "settings": { - "title": "Einstellungen", - "rayDensity": { - "title": "Strahl-Anzahldichte" - }, - "layoutAids": { - "showGrid": "Raster", - "snapToGrid": "Anrasten", - "lockObjs": "Objekte sperren" - }, - "zoom": { - "title": "Zoom" - } - }, - "objBar": { - "applyToAll": { - "title": "Alle anwenden" + "common": { + "saveButton": "Speichern", + "cancelButton": "Abbrechen" }, - "duplicate": { - "title": "Duplizieren" + "file": { + "title": "Datei", + "undo": { + "title": "Rückgängig" + }, + "redo": { + "title": "Wiederherstellen" + }, + "reset": { + "title": "Zurücksetzen" + }, + "save": { + "title": "Speichern" + }, + "open": { + "title": "Öffnen", + "description": "Öffnet eine existierende Datei oder ein Hintergrundbild. Das Hintergundbild wird relativ zum Koordinatenursprung angezeigt. (Oder Datei hierher ziehen.)" + }, + "viewGallery": { + "title": "Galerie ansehen", + "description": "Zur Galerie-Seite wechseln und ein Beispiel laden." + } }, - "delete": { - "title": "Löschen" - } - }, - "sceneObjs": { - "common": { - "brightness": "Helligkeit", - "wavelength": "Wellenlänge", - "emisAngle": "Emissionswinkel", - "focalLength": "Brennweite" + "settings": { + "title": "Einstellungen", + "rayDensity": { + "title": "Strahl-Anzahldichte" + }, + "layoutAids": { + "showGrid": "Raster", + "snapToGrid": "Anrasten", + "lockObjs": "Objekte sperren" + }, + "zoom": { + "title": "Zoom" + } }, - "AngleSource": { - "symmetric": "symmetrisch" + "objBar": { + "applyToAll": { + "title": "Alle anwenden" + }, + "duplicate": { + "title": "Duplizieren" + }, + "delete": { + "title": "Löschen" + } }, - "BaseFilter": { - "filter": "Filter", - "bandwidth": "Bandbreite" + "sceneObjs": { + "common": { + "brightness": "Helligkeit", + "wavelength": "Wellenlänge", + "emisAngle": "Emissionswinkel", + "focalLength": "Brennweite" + }, + "AngleSource": { + "symmetric": "symmetrisch" + }, + "BaseFilter": { + "filter": "Filter", + "bandwidth": "Bandbreite" + }, + "IdealMirror": { + "cartesianSign": "Kartesische Zeichenkonvention" + }, + "BeamSplitter": { + "transRatio": "Transmissionsgrad" + }, + "BaseGlass": { + "refIndex": "Brechungsindex", + "refIndexInfo": { + "relative": "relativ, wenn Glaskörper überlappen", + "effective": "Wird dieses Objekt mit (absolutem) Brechungsindex n₁ simuliert, aber innerhalb eines anderen Glaskörpers mit Brechungsindex n₀ platziert, sollten Sie den Brechungsindex auf n₁/n₀ setzen. In komplizierten Fällen, bei denen mehrere Glaskörper überlappen, ergibt sich der effective Brechungsindex der überlappenden Region als Produkt der einzelnen Brechungsindizes." + }, + "cauchyCoeff": "Cauchy Koeffizient" + }, + "CropBox": { + "svgWarning": "Export als SVG-Datei. Farbmischungen und relative Brechungsindizes kleiner 1 sind nicht unterstützt." + } }, - "IdealMirror": { - "cartesianSign": "Kartesische Zeichenkonvention" + "saveModal": { + "title": "Speichern", + "fileName": "Name" }, - "BeamSplitter": { - "transRatio": "Transmissionsgrad" + "languageModal": { + "translatedFraction": "übersetzt", + "helpTranslate": "Helfen beim Übersetzen" }, - "BaseGlass": { - "refIndex": "Brechungsindex", - "refIndexInfo": { - "relative": "relativ, wenn Glaskörper überlappen", - "effective": "Wird dieses Objekt mit (absolutem) Brechungsindex n₁ simuliert, aber innerhalb eines anderen Glaskörpers mit Brechungsindex n₀ platziert, sollten Sie den Brechungsindex auf n₁/n₀ setzen. In komplizierten Fällen, bei denen mehrere Glaskörper überlappen, ergibt sich der effective Brechungsindex der überlappenden Region als Produkt der einzelnen Brechungsindizes." - }, - "cauchyCoeff": "Cauchy Koeffizient" + "generalWarnings": { + "shareLinkTooLong": "Die URL ist zu lang für einige Platformen. Es kann nötig sein die Datei zu \"Speichern\" und zu teilen." }, - "CropBox": { - "svgWarning": "Export als SVG-Datei. Farbmischungen und relative Brechungsindizes kleiner 1 sind nicht unterstützt." + "footer": { + "processing": "In Bearbeitung... hier klicken, um zu stoppen." } - }, - "saveModal": { - "title": "Speichern", - "fileName": "Name" - }, - "languageModal": { - "translatedFraction": "übersetzt", - "helpTranslate": "Helfen beim Übersetzen" - }, - "generalWarnings": { - "shareLinkTooLong": "Die URL ist zu lang für einige Platformen. Es kann nötig sein die Datei zu \"Speichern\" und zu teilen." - }, - "footer": { - "processing": "In Bearbeitung... hier klicken, um zu stoppen." - } -} \ No newline at end of file +} diff --git a/locales/en/modules.json b/locales/en/modules.json index 10d895c7..83a0ecec 100644 --- a/locales/en/modules.json +++ b/locales/en/modules.json @@ -1,141 +1,141 @@ { - "modulesPage": { - "description": { - "makeNewTools": "The \"Module\" feature allows making new tools by combining, specializing, or reparametrizing objects created by existing tools in this simulator.", - "appearAsTools": "Imported modules will appear as tools in the \"Other\" category. Please select and click the blank space according to the order of the control point sequence (see \"Specification\").", - "embeddedInScene": "Imported modules are embedded in the data of the scene, so will not be automatically updated when the authors of the modules update them." - }, - "import": "Import", - "imported": "Imported", - "specification": { - "title": "Specification", - "controlPointSequence": "Control point sequence", - "parameters": "Parameters" - }, - "customization": { - "title": "Customization", - "description": "Modules can be made or customized directly within the web app using the built-in JSON editor. See [the tutorial](/modules/tutorial). Customization of imported modules will only affect the current scene." - }, - "contribution": { - "title": "Contribution", - "description": "Contributing to the list above is welcome. To contribute your module, see [Contributing modules](/contributing/modules)." - } - }, - "moduleData": { - "FresnelLens": { - "title": "Fresnel Lens", - "description": "A Fresnel lens made from a half circle piece of glass. Modularized version of [this Gallery example](/gallery/fresnel-lens).", - "point1": "The first endpoint of the lens", - "point2": "The second endpoint of the lens", - "Nslice": "The number of slices", - "refIndex": "The refractive index of the lens" - }, - "ContSpectrum": { - "title": "Continuous spectrum light source", - "description": "A light source with a uniform continuous spectrum decretized with a given constant step. Only works when \"Simulate Colors\" is on.", - "point1": "The origin of the rays", - "point2": "Determines the direction of the rays", - "min": "The minimum wavelength", - "step": "The step of the wavelength", - "max": "The maximum wavelength", - "brightness": "The total brightness" - }, - "CircleSource": { - "title": "Circular light source", - "description": "A circle with uniform 180-degree point sources places along its circumference.", - "point1": "The center of the circle", - "r": "The radius of the circle", - "N": "The number of point sources", - "brightness": "The total brightness" - }, - "Chaff": { - "title": "Chaff", - "description": "A chaff of a rectangular shape consisting of random pieces of mirrors. Modularized version of [this Gallery example](/gallery/chaff-countermeasure).", - "point1": "The top-left corner of the chaff", - "point2": "The bottom-right corner of the chaff", - "N": "The number of mirrors in the chaff", - "L": "The length of the mirrors" - }, - "BeamExpander": { - "title": "Beam Expander", - "description": "The combination of two ideal lenses with the sum of their focal lengths equals their separation distance. They expand or reduce the diameter of a beam of collimated light. Modularized version of [this Gallery example](/gallery/beam-expanders).", - "point1": "The center of the first lens", - "point2": "The second point of the second lens", - "point3": "Determines the common focal point of the lenses" - }, - "RayRelay": { - "title": "Ray Relay", - "description": "A series of ideal identical lenses with focal length \\(f\\) and distance \\(d\\) between the lenses. A non-divergent ray trajectory is guaranteed if and only if \\(d\\leq 4f\\). Modularized version of [this Gallery example](/gallery/ray-relaying).", - "point1": "The first endpoint of the first lens", - "point2": "The second endpoint of the first lens (should have the same \\(x\\) as the first point)", - "f": "The focal length of the lenses", - "d": "The distance between the lenses", - "N": "The number of lenses" - }, - "OpticalFiber": { - "title": "Optical Fiber", - "description": "Line-shaped optical fiber with given core and cladding thickness and refractive indices.", - "point1": "The first endpoint of the optical fiber", - "point2": "The second endpoint of the optical fiber (should have the same \\(y\\) as the first point)", - "X": "The thickness of the core", - "Y": "The thickness of the cladding", - "n1": "The refractive index of the core", - "n2": "The refractive index of the cladding" - } - }, - "moduleTutorial": { - "title": "Tutorial for making Ray Optics Modules", - "opening": { - "description": "This tutorial will guide you through the basics of making a custom module, which can be done entirely within the web app, without the need of any external development environment.", - "moduleIntroduction": "The \"Module\" feature of Ray Optics Simulation allows the creation of modular combinations of objects with custom parameters, custom control points, and arrays of objects. This feature extends the capability of this simulator by combining, specializing, or reparametrizing objects created by existing tools to make new tools. For example, the `CircleSource` module (see Tools -> Other -> Import module) combines an array of point sources created by the existing \"Point Source (<360°)\" tool along a circle, to make a \"circular source\" tool which didn't exist in the simulator. The `FresnelLens` module specializes the \"Glass->Custom equation\" tool, so that the equation represents a specific curve of the Fresnel lens parametrized by the number of slices, thus making a specialized \"Fresnel lens\" tool, which also didn't exist before. In addition to making new tools, this feature can also make some optics demonstrations more interactive. For example, by dragging the third control point of the `BeamExpander` module, one can directly see how the position of the common focal point of the two lenses affects the beam width, without needing to adjust the focal lengths of the two lenses individually.", - "compareWithHandle": "Note that not all custom control points require a module. Some simple cases can be achieved by the \"handle\" feature (see the \"Group, rotate, and scale objects\" section in the help popup at the bottom right corner of the simulator). Since making a module is much more complicated than creating a handle, you should first check if your case can be achieved by the \"handle\" feature before considering making a module. See [here](/gallery/black-cat-becomes-white) for a non-trivial example of a custom control point (moving two plastic bags out of water) without using a module." - }, - "jsonEditor": { - "title": "The built-in JSON editor", - "currentlyNoVisual": "This app currently does not have a visual interface for creating modules, so you need to directly edit the JSON of the scene.", - "enableJsonEditor": "You can enable the built-in JSON editor by clicking the \"settings\" dropdown at the top-right corner of the app, and then check \"Show JSON editor\". The code editor should appear at the left-hand side of the app, with the JSON code of the current scene. Make sure you have a large enough screen, as this feature does not work well on mobile devices.", - "updateAccordingly": "As you edit the scene using the usual visual scene editor, the code in the JSON editor will update accordingly, with the changed part highlighted. Conversely, directly editing the code in the JSON editor will update the scene accordingly. If you are not familiar with JSON or any kind of text-based data format, you may wish to play around with it for a while.", - "objsArray": "In particular, when you add an object to the scene, it is added to the `objs` array. And if you modify some of its properties to a non-default value, they appear as key-value pairs in that object.", - "inIframesBelow": "IMPORTANT: In this tutorial page, if you do not see the JSON code editor in the iframes below, please turn it on and reload this page, as you will need to see the code to understand how it works." - }, - "basics": { - "title": "Basics of a module", - "lookAtExample": "Let's look at our first example of a module.", - "lookAtJson": "You should see four lines of texts. By looking at the JSON editor, you will see that the first two are directly in the top-level `objs` array as usual, but the last two are in `modules.ExampleModule.objs` instead.", - "moduleDef": "The `module` is a dictionary where the key is the name of the module (in this case `ExampleModule`), and the value is the definition of that module. In particular, the `modules.ExampleModule.objs` array describes the (template of) objects within that module, which is different from the top-level `objs` which describes the objects in the scene.", - "putToScene": "To put the objects within the module to the scene, we need a \"module object\" in the top-level `objs` array, which is `objs[2]` in this example, whose type is `ModuleObj` and whose `module` property is the name of the module.", - "moduleDefNotEditable": "The module definition in the `modules` dictionary is not editable by the visual scene editor. So when you click any of the last two texts in this example, you are just selecting the module object, and not the objects in the module. Since the coordinates of the texts in the module definition in this example are absolute coordinates, the last two texts are not draggable. We will learn how to make them draggable by using control points later.", - "demodulize": "If you select a module object, there is a \"Demodulize\" button on the object bar. Clicking it will \"expand\" the module object into its constituent, and `objs` will now contain all the four texts. This operation is not reversible (but of course you can click \"undo\").", - "createModule": "The suggested way of creating a module currently is to first create an empty module using the JSON editor, create some objects using the visual scene editor, and then cut and paste the objects from `objs` to `modules.ModuleName.objs` using the JSON editor." - }, - "parameters": { - "title": "Adding parameters", - "lookAtExample": "The objects within the module can be defined by a set of parameters. Let’s look at a simple example", - "paramsArray": "Here `modules.ModuleName.params` is an array of strings `\"name=start:step:end:default\"` defining the name of the variables and the range of the sliders. The sliders appear on the object bar when the module object is selected.", - "equationSyntax": "Within the `modules.ExampleModule.objs` array, any values can be expressed using those parameters. Within a string (such as the `text` property of a `TextLabel`), the equations of the variables are enclosed by a pair of backticks. For number parameters (such as the `fontSize` property of a `TextLabel`), you need to make it a string so that you can use the backtick format in it, so each equation is sandwiched by a pair of backticks and a pair of quotes. The equation are evaluated with math.js ([syntax](/mathjs/syntax)). See there for the available syntax and functions you can use in the equations.", - "valueStorage": "The actual values of the parameters are stored in the `params` property of the module object, which, unlike the module definition, can be directly edited by the scene editor using the slider." - }, - "controlPoints": { - "title": "Adding control points", - "lookAtExample": "To make the module object draggable, we need to parametrize the objects within the module using a set of control points. Let’s look at the example", - "coordinatesOfControlPoints": "Here `modules.ModuleName.numPoints` defines the number of control points. The coordinates of the control points are (`x_1`, `y_1`), (`x_2`, `y_2`), etc, and are used in the same ways as the parameters within `modules.ExampleModule.objs` as described by the previous section. Note that the index starts from 1.", - "valueStorage": "The actual values of the coordinates of the control points are stored in the `points` property of the module object, which, unlike the hard-coded coordinates in Example 1, can be edited by the visual scene editor by dragging the control points, each shown as two concentric gray circles in the scene. If you drag elsewhere in the module object (such as dragging the text labels), all the control points will move together.", - "createAsTool": "Since our module object can now move, it is now quite easy to create multiple instances as in usual tools. The name of the module is shown in the Tools -> Other menu, and you can select that and then click two points in the blank space in sequence for the two control points to create another instance of the module. You can also use the “duplicate” button on the object bar." - }, - "arrayAndConditional": { - "title": "Arrays and conditionals", - "lookAtExample": "More complicated module can be built using arrays and conditionals. Let’s look at the example", - "specialKeys": "Within `modules.ExampleModule.objs`, any objects in an array can have two special keys: `\"for\"` and `\"if\"`. The value of the `\"for\"` key is either a string of the format `\"name=start:step:end\"` defining a loop variable, or an array of several strings of this format describing a multidimensional loop. Such an object in the array is duplicated several times according to the loop variables. The value of the `\"if\"` key is a string representing a math.js expression that evaluates to a boolean, and such an object is included in the array if and only if the boolean is true.", - "preventInfiniteLoop": "To prevent accidental infinite loop, the total number of iteration of each `\"for\"` loop is limited by the `maxLoopLength` property of the module definition, whose default value is 1000. You can set this property to a larger value if needed." - }, - "objsWithEqn": { - "title": "Objects with built-in custom equations", - "description": "For objects that already have custom equation input (such as Mirror -> Custom Equation), the equation property in the JSON is a string representing a LaTeX equation, rather than a math.js expression. To include custom parameters in the equation, you must use the same template syntax as if the LaTeX equation were a regular text. So the part enclosed by the backticks is in math.js expression, while the part outside is in LaTeX. The module parameters can only be accessed in the math.js part, and the independent variables of the custom equation (e.g. \\(x\\)) can only be accessed in the LaTeX part. Here is an example of generating a mirror with equation \\(y=\\cos(2\\pi x+\\phi)\\), where \\(\\phi\\) is a module parameter", - "future": "In the future, there may be a way to unified the equation input." - }, - "objsWithShapeParam": { - "title": "Objects with built-in shape parametrization", - "description": "For objects that already support different ways to define its shape (currently only Glass -> Spherical lens). There are special JSON syntax for such objects that can be used within the module definition, even if they are always defined by shape in the top level `objs` array. Here is an example" + "modulesPage": { + "description": { + "makeNewTools": "The \"Module\" feature allows making new tools by combining, specializing, or reparametrizing objects created by existing tools in this simulator.", + "appearAsTools": "Imported modules will appear as tools in the \"Other\" category. Please select and click the blank space according to the order of the control point sequence (see \"Specification\").", + "embeddedInScene": "Imported modules are embedded in the data of the scene, so will not be automatically updated when the authors of the modules update them." + }, + "import": "Import", + "imported": "Imported", + "specification": { + "title": "Specification", + "controlPointSequence": "Control point sequence", + "parameters": "Parameters" + }, + "customization": { + "title": "Customization", + "description": "Modules can be made or customized directly within the web app using the built-in JSON editor. See [the tutorial](/modules/tutorial). Customization of imported modules will only affect the current scene." + }, + "contribution": { + "title": "Contribution", + "description": "Contributing to the list above is welcome. To contribute your module, see [Contributing modules](/contributing/modules)." + } + }, + "moduleData": { + "FresnelLens": { + "title": "Fresnel Lens", + "description": "A Fresnel lens made from a half circle piece of glass. Modularized version of [this Gallery example](/gallery/fresnel-lens).", + "point1": "The first endpoint of the lens", + "point2": "The second endpoint of the lens", + "Nslice": "The number of slices", + "refIndex": "The refractive index of the lens" + }, + "ContSpectrum": { + "title": "Continuous spectrum light source", + "description": "A light source with a uniform continuous spectrum discretized with a given constant step. Only works when \"Simulate Colors\" is on.", + "point1": "The origin of the rays", + "point2": "Determines the direction of the rays", + "min": "The minimum wavelength", + "step": "The step of the wavelength", + "max": "The maximum wavelength", + "brightness": "The total brightness" + }, + "CircleSource": { + "title": "Circular light source", + "description": "A circle with uniform 180-degree point sources places along its circumference.", + "point1": "The center of the circle", + "r": "The radius of the circle", + "N": "The number of point sources", + "brightness": "The total brightness" + }, + "Chaff": { + "title": "Chaff", + "description": "A chaff of a rectangular shape consisting of random pieces of mirrors. Modularized version of [this Gallery example](/gallery/chaff-countermeasure).", + "point1": "The top-left corner of the chaff", + "point2": "The bottom-right corner of the chaff", + "N": "The number of mirrors in the chaff", + "L": "The length of the mirrors" + }, + "BeamExpander": { + "title": "Beam Expander", + "description": "The combination of two ideal lenses with the sum of their focal lengths equals their separation distance. They expand or reduce the diameter of a beam of collimated light. Modularized version of [this Gallery example](/gallery/beam-expanders).", + "point1": "The center of the first lens", + "point2": "The second point of the second lens", + "point3": "Determines the common focal point of the lenses" + }, + "RayRelay": { + "title": "Ray Relay", + "description": "A series of ideal identical lenses with focal length \\(f\\) and distance \\(d\\) between the lenses. A non-divergent ray trajectory is guaranteed if and only if \\(d\\leq 4f\\). Modularized version of [this Gallery example](/gallery/ray-relaying).", + "point1": "The first endpoint of the first lens", + "point2": "The second endpoint of the first lens (should have the same \\(x\\) as the first point)", + "f": "The focal length of the lenses", + "d": "The distance between the lenses", + "N": "The number of lenses" + }, + "OpticalFiber": { + "title": "Optical Fiber", + "description": "Line-shaped optical fiber with given core and cladding thickness and refractive indices.", + "point1": "The first endpoint of the optical fiber", + "point2": "The second endpoint of the optical fiber (should have the same \\(y\\) as the first point)", + "X": "The thickness of the core", + "Y": "The thickness of the cladding", + "n1": "The refractive index of the core", + "n2": "The refractive index of the cladding" + } + }, + "moduleTutorial": { + "title": "Tutorial for making Ray Optics Modules", + "opening": { + "description": "This tutorial will guide you through the basics of making a custom module, which can be done entirely within the web app, without the need of any external development environment.", + "moduleIntroduction": "The \"Module\" feature of Ray Optics Simulation allows the creation of modular combinations of objects with custom parameters, custom control points, and arrays of objects. This feature extends the capability of this simulator by combining, specializing, or reparametrizing objects created by existing tools to make new tools. For example, the `CircleSource` module (see Tools -> Other -> Import module) combines an array of point sources created by the existing \"Point Source (<360°)\" tool along a circle, to make a \"circular source\" tool which didn't exist in the simulator. The `FresnelLens` module specializes the \"Glass->Custom equation\" tool, so that the equation represents a specific curve of the Fresnel lens parametrized by the number of slices, thus making a specialized \"Fresnel lens\" tool, which also didn't exist before. In addition to making new tools, this feature can also make some optics demonstrations more interactive. For example, by dragging the third control point of the `BeamExpander` module, one can directly see how the position of the common focal point of the two lenses affects the beam width, without needing to adjust the focal lengths of the two lenses individually.", + "compareWithHandle": "Note that not all custom control points require a module. Some simple cases can be achieved by the \"handle\" feature (see the \"Group, rotate, and scale objects\" section in the help popup at the bottom right corner of the simulator). Since making a module is much more complicated than creating a handle, you should first check if your case can be achieved by the \"handle\" feature before considering making a module. See [here](/gallery/black-cat-becomes-white) for a non-trivial example of a custom control point (moving two plastic bags out of water) without using a module." + }, + "jsonEditor": { + "title": "The built-in JSON editor", + "currentlyNoVisual": "This app currently does not have a visual interface for creating modules, so you need to directly edit the JSON of the scene.", + "enableJsonEditor": "You can enable the built-in JSON editor by clicking the \"settings\" dropdown at the top-right corner of the app, and then check \"Show JSON editor\". The code editor should appear at the left-hand side of the app, with the JSON code of the current scene. Make sure you have a large enough screen, as this feature does not work well on mobile devices.", + "updateAccordingly": "As you edit the scene using the usual visual scene editor, the code in the JSON editor will update accordingly, with the changed part highlighted. Conversely, directly editing the code in the JSON editor will update the scene accordingly. If you are not familiar with JSON or any kind of text-based data format, you may wish to play around with it for a while.", + "objsArray": "In particular, when you add an object to the scene, it is added to the `objs` array. And if you modify some of its properties to a non-default value, they appear as key-value pairs in that object.", + "inIframesBelow": "IMPORTANT: In this tutorial page, if you do not see the JSON code editor in the iframes below, please turn it on and reload this page, as you will need to see the code to understand how it works." + }, + "basics": { + "title": "Basics of a module", + "lookAtExample": "Let's look at our first example of a module.", + "lookAtJson": "You should see four lines of texts. By looking at the JSON editor, you will see that the first two are directly in the top-level `objs` array as usual, but the last two are in `modules.ExampleModule.objs` instead.", + "moduleDef": "The `module` is a dictionary where the key is the name of the module (in this case `ExampleModule`), and the value is the definition of that module. In particular, the `modules.ExampleModule.objs` array describes the (template of) objects within that module, which is different from the top-level `objs` which describes the objects in the scene.", + "putToScene": "To put the objects within the module to the scene, we need a \"module object\" in the top-level `objs` array, which is `objs[2]` in this example, whose type is `ModuleObj` and whose `module` property is the name of the module.", + "moduleDefNotEditable": "The module definition in the `modules` dictionary is not editable by the visual scene editor. So when you click any of the last two texts in this example, you are just selecting the module object, and not the objects in the module. Since the coordinates of the texts in the module definition in this example are absolute coordinates, the last two texts are not draggable. We will learn how to make them draggable by using control points later.", + "demodulize": "If you select a module object, there is a \"Demodulize\" button on the object bar. Clicking it will \"expand\" the module object into its constituent, and `objs` will now contain all the four texts. This operation is not reversible (but of course you can click \"undo\").", + "createModule": "The suggested way of creating a module currently is to first create an empty module using the JSON editor, create some objects using the visual scene editor, and then cut and paste the objects from `objs` to `modules.ModuleName.objs` using the JSON editor." + }, + "parameters": { + "title": "Adding parameters", + "lookAtExample": "The objects within the module can be defined by a set of parameters. Let’s look at a simple example", + "paramsArray": "Here `modules.ModuleName.params` is an array of strings `\"name=start:step:end:default\"` defining the name of the variables and the range of the sliders. The sliders appear on the object bar when the module object is selected.", + "equationSyntax": "Within the `modules.ExampleModule.objs` array, any values can be expressed using those parameters. Within a string (such as the `text` property of a `TextLabel`), the equations of the variables are enclosed by a pair of backticks. For number parameters (such as the `fontSize` property of a `TextLabel`), you need to make it a string so that you can use the backtick format in it, so each equation is sandwiched by a pair of backticks and a pair of quotes. The equation are evaluated with math.js ([syntax](/mathjs/syntax)). See there for the available syntax and functions you can use in the equations.", + "valueStorage": "The actual values of the parameters are stored in the `params` property of the module object, which, unlike the module definition, can be directly edited by the scene editor using the slider." + }, + "controlPoints": { + "title": "Adding control points", + "lookAtExample": "To make the module object draggable, we need to parametrize the objects within the module using a set of control points. Let’s look at the example", + "coordinatesOfControlPoints": "Here `modules.ModuleName.numPoints` defines the number of control points. The coordinates of the control points are (`x_1`, `y_1`), (`x_2`, `y_2`), etc, and are used in the same ways as the parameters within `modules.ExampleModule.objs` as described by the previous section. Note that the index starts from 1.", + "valueStorage": "The actual values of the coordinates of the control points are stored in the `points` property of the module object, which, unlike the hard-coded coordinates in Example 1, can be edited by the visual scene editor by dragging the control points, each shown as two concentric gray circles in the scene. If you drag elsewhere in the module object (such as dragging the text labels), all the control points will move together.", + "createAsTool": "Since our module object can now move, it is now quite easy to create multiple instances as in usual tools. The name of the module is shown in the Tools -> Other menu, and you can select that and then click two points in the blank space in sequence for the two control points to create another instance of the module. You can also use the “duplicate” button on the object bar." + }, + "arrayAndConditional": { + "title": "Arrays and conditionals", + "lookAtExample": "More complicated module can be built using arrays and conditionals. Let’s look at the example", + "specialKeys": "Within `modules.ExampleModule.objs`, any objects in an array can have two special keys: `\"for\"` and `\"if\"`. The value of the `\"for\"` key is either a string of the format `\"name=start:step:end\"` defining a loop variable, or an array of several strings of this format describing a multidimensional loop. Such an object in the array is duplicated several times according to the loop variables. The value of the `\"if\"` key is a string representing a math.js expression that evaluates to a boolean, and such an object is included in the array if and only if the boolean is true.", + "preventInfiniteLoop": "To prevent accidental infinite loop, the total number of iteration of each `\"for\"` loop is limited by the `maxLoopLength` property of the module definition, whose default value is 1000. You can set this property to a larger value if needed." + }, + "objsWithEqn": { + "title": "Objects with built-in custom equations", + "description": "For objects that already have custom equation input (such as Mirror -> Custom Equation), the equation property in the JSON is a string representing a LaTeX equation, rather than a math.js expression. To include custom parameters in the equation, you must use the same template syntax as if the LaTeX equation were a regular text. So the part enclosed by the backticks is in math.js expression, while the part outside is in LaTeX. The module parameters can only be accessed in the math.js part, and the independent variables of the custom equation (e.g. \\(x\\)) can only be accessed in the LaTeX part. Here is an example of generating a mirror with equation \\(y=\\cos(2\\pi x+\\phi)\\), where \\(\\phi\\) is a module parameter", + "future": "In the future, there may be a way to unified the equation input." + }, + "objsWithShapeParam": { + "title": "Objects with built-in shape parametrization", + "description": "For objects that already support different ways to define its shape (currently only Glass -> Spherical lens). There are special JSON syntax for such objects that can be used within the module definition, even if they are always defined by shape in the top level `objs` array. Here is an example" + } } - } -} \ No newline at end of file +} diff --git a/locales/es/gallery.json b/locales/es/gallery.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/locales/es/gallery.json @@ -0,0 +1 @@ +{} diff --git a/locales/es/modules.json b/locales/es/modules.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/locales/es/modules.json @@ -0,0 +1 @@ +{} diff --git a/locales/es/simulator.json b/locales/es/simulator.json index 1b6cde37..705b1793 100644 --- a/locales/es/simulator.json +++ b/locales/es/simulator.json @@ -1,226 +1,226 @@ { - "welcome": { - "title": "Bienvenido a la simulación de Óptica de rayos", - "instruction": "Para añadir un componente óptico, seleccione una herramienta y presione el espacio en blanco.\nPara cargar un ejemplo, por favor, [diríjase a la página de la galería](/gallery)." - }, - "common": { - "saveButton": "Guardar", - "cancelButton": "Cancelar", - "closeButton": "Cerrar" - }, - "file": { - "title": "Archivo", - "undo": { - "title": "Deshacer" + "welcome": { + "title": "Bienvenido a la simulación de Óptica de rayos", + "instruction": "Para añadir un componente óptico, seleccione una herramienta y presione el espacio en blanco.\nPara cargar un ejemplo, por favor, [diríjase a la página de la galería](/gallery)." }, - "redo": { - "title": "Rehacer" - }, - "reset": { - "title": "Restablecer" - }, - "save": { - "title": "Guardar" - }, - "open": { - "title": "Abrir", - "description": "Abrir un archivo existente o una imagen de fondo. La imagen de fondo se mostrará desde el origen de coordenadas. (O arrastre el archivo)." - }, - "export": { - "title": "Exportar como PNG/SVG" - }, - "copyLink": { - "title": "Copiar enlace compartible" - }, - "viewGallery": { - "title": "Ver galería", - "description": "Ir a la Galería para cargar un ejemplo." - } - }, - "settings": { - "title": "Ajustes", - "more": "Más", - "rayDensity": { - "title": "Densidad de rayos", - "description": "Determinar el numero de rayos emitidos por haces y fuentes puntuales. Esto también afecta a la precisión de la detección de las imágenes y a la renderización del color." - }, - "layoutAids": { - "title": "Ayuda con el diseño", - "showGrid": "Cuadrícula", - "snapToGrid": "Ajustar a la cuadrícula", - "lockObjs": "Bloquear objetos" - }, - "gridSize": { - "title": "Tamaño de la cuadrícula" - }, - "observerSize": { - "title": "Tamaño del observador" - }, - "zoom": { - "title": "Zoom" - }, - "language": { - "title": "Idioma" - }, - "showStatusBox": { - "title": "Mostrar diálogo de estado" - }, - "showHelpPopups": { - "title": "Mostrar ventanas de ayuda", - "description": "Definir si mostrar ventanas de ayuda al pasar sobre los botones (Volver a cargar las páginas para que tome efecto.)" - }, - "advancedHelp": "Para ayuda avanzada, vea el icono de ayuda en la esquina inferior derecha." - }, - "objBar": { - "showAdvanced": { - "title": "Más opciones..." - }, - "applyToAll": { - "title": "Aplicar a todos" - }, - "duplicate": { - "title": "Duplicar" - }, - "delete": { - "title": "Borrar" - }, - "unselect": { - "title": "Deseleccionar", - "description": "Deseleccionar este objecto (click derecho en un espacio en blanco tiene la misma función.)" - } - }, - "sceneObjs": { "common": { - "brightness": "Brillo", - "brightnessInfo": { - "rayDensity": "Solo es efectivo si la 'Densidad de rayos' es suficientemente alta.", - "rayDensitySlider": "Para controlar el número de rayos emitidos, por favor ajustar el deslizante global 'Densidad de rayos'." - }, - "wavelength": "Longitud de onda", - "emisAngle": "Angulo de emisión", - "random": "Aleatorio", - "lambert": "Lambertiana", - "focalLength": "Distancia focal" - }, - "Beam": { - "imageDetectionWarning": "Detección de imagen puede no funcionar con rayos divergentes/ aleatorios" - }, - "AngleSource": { - "symmetric": "Simétrico" - }, - "BaseFilter": { - "filter": "Filtro", - "bandwidth": "Ancho de banda", - "invert": "Invertir" - }, - "IdealMirror": { - "cartesianSign": "Convenio de signos cartesiano" - }, - "BeamSplitter": { - "transRatio": "Cociente de transmisión" - }, - "BaseGlass": { - "refIndex": "Indice de refracción", - "refIndexInfo": { - "relative": "Relativo si esta dentro de otro vidrio", - "effective": "Si este objeto se tiene que simular con un índice de refracción (absoluto) n₁, pero esta situado dentro de otro vidrio con índice de refracción n₀, entonces deberá establecer el índice de refracción en n₁/n₀ aquí. En casos más complicados donde varios vidrios se sobrepongan, el índice de refracción efectivo de la región sobrepuesta es igual al producto de los índices de refracción por separado." - }, - "cauchyCoeff": "Coeficiente de Cauchy" - }, - "SphericalLens": { - "defBy": { - "radiiOfCurvature": "Radios de curvatura", - "focalDistances": "Distancias focales" - } - }, - "BaseGrinGlass": { - "refIndexFnOrigin": "Origen de n(x,y)", - "stepSize": "Tamaño de paso de la solución numérica", - "stepSizeInfo": "Tamaño de paso para el método de Euler para resolver la ecuación de la eikonal de rayos - ver la función 'step' y la documentación dentro del archivo 'BaseGrinGlass.js' para más información.", - "intersectTol": "Tolerancia de la intersección", - "symbolicBodyMerging": "Unión simbólica de cuerpos", - "symbolicBodyMergingInfo": { - "all": "Esta opción se aplica a todos los objetos GRIN de la simulación.", - "impl": "Actualmente este simulador tiene dos implementaciones de propagación de la luz entre medios, para objetos GRIN - numéricos y simbólicos (vea las funciones 'multRefIndex' y 'devRefIndex' en 'BaseGrinGlass.js').", - "implNote": "La implementación numérica es más rápida pero no siempre funciona correctamente (dependiendo del caso en concreto) en escenarios donde se usa más de un objeto GRIN,tal que al menos una de ellas tiene una función de índice de refracción que no está definida en todo el plano, mientras que la implementación simbólica és más lenta pero robusta con estos problemas." - } - }, - "CircleGrinGlass": { - "epsInfo": { - "units": "Unidades - [longitud]^2.", - "functions": "Esta tolerancia numérica se usa en las funciones 'isOutsideGlass', 'isInsideGlass' y 'isOnBoundary', dentro del archivo 'CircleGrinGlass.js'." - } - }, - "GrinGlass": { - "epsInfo": { - "units": "Unidades - [longitud].", - "functions": "Esta tolerancia numérica se usa en las funciones 'isOnBoundary' y 'countIntersections', dentro del archivo 'GrinGlass.js'." - } - }, - "Aperature": { - "diameter": "Diámetro" - }, - "Detector": { - "irradMap": "Mapa de irradiación", - "binSize": "Tamaño del contenedor", - "exportData": "Exportar datos" - }, - "TextLabel": { - "textHere": "Texto Aquí", - "fontSize": "Tamaño de fuente", - "font": "Fuente", - "fontStyle": "Estilo", - "fontStyles": { - "normal": "Normal", - "bold": "Negrita", - "italic": "Cursiva", - "boldItalic": "Negrita cursiva", - "oblique": "Oblicua", - "boldOblique": "Negrita oblicua" - }, - "alignment": "Alineamiento", - "alignments": { - "left": "Izquierda", - "center": "Centro", - "right": "Derecha" - }, - "smallCaps": "Mayúsculas pequeñas", - "angle": "Angulo" - }, - "LineArrow": { - "arrow": "Flecha adelante", - "backArrow": "Flecha atrás" - }, - "Drawing": { - "finishDrawing": "Finalizar dibujo" - }, - "CropBox": { - "title": "Exportar", - "cropBoxSize": "Tamaño de crop box", - "format": "Formato", - "width": "Ancho", - "svgWarning": "Exportar a SVG. Las mezclas de color y indices de refracción relativos por debajo de 1 no están soportados." + "saveButton": "Guardar", + "cancelButton": "Cancelar", + "closeButton": "Cerrar" + }, + "file": { + "title": "Archivo", + "undo": { + "title": "Deshacer" + }, + "redo": { + "title": "Rehacer" + }, + "reset": { + "title": "Restablecer" + }, + "save": { + "title": "Guardar" + }, + "open": { + "title": "Abrir", + "description": "Abrir un archivo existente o una imagen de fondo. La imagen de fondo se mostrará desde el origen de coordenadas. (O arrastre el archivo)." + }, + "export": { + "title": "Exportar como PNG/SVG" + }, + "copyLink": { + "title": "Copiar enlace compartible" + }, + "viewGallery": { + "title": "Ver galería", + "description": "Ir a la Galería para cargar un ejemplo." + } + }, + "settings": { + "title": "Ajustes", + "more": "Más", + "rayDensity": { + "title": "Densidad de rayos", + "description": "Determinar el numero de rayos emitidos por haces y fuentes puntuales. Esto también afecta a la precisión de la detección de las imágenes y a la renderización del color." + }, + "layoutAids": { + "title": "Ayuda con el diseño", + "showGrid": "Cuadrícula", + "snapToGrid": "Ajustar a la cuadrícula", + "lockObjs": "Bloquear objetos" + }, + "gridSize": { + "title": "Tamaño de la cuadrícula" + }, + "observerSize": { + "title": "Tamaño del observador" + }, + "zoom": { + "title": "Zoom" + }, + "language": { + "title": "Idioma" + }, + "showStatusBox": { + "title": "Mostrar diálogo de estado" + }, + "showHelpPopups": { + "title": "Mostrar ventanas de ayuda", + "description": "Definir si mostrar ventanas de ayuda al pasar sobre los botones (Volver a cargar las páginas para que tome efecto.)" + }, + "advancedHelp": "Para ayuda avanzada, vea el icono de ayuda en la esquina inferior derecha." + }, + "objBar": { + "showAdvanced": { + "title": "Más opciones..." + }, + "applyToAll": { + "title": "Aplicar a todos" + }, + "duplicate": { + "title": "Duplicar" + }, + "delete": { + "title": "Borrar" + }, + "unselect": { + "title": "Deseleccionar", + "description": "Deseleccionar este objecto (click derecho en un espacio en blanco tiene la misma función.)" + } + }, + "sceneObjs": { + "common": { + "brightness": "Brillo", + "brightnessInfo": { + "rayDensity": "Solo es efectivo si la 'Densidad de rayos' es suficientemente alta.", + "rayDensitySlider": "Para controlar el número de rayos emitidos, por favor ajustar el deslizante global 'Densidad de rayos'." + }, + "wavelength": "Longitud de onda", + "emisAngle": "Angulo de emisión", + "random": "Aleatorio", + "lambert": "Lambertiana", + "focalLength": "Distancia focal" + }, + "Beam": { + "imageDetectionWarning": "Detección de imagen puede no funcionar con rayos divergentes/ aleatorios" + }, + "AngleSource": { + "symmetric": "Simétrico" + }, + "BaseFilter": { + "filter": "Filtro", + "bandwidth": "Ancho de banda", + "invert": "Invertir" + }, + "IdealMirror": { + "cartesianSign": "Convenio de signos cartesiano" + }, + "BeamSplitter": { + "transRatio": "Cociente de transmisión" + }, + "BaseGlass": { + "refIndex": "Indice de refracción", + "refIndexInfo": { + "relative": "Relativo si esta dentro de otro vidrio", + "effective": "Si este objeto se tiene que simular con un índice de refracción (absoluto) n₁, pero esta situado dentro de otro vidrio con índice de refracción n₀, entonces deberá establecer el índice de refracción en n₁/n₀ aquí. En casos más complicados donde varios vidrios se sobrepongan, el índice de refracción efectivo de la región sobrepuesta es igual al producto de los índices de refracción por separado." + }, + "cauchyCoeff": "Coeficiente de Cauchy" + }, + "SphericalLens": { + "defBy": { + "radiiOfCurvature": "Radios de curvatura", + "focalDistances": "Distancias focales" + } + }, + "BaseGrinGlass": { + "refIndexFnOrigin": "Origen de n(x,y)", + "stepSize": "Tamaño de paso de la solución numérica", + "stepSizeInfo": "Tamaño de paso para el método de Euler para resolver la ecuación de la eikonal de rayos - ver la función 'step' y la documentación dentro del archivo 'BaseGrinGlass.js' para más información.", + "intersectTol": "Tolerancia de la intersección", + "symbolicBodyMerging": "Unión simbólica de cuerpos", + "symbolicBodyMergingInfo": { + "all": "Esta opción se aplica a todos los objetos GRIN de la simulación.", + "impl": "Actualmente este simulador tiene dos implementaciones de propagación de la luz entre medios, para objetos GRIN - numéricos y simbólicos (vea las funciones 'multRefIndex' y 'devRefIndex' en 'BaseGrinGlass.js').", + "implNote": "La implementación numérica es más rápida pero no siempre funciona correctamente (dependiendo del caso en concreto) en escenarios donde se usa más de un objeto GRIN,tal que al menos una de ellas tiene una función de índice de refracción que no está definida en todo el plano, mientras que la implementación simbólica és más lenta pero robusta con estos problemas." + } + }, + "CircleGrinGlass": { + "epsInfo": { + "units": "Unidades - [longitud]^2.", + "functions": "Esta tolerancia numérica se usa en las funciones 'isOutsideGlass', 'isInsideGlass' y 'isOnBoundary', dentro del archivo 'CircleGrinGlass.js'." + } + }, + "GrinGlass": { + "epsInfo": { + "units": "Unidades - [longitud].", + "functions": "Esta tolerancia numérica se usa en las funciones 'isOnBoundary' y 'countIntersections', dentro del archivo 'GrinGlass.js'." + } + }, + "Aperature": { + "diameter": "Diámetro" + }, + "Detector": { + "irradMap": "Mapa de irradiación", + "binSize": "Tamaño del contenedor", + "exportData": "Exportar datos" + }, + "TextLabel": { + "textHere": "Texto Aquí", + "fontSize": "Tamaño de fuente", + "font": "Fuente", + "fontStyle": "Estilo", + "fontStyles": { + "normal": "Normal", + "bold": "Negrita", + "italic": "Cursiva", + "boldItalic": "Negrita cursiva", + "oblique": "Oblicua", + "boldOblique": "Negrita oblicua" + }, + "alignment": "Alineamiento", + "alignments": { + "left": "Izquierda", + "center": "Centro", + "right": "Derecha" + }, + "smallCaps": "Mayúsculas pequeñas", + "angle": "Angulo" + }, + "LineArrow": { + "arrow": "Flecha adelante", + "backArrow": "Flecha atrás" + }, + "Drawing": { + "finishDrawing": "Finalizar dibujo" + }, + "CropBox": { + "title": "Exportar", + "cropBoxSize": "Tamaño de crop box", + "format": "Formato", + "width": "Ancho", + "svgWarning": "Exportar a SVG. Las mezclas de color y indices de refracción relativos por debajo de 1 no están soportados." + } + }, + "saveModal": { + "title": "Guardar", + "fileName": "Nombre" + }, + "languageModal": { + "title": "Idioma", + "translatedFraction": "traducida", + "helpTranslate": "Ayúdenos a traducir esta aplicación" + }, + "generalWarnings": { + "shareLinkTooLong": "La URL es demasiado larga y posiblemente no funcione en algunas plataformas. Posiblemente deba usar \"Guardar\" y compartir el archivo." + }, + "statusBox": { + "rayCount": "Número de segmentos de rayo", + "totalTruncation": "Brillo truncado", + "timeElapsed": "Tiempo transcurrido", + "forceStopped": "Fuerza detenida." + }, + "footer": { + "processing": "Procesando... Click aquí para detener." } - }, - "saveModal": { - "title": "Guardar", - "fileName": "Nombre" - }, - "languageModal": { - "title": "Idioma", - "translatedFraction": "traducida", - "helpTranslate": "Ayúdenos a traducir esta aplicación" - }, - "generalWarnings": { - "shareLinkTooLong": "La URL es demasiado larga y posiblemente no funcione en algunas plataformas. Posiblemente deba usar \"Guardar\" y compartir el archivo." - }, - "statusBox": { - "rayCount": "Número de segmentos de rayo", - "totalTruncation": "Brillo truncado", - "timeElapsed": "Tiempo transcurrido", - "forceStopped": "Fuerza detenida." - }, - "footer": { - "processing": "Procesando... Click aquí para detener." - } -} \ No newline at end of file +} diff --git a/locales/fr/gallery.json b/locales/fr/gallery.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/locales/fr/gallery.json @@ -0,0 +1 @@ +{} diff --git a/locales/fr/modules.json b/locales/fr/modules.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/locales/fr/modules.json @@ -0,0 +1 @@ +{} diff --git a/locales/ja/gallery.json b/locales/ja/gallery.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/locales/ja/gallery.json @@ -0,0 +1 @@ +{} diff --git a/locales/ja/modules.json b/locales/ja/modules.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/locales/ja/modules.json @@ -0,0 +1 @@ +{} diff --git a/locales/ja/simulator.json b/locales/ja/simulator.json index cd34be73..90ce422a 100644 --- a/locales/ja/simulator.json +++ b/locales/ja/simulator.json @@ -1,114 +1,114 @@ { - "welcome": { - "title": "光学シミュレーションの世界へようこそ", - "instruction": "光学部品を追加するには、ツールを選択し、空白部分をクリックします。\n例を読み込むには [ギャラリーページに移動してください。](/gallery)." - }, - "common": { - "saveButton": "保存", - "cancelButton": "キャンセル" - }, - "file": { - "title": "ファイル", - "undo": { - "title": "元に戻す" + "welcome": { + "title": "光学シミュレーションの世界へようこそ", + "instruction": "光学部品を追加するには、ツールを選択し、空白部分をクリックします。\n例を読み込むには [ギャラリーページに移動してください。](/gallery)." }, - "redo": { - "title": "やり直し" - }, - "reset": { - "title": "リセット" - }, - "save": { - "title": "保存" - }, - "open": { - "title": "開く", - "description": "既存のファイルまたは背景画像を開きます。 背景画像は座標原点から表示されます。 (またはファイルをドロップします)" - }, - "viewGallery": { - "title": "ギャラリーを見る", - "description": "ギャラリー Web ページに移動してサンプルをロードします。" - } - }, - "settings": { - "title": "設定", - "rayDensity": { - "title": "光線密度" - }, - "layoutAids": { - "showGrid": "グリッド", - "snapToGrid": "グリッドにスナップ", - "lockObjs": "オブジェクトを固定" - }, - "zoom": { - "title": "ズーム" - }, - "language": { - "title": "言語" - } - }, - "objBar": { - "applyToAll": { - "title": "すべてに適用" - }, - "duplicate": { - "title": "複製" - }, - "delete": { - "title": "消去" - } - }, - "sceneObjs": { "common": { - "brightness": "明るさ", - "wavelength": "波長", - "emisAngle": "放射角度", - "random": "ランダム", - "lambert": "ランバーシアン", - "focalLength": "焦点距離" - }, - "AngleSource": { - "symmetric": "対称" - }, - "BaseFilter": { - "filter": "フィルタ", - "bandwidth": "帯域幅", - "invert": "反転" - }, - "BeamSplitter": { - "transRatio": "透過率" - }, - "BaseGlass": { - "refIndex": "屈折率", - "refIndexInfo": { - "effective": "もし(絶対)屈折率n₁でシミュレートされる物体があったとしても、別の屈折率n₀のガラスの中に置かれる場合、ここで屈折率をn₁/n₀に設定する必要があります。複数のガラスが重なり合うような複雑なケースでは、重なり合う領域の実効反射率は、個々のものの反射率の積に等しくなります。" - } - }, - "TextLabel": { - "fontSize": "フォントサイズ", - "font": "フォント", - "fontStyle": "スタイル", - "alignment": "文字揃え", - "smallCaps": "スモールキャピタル", - "angle": "角度" - }, - "CropBox": { - "svgWarning": "SVG にエクスポートします。 色の混合と 1 未満の相対屈折率はサポートされていません." + "saveButton": "保存", + "cancelButton": "キャンセル" + }, + "file": { + "title": "ファイル", + "undo": { + "title": "元に戻す" + }, + "redo": { + "title": "やり直し" + }, + "reset": { + "title": "リセット" + }, + "save": { + "title": "保存" + }, + "open": { + "title": "開く", + "description": "既存のファイルまたは背景画像を開きます。 背景画像は座標原点から表示されます。 (またはファイルをドロップします)" + }, + "viewGallery": { + "title": "ギャラリーを見る", + "description": "ギャラリー Web ページに移動してサンプルをロードします。" + } + }, + "settings": { + "title": "設定", + "rayDensity": { + "title": "光線密度" + }, + "layoutAids": { + "showGrid": "グリッド", + "snapToGrid": "グリッドにスナップ", + "lockObjs": "オブジェクトを固定" + }, + "zoom": { + "title": "ズーム" + }, + "language": { + "title": "言語" + } + }, + "objBar": { + "applyToAll": { + "title": "すべてに適用" + }, + "duplicate": { + "title": "複製" + }, + "delete": { + "title": "消去" + } + }, + "sceneObjs": { + "common": { + "brightness": "明るさ", + "wavelength": "波長", + "emisAngle": "放射角度", + "random": "ランダム", + "lambert": "ランバーシアン", + "focalLength": "焦点距離" + }, + "AngleSource": { + "symmetric": "対称" + }, + "BaseFilter": { + "filter": "フィルタ", + "bandwidth": "帯域幅", + "invert": "反転" + }, + "BeamSplitter": { + "transRatio": "透過率" + }, + "BaseGlass": { + "refIndex": "屈折率", + "refIndexInfo": { + "effective": "もし(絶対)屈折率n₁でシミュレートされる物体があったとしても、別の屈折率n₀のガラスの中に置かれる場合、ここで屈折率をn₁/n₀に設定する必要があります。複数のガラスが重なり合うような複雑なケースでは、重なり合う領域の実効反射率は、個々のものの反射率の積に等しくなります。" + } + }, + "TextLabel": { + "fontSize": "フォントサイズ", + "font": "フォント", + "fontStyle": "スタイル", + "alignment": "文字揃え", + "smallCaps": "スモールキャピタル", + "angle": "角度" + }, + "CropBox": { + "svgWarning": "SVG にエクスポートします。 色の混合と 1 未満の相対屈折率はサポートされていません." + } + }, + "saveModal": { + "title": "保存", + "fileName": "名前" + }, + "languageModal": { + "title": "言語", + "translatedFraction": "翻訳済み", + "helpTranslate": "このアプリの翻訳にご協力ください" + }, + "generalWarnings": { + "shareLinkTooLong": "URL が長すぎるため、一部のプラットフォームでは機能しない可能性があります。 代わりに「保存」を使用してファイルを共有する必要がある場合があります。" + }, + "footer": { + "processing": "処理中...停止するにはここをクリックしてください." } - }, - "saveModal": { - "title": "保存", - "fileName": "名前" - }, - "languageModal": { - "title": "言語", - "translatedFraction": "翻訳済み", - "helpTranslate": "このアプリの翻訳にご協力ください" - }, - "generalWarnings": { - "shareLinkTooLong": "URL が長すぎるため、一部のプラットフォームでは機能しない可能性があります。 代わりに「保存」を使用してファイルを共有する必要がある場合があります。" - }, - "footer": { - "processing": "処理中...停止するにはここをクリックしてください." - } -} \ No newline at end of file +} diff --git a/locales/ko/gallery.json b/locales/ko/gallery.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/locales/ko/gallery.json @@ -0,0 +1 @@ +{} diff --git a/locales/ko/modules.json b/locales/ko/modules.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/locales/ko/modules.json @@ -0,0 +1 @@ +{} diff --git a/locales/ko/simulator.json b/locales/ko/simulator.json index c2260c69..4bafd008 100644 --- a/locales/ko/simulator.json +++ b/locales/ko/simulator.json @@ -1,142 +1,142 @@ { - "welcome": { - "title": "광선 광학 시뮬레이션에 오신 것을 환영합니다.", - "instruction": "광학 요소를 추가하려면 도구를 선택한 후 빈 공간을 클릭하십시오.\n예제를 불러오려면 [ 갤러리 페이지](/gallery)로 이동하십시오." - }, - "common": { - "saveButton": "저장", - "cancelButton": "취소", - "closeButton": "닫기" - }, - "file": { - "title": "파일", - "undo": { - "title": "실행 취소" + "welcome": { + "title": "광선 광학 시뮬레이션에 오신 것을 환영합니다.", + "instruction": "광학 요소를 추가하려면 도구를 선택한 후 빈 공간을 클릭하십시오.\n예제를 불러오려면 [ 갤러리 페이지](/gallery)로 이동하십시오." }, - "redo": { - "title": "재실행" - }, - "reset": { - "title": "재설정" - }, - "save": { - "title": "저장" - }, - "open": { - "title": "열기", - "description": "기존 파일이나 배경 이미지 열기. 배경 이미지는 좌표 원점을 기준으로 표시됩니다. (또는 파일을 올려놓으십시오.)" - }, - "viewGallery": { - "title": "갤러리 보기", - "description": "예제를 불러오기 위해 갤러리로 이동." - } - }, - "settings": { - "title": "설정", - "more": "더 보기", - "rayDensity": { - "title": "광선 밀도", - "description": "빔이나 점광원으로부터 발생하는 광선의 개수를 결정합니다. 상 검출과 색 표현에도 영향을 미칩니다." - }, - "layoutAids": { - "title": "레이아웃 도구", - "showGrid": "격자", - "snapToGrid": "격자선에 물리기", - "lockObjs": "사물 고정" - }, - "zoom": { - "title": "확대/축소" - }, - "language": { - "title": "언어" - }, - "showHelpPopups": { - "title": "도움말 팝업 표시", - "description": "버튼 위를 지날 때 도움말을 표시할 지 결정합니다. (효과 반영을 위해 페이지를 다시 불러옵니다.)" - }, - "advancedHelp": "추가적인 설명이 필요한 경우 우측 하단의 도움말 아이콘을 클릭하십시오." - }, - "objBar": { - "showAdvanced": { - "title": "추가 옵션" - }, - "applyToAll": { - "title": "전체에 적용" - }, - "duplicate": { - "title": "복제" - }, - "delete": { - "title": "삭제" - }, - "unselect": { - "title": "선택 해제", - "description": "이 물체의 선택을 해제합니다. (또는 빈 영역에 우클릭합니다.)" - } - }, - "sceneObjs": { "common": { - "brightness": "밝기", - "brightnessInfo": { - "rayDensity": "'광선 밀도'가 충분히 높을 때 유효합니다.", - "rayDensitySlider": "방출되는 광선의 개수를 조절하려면 '광선 밀도' 슬라이더를 조절하십시오." - }, - "wavelength": "파장", - "emisAngle": "방출 각", - "random": "랜덤", - "lambert": "램버시안 (Lambertian)", - "focalLength": "초점 거리" - }, - "Beam": { - "imageDetectionWarning": "발산하거나 랜덤한 빔의 경우 정상적으로 인식되지 않거나 작동하지 않을 수 있습니다." - }, - "AngleSource": { - "symmetric": "대칭" - }, - "BaseFilter": { - "filter": "필터", - "bandwidth": "대역폭 (Bandwidth)", - "invert": "반전" - }, - "IdealMirror": { - "cartesianSign": "직교좌표계 부호 변환" - }, - "BeamSplitter": { - "transRatio": "전송률" - }, - "BaseGlass": { - "refIndex": "굴절률", - "refIndexInfo": { - "relative": "다른 매질 내부에 있다면 상대 굴절률", - "effective": "이 객체가 (절대) 굴절률 n₁으로 시뮬레이션되어야 하는데 굴절률이 n₀인 다른 매질 내부에 있다면 상대 굴절률인 n₁/n₀ 를 입력해야합니다. 여러 장의 매질이 겹쳐진 복잡한 경우에는 겹친 영역의 실질적인 굴절률 (effective refractive index)은 매질 각각의 굴절률의 곱과 같습니다." - }, - "cauchyCoeff": "코시 계수 (Cauchy coefficient)" - }, - "TextLabel": { - "fontSize": "폰트 크기", - "font": "폰트", - "fontStyle": "스타일", - "alignment": "정렬", - "smallCaps": "Small Caps", - "angle": "각도" - }, - "CropBox": { - "svgWarning": "SVG로 추출하기. 색상 혼합 및 1 미만의 상대 굴절율은 지원되지 않습니다." + "saveButton": "저장", + "cancelButton": "취소", + "closeButton": "닫기" + }, + "file": { + "title": "파일", + "undo": { + "title": "실행 취소" + }, + "redo": { + "title": "재실행" + }, + "reset": { + "title": "재설정" + }, + "save": { + "title": "저장" + }, + "open": { + "title": "열기", + "description": "기존 파일이나 배경 이미지 열기. 배경 이미지는 좌표 원점을 기준으로 표시됩니다. (또는 파일을 올려놓으십시오.)" + }, + "viewGallery": { + "title": "갤러리 보기", + "description": "예제를 불러오기 위해 갤러리로 이동." + } + }, + "settings": { + "title": "설정", + "more": "더 보기", + "rayDensity": { + "title": "광선 밀도", + "description": "빔이나 점광원으로부터 발생하는 광선의 개수를 결정합니다. 상 검출과 색 표현에도 영향을 미칩니다." + }, + "layoutAids": { + "title": "레이아웃 도구", + "showGrid": "격자", + "snapToGrid": "격자선에 물리기", + "lockObjs": "사물 고정" + }, + "zoom": { + "title": "확대/축소" + }, + "language": { + "title": "언어" + }, + "showHelpPopups": { + "title": "도움말 팝업 표시", + "description": "버튼 위를 지날 때 도움말을 표시할 지 결정합니다. (효과 반영을 위해 페이지를 다시 불러옵니다.)" + }, + "advancedHelp": "추가적인 설명이 필요한 경우 우측 하단의 도움말 아이콘을 클릭하십시오." + }, + "objBar": { + "showAdvanced": { + "title": "추가 옵션" + }, + "applyToAll": { + "title": "전체에 적용" + }, + "duplicate": { + "title": "복제" + }, + "delete": { + "title": "삭제" + }, + "unselect": { + "title": "선택 해제", + "description": "이 물체의 선택을 해제합니다. (또는 빈 영역에 우클릭합니다.)" + } + }, + "sceneObjs": { + "common": { + "brightness": "밝기", + "brightnessInfo": { + "rayDensity": "'광선 밀도'가 충분히 높을 때 유효합니다.", + "rayDensitySlider": "방출되는 광선의 개수를 조절하려면 '광선 밀도' 슬라이더를 조절하십시오." + }, + "wavelength": "파장", + "emisAngle": "방출 각", + "random": "랜덤", + "lambert": "램버시안 (Lambertian)", + "focalLength": "초점 거리" + }, + "Beam": { + "imageDetectionWarning": "발산하거나 랜덤한 빔의 경우 정상적으로 인식되지 않거나 작동하지 않을 수 있습니다." + }, + "AngleSource": { + "symmetric": "대칭" + }, + "BaseFilter": { + "filter": "필터", + "bandwidth": "대역폭 (Bandwidth)", + "invert": "반전" + }, + "IdealMirror": { + "cartesianSign": "직교좌표계 부호 변환" + }, + "BeamSplitter": { + "transRatio": "전송률" + }, + "BaseGlass": { + "refIndex": "굴절률", + "refIndexInfo": { + "relative": "다른 매질 내부에 있다면 상대 굴절률", + "effective": "이 객체가 (절대) 굴절률 n₁으로 시뮬레이션되어야 하는데 굴절률이 n₀인 다른 매질 내부에 있다면 상대 굴절률인 n₁/n₀ 를 입력해야합니다. 여러 장의 매질이 겹쳐진 복잡한 경우에는 겹친 영역의 실질적인 굴절률 (effective refractive index)은 매질 각각의 굴절률의 곱과 같습니다." + }, + "cauchyCoeff": "코시 계수 (Cauchy coefficient)" + }, + "TextLabel": { + "fontSize": "폰트 크기", + "font": "폰트", + "fontStyle": "스타일", + "alignment": "정렬", + "smallCaps": "Small Caps", + "angle": "각도" + }, + "CropBox": { + "svgWarning": "SVG로 추출하기. 색상 혼합 및 1 미만의 상대 굴절율은 지원되지 않습니다." + } + }, + "saveModal": { + "title": "저장", + "fileName": "이름" + }, + "languageModal": { + "title": "언어", + "translatedFraction": "번역 됨", + "helpTranslate": "이 앱의 번역 참여" + }, + "generalWarnings": { + "shareLinkTooLong": "URL이 너무 길어서 일부 플랫폼에서 작동하지 않을 수 있습니다. 이 경우 \"저장\"을 사용해 파일을 공유하십시오." + }, + "footer": { + "processing": "작업중... 중단하려면 클릭." } - }, - "saveModal": { - "title": "저장", - "fileName": "이름" - }, - "languageModal": { - "title": "언어", - "translatedFraction": "번역 됨", - "helpTranslate": "이 앱의 번역 참여" - }, - "generalWarnings": { - "shareLinkTooLong": "URL이 너무 길어서 일부 플랫폼에서 작동하지 않을 수 있습니다. 이 경우 \"저장\"을 사용해 파일을 공유하십시오." - }, - "footer": { - "processing": "작업중... 중단하려면 클릭." - } -} \ No newline at end of file +} diff --git a/locales/nl/gallery.json b/locales/nl/gallery.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/locales/nl/gallery.json @@ -0,0 +1 @@ +{} diff --git a/locales/nl/modules.json b/locales/nl/modules.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/locales/nl/modules.json @@ -0,0 +1 @@ +{} diff --git a/locales/pl/modules.json b/locales/pl/modules.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/locales/pl/modules.json @@ -0,0 +1 @@ +{} diff --git a/locales/pl/simulator.json b/locales/pl/simulator.json index fe0c8b25..76658cc3 100644 --- a/locales/pl/simulator.json +++ b/locales/pl/simulator.json @@ -1,181 +1,181 @@ { - "welcome": { - "title": "Witamy w symulacji promieni optycznych", - "instruction": "Aby dodać komponent optyczny, zaznacz narzędzie i kliknij puste miejsce.\nAby załadować przykład, [przejdź do strony Galerii](/gallery)." - }, - "common": { - "saveButton": "Zapisz", - "cancelButton": "Anuluj", - "closeButton": "Zamknij" - }, - "file": { - "title": "Plik", - "undo": { - "title": "Cofnij" + "welcome": { + "title": "Witamy w symulacji promieni optycznych", + "instruction": "Aby dodać komponent optyczny, zaznacz narzędzie i kliknij puste miejsce.\nAby załadować przykład, [przejdź do strony Galerii](/gallery)." }, - "redo": { - "title": "Ponów" - }, - "reset": { - "title": "Resetuj" - }, - "save": { - "title": "Zapisz" - }, - "open": { - "title": "Otwórz", - "description": "Otwórz istniejący plik lub obraz tła. Obraz tła zostanie wyświetlony z punktu początkowego współrzędnych. (Lub upuść plik)" - }, - "viewGallery": { - "title": "Zobacz Galerię", - "description": "Przejdź do strony Galerii, aby załadować przykład." - } - }, - "settings": { - "title": "Ustawienia", - "more": "Więcej", - "rayDensity": { - "title": "Gęstość promieni", - "description": "Określa liczbę promieni emitowanych przez belki i źródła punktowe. Ma to również wpływ na dokładność wykrywania obrazu i renderowania kolorów." - }, - "layoutAids": { - "title": "Opcje układu", - "showGrid": "Siatka", - "snapToGrid": "Przyciągaj do siatki", - "lockObjs": "Zablokuj obiekty" - }, - "zoom": { - "title": "Zoom" - }, - "language": { - "title": "Język" - }, - "showHelpPopups": { - "title": "Pokaż okienka pomocy", - "description": "Określa, czy wyświetlać wyskakujące okienka pomocy po najechaniu kursorem na przyciski. (Załaduj ponownie stronę, aby zastosować.)" - }, - "advancedHelp": "Aby uzyskać zaawansowaną pomoc, zobacz ikonę pomocy w prawym dolnym rogu." - }, - "objBar": { - "showAdvanced": { - "title": "Więcej opcji..." - }, - "applyToAll": { - "title": "Zastosuj do wszystkich" - }, - "duplicate": { - "title": "Powiel" - }, - "delete": { - "title": "Usuń" - }, - "unselect": { - "title": "Odznacz", - "description": "Usuń zaznaczenie tego obiektu (kliknięcie prawym przyciskiem myszy pustego miejsca ma tę samą funkcję)." - } - }, - "sceneObjs": { "common": { - "brightness": "Jasność", - "brightnessInfo": { - "rayDensity": "Efektywne tylko wtedy, gdy 'Gęstość promieni' jest wystarczająco wysoka.", - "rayDensitySlider": "Aby kontrolować liczbę emitowanych promieni, dostosuj ogólny suwak 'Gęstość promieni'." - }, - "wavelength": "Długość fali", - "emisAngle": "Kąt emisji", - "random": "Losowo", - "lambert": "Lambertowskie", - "focalLength": "Ogniskowa" - }, - "Beam": { - "imageDetectionWarning": "Wykrywanie obrazu może nie działać w przypadku wiązek rozbieżnych/losowych." - }, - "AngleSource": { - "symmetric": "Symetryczna" - }, - "BaseFilter": { - "filter": "Filtr", - "bandwidth": "Szerokość pasma", - "invert": "Odwróć" - }, - "IdealMirror": { - "cartesianSign": "Konwencja znaków" - }, - "BeamSplitter": { - "transRatio": "Współczynnik transmisji" - }, - "BaseGlass": { - "refIndex": "Współczynnik załamania", - "refIndexInfo": { - "relative": "względny, jeśli znajduje się w innym szkle", - "effective": "Jeśli ten obiekt ma być symulowany z bezwzględnym współczynnikiem załamania światła n₁, ale jest umieszczony wewnątrz innego szkła o współczynniku załamania światła n₀, to należy tutaj ustawić współczynnik załamania światła na n₁/n₀. W bardziej skomplikowanych przypadkach, gdy kilka obiektów szklanych nakłada się na siebie, efektywny współczynnik odbicia tego obszaru jest równy iloczynowi współczynników odbicia poszczególnych szkieł." - }, - "cauchyCoeff": "Współczynnik Cauchy'ego" - }, - "BaseGrinGlass": { - "refIndexFnOrigin": "Początek układu n(x,y)", - "stepSize": "Rozmiar kroku rozwiązywania numerycznego", - "stepSizeInfo": "Wielkość kroku metody Eulera do rozwiązywania równania eikonału promienia - więcej informacji można znaleźć w funkcji 'step' i dokumentacji w pliku 'BaseGrinGlass.js'.", - "intersectTol": "Tolerancja intersekcji", - "symbolicBodyMerging": "Symboliczne łączenie ciał", - "symbolicBodyMergingInfo": { - "all": "Ten przełącznik dotyczy wszystkich obiektów GRIN w symulacji.", - "impl": "Ten symulator ma obecnie dwie implementacje propagacji światła między różnymi ośrodkami dla obiektów GRIN - numeryczną i symboliczną (patrz funkcje 'multRefIndex' i 'devRefIndex' w 'BaseGrinGlass.js').", - "implNote": "Implementacja numeryczna jest szybsza, ale nie zawsze działa poprawnie (w zależności od konkretnego przypadku) w scenariuszach, gdy jest używana z więcej niż jednym obiektem GRIN, takim, że przynajmniej jeden z nich ma funkcję współczynnika załamania światła, która nie jest zdefiniowana w całej płaszczyźnie, podczas gdy implementacja symboliczna jest wolniejsza, ale odporna na takie problemy." - } - }, - "CircleGrinGlass": { - "epsInfo": { - "units": "Jednostki - [długość]^2.", - "functions": "Ta tolerancja numeryczna jest używana w funkcjach 'isOutsideGlass', 'isInsideGlass' i 'isOnBoundary' w pliku 'CircleGrinGlass.js'." - } - }, - "GrinGlass": { - "epsInfo": { - "units": "Jednostki - [długość].", - "functions": "Ta tolerancja numeryczna jest używana w funkcjach 'isOnBoundary' i 'countIntersections' w pliku 'GrinGlass.js'." - } - }, - "Aperature": { - "diameter": "Średnica" - }, - "Detector": { - "irradMap": "Mapa irradiancji", - "binSize": "Rozmiar pojemnika", - "exportData": "Eksportuj dane" - }, - "TextLabel": { - "fontSize": "Rozmiar czcionki", - "font": "Czcionka", - "fontStyle": "Styl", - "alignment": "Wyrównanie", - "smallCaps": "Małe litery", - "angle": "Kąt" - }, - "LineArrow": { - "arrow": "Strzałka do przodu", - "backArrow": "Strzałka do tyłu" - }, - "Drawing": { - "finishDrawing": "Zakończ rysowanie" - }, - "CropBox": { - "svgWarning": "Eksportuj do SVG. Mieszanki kolorów i względne współczynniki załamania światła poniżej 1 nie są obsługiwane." + "saveButton": "Zapisz", + "cancelButton": "Anuluj", + "closeButton": "Zamknij" + }, + "file": { + "title": "Plik", + "undo": { + "title": "Cofnij" + }, + "redo": { + "title": "Ponów" + }, + "reset": { + "title": "Resetuj" + }, + "save": { + "title": "Zapisz" + }, + "open": { + "title": "Otwórz", + "description": "Otwórz istniejący plik lub obraz tła. Obraz tła zostanie wyświetlony z punktu początkowego współrzędnych. (Lub upuść plik)" + }, + "viewGallery": { + "title": "Zobacz Galerię", + "description": "Przejdź do strony Galerii, aby załadować przykład." + } + }, + "settings": { + "title": "Ustawienia", + "more": "Więcej", + "rayDensity": { + "title": "Gęstość promieni", + "description": "Określa liczbę promieni emitowanych przez belki i źródła punktowe. Ma to również wpływ na dokładność wykrywania obrazu i renderowania kolorów." + }, + "layoutAids": { + "title": "Opcje układu", + "showGrid": "Siatka", + "snapToGrid": "Przyciągaj do siatki", + "lockObjs": "Zablokuj obiekty" + }, + "zoom": { + "title": "Zoom" + }, + "language": { + "title": "Język" + }, + "showHelpPopups": { + "title": "Pokaż okienka pomocy", + "description": "Określa, czy wyświetlać wyskakujące okienka pomocy po najechaniu kursorem na przyciski. (Załaduj ponownie stronę, aby zastosować.)" + }, + "advancedHelp": "Aby uzyskać zaawansowaną pomoc, zobacz ikonę pomocy w prawym dolnym rogu." + }, + "objBar": { + "showAdvanced": { + "title": "Więcej opcji..." + }, + "applyToAll": { + "title": "Zastosuj do wszystkich" + }, + "duplicate": { + "title": "Powiel" + }, + "delete": { + "title": "Usuń" + }, + "unselect": { + "title": "Odznacz", + "description": "Usuń zaznaczenie tego obiektu (kliknięcie prawym przyciskiem myszy pustego miejsca ma tę samą funkcję)." + } + }, + "sceneObjs": { + "common": { + "brightness": "Jasność", + "brightnessInfo": { + "rayDensity": "Efektywne tylko wtedy, gdy 'Gęstość promieni' jest wystarczająco wysoka.", + "rayDensitySlider": "Aby kontrolować liczbę emitowanych promieni, dostosuj ogólny suwak 'Gęstość promieni'." + }, + "wavelength": "Długość fali", + "emisAngle": "Kąt emisji", + "random": "Losowo", + "lambert": "Lambertowskie", + "focalLength": "Ogniskowa" + }, + "Beam": { + "imageDetectionWarning": "Wykrywanie obrazu może nie działać w przypadku wiązek rozbieżnych/losowych." + }, + "AngleSource": { + "symmetric": "Symetryczna" + }, + "BaseFilter": { + "filter": "Filtr", + "bandwidth": "Szerokość pasma", + "invert": "Odwróć" + }, + "IdealMirror": { + "cartesianSign": "Konwencja znaków" + }, + "BeamSplitter": { + "transRatio": "Współczynnik transmisji" + }, + "BaseGlass": { + "refIndex": "Współczynnik załamania", + "refIndexInfo": { + "relative": "względny, jeśli znajduje się w innym szkle", + "effective": "Jeśli ten obiekt ma być symulowany z bezwzględnym współczynnikiem załamania światła n₁, ale jest umieszczony wewnątrz innego szkła o współczynniku załamania światła n₀, to należy tutaj ustawić współczynnik załamania światła na n₁/n₀. W bardziej skomplikowanych przypadkach, gdy kilka obiektów szklanych nakłada się na siebie, efektywny współczynnik odbicia tego obszaru jest równy iloczynowi współczynników odbicia poszczególnych szkieł." + }, + "cauchyCoeff": "Współczynnik Cauchy'ego" + }, + "BaseGrinGlass": { + "refIndexFnOrigin": "Początek układu n(x,y)", + "stepSize": "Rozmiar kroku rozwiązywania numerycznego", + "stepSizeInfo": "Wielkość kroku metody Eulera do rozwiązywania równania eikonału promienia - więcej informacji można znaleźć w funkcji 'step' i dokumentacji w pliku 'BaseGrinGlass.js'.", + "intersectTol": "Tolerancja intersekcji", + "symbolicBodyMerging": "Symboliczne łączenie ciał", + "symbolicBodyMergingInfo": { + "all": "Ten przełącznik dotyczy wszystkich obiektów GRIN w symulacji.", + "impl": "Ten symulator ma obecnie dwie implementacje propagacji światła między różnymi ośrodkami dla obiektów GRIN - numeryczną i symboliczną (patrz funkcje 'multRefIndex' i 'devRefIndex' w 'BaseGrinGlass.js').", + "implNote": "Implementacja numeryczna jest szybsza, ale nie zawsze działa poprawnie (w zależności od konkretnego przypadku) w scenariuszach, gdy jest używana z więcej niż jednym obiektem GRIN, takim, że przynajmniej jeden z nich ma funkcję współczynnika załamania światła, która nie jest zdefiniowana w całej płaszczyźnie, podczas gdy implementacja symboliczna jest wolniejsza, ale odporna na takie problemy." + } + }, + "CircleGrinGlass": { + "epsInfo": { + "units": "Jednostki - [długość]^2.", + "functions": "Ta tolerancja numeryczna jest używana w funkcjach 'isOutsideGlass', 'isInsideGlass' i 'isOnBoundary' w pliku 'CircleGrinGlass.js'." + } + }, + "GrinGlass": { + "epsInfo": { + "units": "Jednostki - [długość].", + "functions": "Ta tolerancja numeryczna jest używana w funkcjach 'isOnBoundary' i 'countIntersections' w pliku 'GrinGlass.js'." + } + }, + "Aperature": { + "diameter": "Średnica" + }, + "Detector": { + "irradMap": "Mapa irradiancji", + "binSize": "Rozmiar pojemnika", + "exportData": "Eksportuj dane" + }, + "TextLabel": { + "fontSize": "Rozmiar czcionki", + "font": "Czcionka", + "fontStyle": "Styl", + "alignment": "Wyrównanie", + "smallCaps": "Małe litery", + "angle": "Kąt" + }, + "LineArrow": { + "arrow": "Strzałka do przodu", + "backArrow": "Strzałka do tyłu" + }, + "Drawing": { + "finishDrawing": "Zakończ rysowanie" + }, + "CropBox": { + "svgWarning": "Eksportuj do SVG. Mieszanki kolorów i względne współczynniki załamania światła poniżej 1 nie są obsługiwane." + } + }, + "saveModal": { + "title": "Zapisz", + "fileName": "Nazwa" + }, + "languageModal": { + "title": "Język", + "translatedFraction": "przetłumaczone", + "helpTranslate": "Pomóż nam przetłumaczyć tę aplikację" + }, + "generalWarnings": { + "shareLinkTooLong": "Adres URL jest zbyt długi i może nie działać na niektórych platformach. Może być konieczne użycie \"Zapisz\" i zamiast tego udostępnienie pliku." + }, + "footer": { + "processing": "Przetwarzanie... Kliknij tutaj, aby zatrzymać." } - }, - "saveModal": { - "title": "Zapisz", - "fileName": "Nazwa" - }, - "languageModal": { - "title": "Język", - "translatedFraction": "przetłumaczone", - "helpTranslate": "Pomóż nam przetłumaczyć tę aplikację" - }, - "generalWarnings": { - "shareLinkTooLong": "Adres URL jest zbyt długi i może nie działać na niektórych platformach. Może być konieczne użycie \"Zapisz\" i zamiast tego udostępnienie pliku." - }, - "footer": { - "processing": "Przetwarzanie... Kliknij tutaj, aby zatrzymać." - } -} \ No newline at end of file +} diff --git a/locales/pt-BR/gallery.json b/locales/pt-BR/gallery.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/locales/pt-BR/gallery.json @@ -0,0 +1 @@ +{} diff --git a/locales/pt-BR/main.json b/locales/pt-BR/main.json index 99a86e63..fa7b7969 100644 --- a/locales/pt-BR/main.json +++ b/locales/pt-BR/main.json @@ -1,212 +1,233 @@ { - "meta": { - "languageName": "Português (Brasil)", - "parentheses": "{{main}} ({{sub}})", - "colon": "{{name}}: {{value}}", - "list": "{{first}}, {{others}}" - }, - "project": { - "name": "Simulação de Óptica de Raios", - "shortName": "Óptica de Raios", - "description": "Uma aplicação web grátis e de código aberto para criação e simulação de cenas de óptica geométrica 2D." - }, - "pages": { - "simulator": "Simulador", - "home": "Início", - "gallery": "Galeria", - "about": "Sobre", - "github": "GitHub" - }, - "homePage": { - "description": "Crie e simule cenas ópticas geométricas 2D interativamente.\nTotalmente gratuito e baseado na web. Código-fonte está [disponível no GitHub](/github).", - "launchSimulator": "Abrir Simulador" - }, - "tools": { - "title": "Ferramentas", - "categories": { - "lightSource": "Fonte de luz", - "mirror": "Espelho", - "glass": "Vidro", - "blocker": "Bloqueador", - "other": "Outros" - }, - "common": { - "clickInstruction": "Clique para criar.", - "lineInstruction": "Arraste ou clique para criar.", - "circleInstruction": "Arraste ou clique para criar." - }, - "SingleRay": { - "title": "Raio único", - "description": "Um único raio de luz definido por dois pontos.", - "instruction": "Arraste ou clique para criar. O primeiro ponto é a fonte, disparando rumo ao segundo ponto." - }, - "Beam": { - "title": "Feixe paralelo", - "description": "Um feixe paralelo ou divergente de luz emerge de um segmento de linha, com densidade controlada pelo controle deslizante 'Densidade de raios'." - }, - "PointSource": { - "title": "Fonte pontual", - "description": "Raios emergem de um ponto único, com quantidade controlada pelo controle deslizante 'Densidade de raios'." - }, - "AngleSource": { - "instruction": "Arraste ou clique para criar. O primeiro ponto é a fonte, disparando rumo ao segundo ponto.", - "description": "Fonte pontual com um ângulo de emissão definido." - }, - "Mirror": { - "title": "Segmento", - "description": "Simule a reflexão da luz em um espelho." - }, - "otherMirror": { - "title": "Equação Personalizada", - "description": "Um espelho cujo formato é definido por uma equação personalizada y = f(x), onde (x,y) está nas coordenadas transformadas em que os dois pontos de controle são (-1,0) and (1,0)." - }, - "ArcMirror": { - "title": "Arco Circular", - "description": "Um espelho cujo formato é parte de um círculo, que é definido por três pontos.", - "instruction": "Arraste ou clique para criar. Os primeiros dois pontos definem o vão entre as bordas do arco, e o último ponto define o tamanho do arco." - }, - "ParabolicMirror": { - "title": "Parabólico", - "description": "Um espelho cujo formato é uma parábola, que é definida por três pontos.", - "instruction": "Arraste ou clique para criar." - }, - "CustomMirror": { - "title": "Equação Personalizada", - "description": "Um espelho cujo formato é definido por uma equação personalizada y = f(x), onde (x,y) está nas coordenadas transformadas em que os dois pontos de controle são (-1,0) and (1,0)." - }, - "IdealMirror": { - "title": "Curvo Ideal", - "description": "O espelho 'curvo' idealizado que obedece exatamente a equação (1/p + 1/q = 1/f). O comprimento focal pode ser definido diretamente." - }, - "BeamSplitter": { - "title": "Divisor de Feixe", - "description": "Um espelho que transmite uma porcentagem da luz que chega" - }, - "PlaneGlass": { - "title": "Semi-plano", - "description": "Simule a refração e a reflexão da luz em uma superfície.", - "instruction": "Arraste ou clique para criar." - }, - "otherGlass": { - "title": "Equação Personalizada", - "description": "Vidro com o formato definido por uma inequalidade personalizada f(x) < y < g(x), onde (x,y) está nas coordenadas transformadas em que os pontos de controle são (-1,0) e (1,0)." - }, - "CircleGlass": { - "title": "Círculo", - "description": "Vidro com um formato circular, definido por seu centro e um ponto na superfície." - }, - "Glass": { - "title": "Forma livre", - "description": "Vidro com qualquer formato construído com segmentos de linha e arcos circulares.", - "instruction": "Clique para criar um segmento, arraste para criar um arco, e clique no ponto de início quando acabar de desenhar." - }, - "CustomGlass": { - "title": "Equação Personalizada", - "description": "Vidro com o formato definido por uma inequalidade personalizada f(x) < y < g(x), onde (x,y) está nas coordenadas transformadas em que os pontos de controle são (-1,0) e (1,0)." - }, - "IdealLens": { - "title": "Lente Ideal", - "description": "Uma lente ideal que obedece exatamente à equação de lente fina (1/p + 1/q = 1/f). O comprimento focal pode ser definido diretamente." - }, - "SphericalLens": { - "title": "Lente Esférica", - "description": "Uma lente esférica." - }, - "CircleGrinGlass": { - "title": "Círculo", - "description": "Vidro com uma função personalizada de índice refrativo n(x,y) e um formato circular." - }, - "GrinGlass": { - "title": "Forma livre", - "description": "Vidro com uma função personalizada de índice refrativo n(x,y) e um formato poligonal.", - "instruction": "Clique para criar um segmento, arraste para criar um arco, e clique no ponto de início quando acabar de desenhar.", - "warning": "AVISO: Somente polígonos simples são suportados, senão o comportamento pode ser imprevisível." - }, - "otherGrinGlass": { - "title": "Polígono com gradiente de índice" - }, - "Blocker": { - "title": "Bloqueador Reto", - "description": "Um segmento de linha bloqueador de luz que absorve os raios incidentes." - }, - "CircleBlocker": { - "title": "Bloqueador Circular", - "description": "Um bloqueador circular de luz que absorve os raios incidentes." - }, - "Aperture": { - "title": "Abertura", - "description": "Um par de bloqueadores de luz que absorvem os raios incidentes. O tamanho do furo pode ser ajustado simetricamente.", - "instruction": "Arraste ou clique nas duas pontas para criar." - }, - "DiffractionGrating": { - "title": "Grade de Difração", - "description": "Uma grade de difração que divide luz em um ângulo dependente do comprimento de onda" - }, - "Ruler": { - "title": "Régua", - "description": "Uma régua a partir de um ponto zero até um outro ponto." - }, - "Protractor": { - "title": "Transferidor", - "description": "Um transferidor definido a partir do centro e outro ponto para a direção do zero. A escala está em graus" - }, - "Detector": { - "title": "Detector", - "description": "Uma ferramenta para medir a taxa de fluxo de energia (P), a taxa de fluxo de momento perpendicular (F⊥), e a taxa de fluxo de momento paralelo (F∥) através de um segmento de linha. As unidades são arbitrárias." - }, - "TextLabel": { - "title": "Texto", - "description": "Um rótulo de texto." - }, - "LineArrow": { - "title": "Linha / Seta", - "description": "Uma seta ou segmento de linha." - }, - "Drawing": { - "title": "Desenhar", - "description": "Uma ferramenta de desenho à mão livre.", - "instruction": "Arraste para desenhar" - }, - "moveView": { - "title": "Mover Vista", - "description": "Arraste para mover a vista. (Arrastar com o botão direito do mouse tem a mesma função.)" - }, - "modules": { - "import": "Importar Módulos...", - "remove": "Remover módulo" - } - }, - "view": { - "title": "Ver", - "rays": { - "title": "Raios", - "description": "Exibir os raios. Quando a 'Densidade de Raios' está alta, eles parecem ser contínuos." - }, - "extended": { - "title": "Raios extendidos", - "description": "Exibir tanto os raios quanto suas extensões. Laranja indica extensões para trás, e cinza indica para frente.", - "simulateColorsNote": "Quando 'Simular Cores' está ligado, eles são exibidos na cor fonte e distinguidos por traços." - }, - "images": { - "title": "Todas Imagens", - "description": "Mostra a posição de todas imagens. Pontos amarelos indicam imagens reais, laranja indica imagens virtuais, e cinza (nenhuma nesta imagem) indica objetos virtuais. Note que algumas imagens não podem ser detectadas se 'Densidade de Raios' não estiver alta o suficiente.", - "simulateColorsNote": "Quando 'Simular Cores' está ligado, eles são exibidos nas cores fonte e distinguidos por tamanhos de ponto." - }, - "observer": { - "title": "Visto por Observador", - "description": "Simule os raios e imagens vistos de uma posição. O círculo azul é o observador. Quaisquer raios atravessando ele são considerados 'Observados'. O observador não sabe onde os raios realmente começam, mas pode pensar que eles começam em algum ponto se eles intersecionam lá. Os raios são exibidos em azul, e os pontos em amarelo (real) ou laranja (virtual).", - "simulateColorsNote": "Quando 'Simular Cores' está ligado, eles são exibidos nas cores fonte.", - "instruction": "Arraste o ponto grande azul para mover o observador." + "meta": { + "languageName": "Português (Brasil)", + "parentheses": "{{main}} ({{sub}})", + "colon": "{{name}}: {{value}}", + "list": "{{first}}, {{others}}" + }, + "project": { + "name": "Simulação de Óptica de Raios", + "shortName": "Óptica de Raios", + "description": "Uma aplicação web grátis e de código aberto para criação e simulação de cenas de óptica geométrica 2D." + }, + "pages": { + "simulator": "Simulador", + "home": "Início", + "gallery": "Galeria", + "about": "Sobre", + "github": "GitHub", + "modules": "Módulos" + }, + "homePage": { + "description": "Crie e simule cenas ópticas geométricas 2D interativamente.\nTotalmente gratuito e baseado na web. Código-fonte está [disponível no GitHub](/github).", + "launchSimulator": "Abrir Simulador" + }, + "tools": { + "title": "Ferramentas", + "categories": { + "lightSource": "Fonte de luz", + "mirror": "Espelho", + "glass": "Vidro", + "blocker": "Bloqueador", + "other": "Outros" + }, + "common": { + "clickInstruction": "Clique para criar.", + "lineInstruction": "Arraste ou clique para criar.", + "circleInstruction": "Arraste ou clique para criar. Primeiro o centro, então a circunferência." + }, + "SingleRay": { + "title": "Raio único", + "description": "Um único raio de luz definido por dois pontos.", + "instruction": "Arraste ou clique para criar. O primeiro ponto é a fonte, disparando rumo ao segundo ponto." + }, + "Beam": { + "title": "Feixe paralelo", + "description": "Um feixe paralelo ou divergente de luz emerge de um segmento de linha, com densidade controlada pelo controle deslizante 'Densidade de raios'." + }, + "PointSource": { + "title": "Fonte pontual", + "description": "Raios emergem de um ponto único, com quantidade controlada pelo controle deslizante 'Densidade de raios'." + }, + "AngleSource": { + "instruction": "Arraste ou clique para criar. O primeiro ponto é a fonte, disparando rumo ao segundo ponto.", + "description": "Fonte pontual com um ângulo de emissão definido." + }, + "Mirror": { + "title": "Segmento", + "description": "Simule a reflexão da luz em um espelho." + }, + "otherMirror": { + "title": "Equação Personalizada", + "description": "Um espelho cujo formato é definido por uma equação personalizada y = f(x), onde (x,y) está nas coordenadas transformadas em que os dois pontos de controle são (-1,0) and (1,0)." + }, + "ArcMirror": { + "title": "Arco Circular", + "description": "Um espelho cujo formato é parte de um círculo, que é definido por três pontos.", + "instruction": "Arraste ou clique para criar. Os primeiros dois pontos definem o vão entre as bordas do arco, e o último ponto define o tamanho do arco." + }, + "ParabolicMirror": { + "title": "Parabólico", + "description": "Um espelho cujo formato é uma parábola, que é definida por três pontos.", + "instruction": "Arraste ou clique nas duas pontas para criar, então clique no vértice." + }, + "CustomMirror": { + "title": "Equação Personalizada", + "description": "Um espelho cujo formato é definido por uma equação personalizada y = f(x), onde (x,y) está nas coordenadas transformadas em que os dois pontos de controle são (-1,0) and (1,0)." + }, + "IdealMirror": { + "title": "Curvo Ideal", + "description": "O espelho 'curvo' idealizado que obedece exatamente a equação (1/p + 1/q = 1/f). O comprimento focal pode ser definido diretamente." + }, + "BeamSplitter": { + "title": "Divisor de Feixe", + "description": "Um espelho que transmite uma porcentagem da luz que chega." + }, + "PlaneGlass": { + "title": "Semi-plano", + "description": "Simule a refração e a reflexão da luz em uma superfície.", + "instruction": "Arraste ou clique em dois pontos na superfície para criar." + }, + "otherGlass": { + "title": "Equação Personalizada", + "description": "Vidro com o formato definido por uma inequalidade personalizada f(x) < y < g(x), onde (x,y) está nas coordenadas transformadas em que os pontos de controle são (-1,0) e (1,0)." + }, + "CircleGlass": { + "title": "Círculo", + "description": "Vidro com um formato circular, definido por seu centro e um ponto na superfície." + }, + "Glass": { + "title": "Forma livre", + "description": "Vidro com qualquer formato construído com segmentos de linha e arcos circulares.", + "instruction": "Clique para criar um segmento, arraste para criar um arco, e clique no ponto de início quando acabar de desenhar." + }, + "CustomGlass": { + "title": "Equação Personalizada", + "description": "Vidro com o formato definido por uma inequalidade personalizada f(x) < y < g(x), onde (x,y) está nas coordenadas transformadas em que os pontos de controle são (-1,0) e (1,0)." + }, + "IdealLens": { + "title": "Lente Ideal", + "description": "Uma lente ideal que obedece exatamente à equação de lente fina (1/p + 1/q = 1/f). O comprimento focal pode ser definido diretamente." + }, + "SphericalLens": { + "title": "Lente Esférica", + "description": "Uma lente esférica." + }, + "CircleGrinGlass": { + "title": "Círculo com gradiente de índice", + "description": "Vidro com uma função personalizada de índice refrativo n(x,y) e um formato circular." + }, + "GrinGlass": { + "title": "Forma livre", + "description": "Vidro com uma função personalizada de índice refrativo n(x,y) e um formato poligonal.", + "instruction": "Clique para criar um segmento, arraste para criar um arco, e clique no ponto de início quando acabar de desenhar.", + "warning": "AVISO: Somente polígonos simples são suportados, senão o comportamento pode ser imprevisível." + }, + "otherGrinGlass": { + "title": "Polígono com gradiente de índice", + "description": "Material com uma função de índice refrativo personalizada n(x,y)." + }, + "Blocker": { + "title": "Bloqueador Reto", + "description": "Um segmento de linha bloqueador de luz que absorve os raios incidentes." + }, + "CircleBlocker": { + "title": "Bloqueador Circular", + "description": "Um bloqueador circular de luz que absorve os raios incidentes." + }, + "Aperture": { + "title": "Abertura", + "description": "Um par de bloqueadores de luz que absorvem os raios incidentes. O tamanho do furo pode ser ajustado simetricamente.", + "instruction": "Arraste ou clique nas duas pontas para criar." + }, + "DiffractionGrating": { + "title": "Grade de Difração", + "description": "Uma grade de difração que divide luz em um ângulo dependente do comprimento de onda.", + "warning": "Aviso: As intensidades de raios difratados podem não ser precisas." + }, + "Ruler": { + "title": "Régua", + "description": "Uma régua a partir de um ponto zero até um outro ponto." + }, + "Protractor": { + "title": "Transferidor", + "description": "Um transferidor definido a partir do centro e outro ponto para a direção do zero. A escala está em graus." + }, + "Detector": { + "title": "Detector", + "description": "Uma ferramenta para medir a taxa de fluxo de energia (P), a taxa de fluxo de momento perpendicular (F⊥), e a taxa de fluxo de momento paralelo (F∥) através de um segmento de linha. As unidades são arbitrárias." + }, + "TextLabel": { + "title": "Texto", + "description": "Um rótulo de texto." + }, + "LineArrow": { + "title": "Linha / Seta", + "description": "Uma seta ou segmento de linha." + }, + "Drawing": { + "title": "Desenhar", + "description": "Uma ferramenta de desenho à mão livre.", + "instruction": "Arraste para desenhar." + }, + "moveView": { + "title": "Mover Vista", + "description": "Arraste para mover a vista. (Arrastar com o botão direito do mouse tem a mesma função.)" + }, + "modules": { + "import": "Importar Módulos...", + "remove": "Remover módulo" + } + }, + "view": { + "title": "Ver", + "rays": { + "title": "Raios", + "description": "Exibir os raios. Quando a 'Densidade de Raios' está alta, eles parecem ser contínuos." + }, + "extended": { + "title": "Raios extendidos", + "description": "Exibir tanto os raios quanto suas extensões. Laranja indica extensões para trás, e cinza indica para frente.", + "simulateColorsNote": "Quando 'Simular Cores' está ligado, eles são exibidos na cor fonte e distinguidos por traços." + }, + "images": { + "title": "Todas Imagens", + "description": "Mostra a posição de todas imagens. Pontos amarelos indicam imagens reais, laranja indica imagens virtuais, e cinza (nenhuma nesta imagem) indica objetos virtuais. Note que algumas imagens não podem ser detectadas se 'Densidade de Raios' não estiver alta o suficiente.", + "simulateColorsNote": "Quando 'Simular Cores' está ligado, eles são exibidos nas cores fonte e distinguidos por tamanhos de ponto." + }, + "observer": { + "title": "Visto por Observador", + "description": "Simule os raios e imagens vistos de uma posição. O círculo azul é o observador. Quaisquer raios atravessando ele são considerados 'Observados'. O observador não sabe onde os raios realmente começam, mas pode pensar que eles começam em algum ponto se eles intersecionam lá. Os raios são exibidos em azul, e os pontos em amarelo (real) ou laranja (virtual).", + "simulateColorsNote": "Quando 'Simular Cores' está ligado, eles são exibidos nas cores fonte.", + "instruction": "Arraste o ponto grande azul para mover o observador." + } + }, + "simulateColors": { + "title": "Simular Cores", + "description": "Simular cores (comprimentos de onda) de fontes luminosas, mistura de cores, filtragem de cores por bloqueadores e espelhos, e dispersão cromática de vidros.", + "instruction": "Você pode definir esses parâmetros para esses objetos quando selecionados. Para simular espectros de cor, sobreponha raios com comprimentos de onda diferentes.", + "warning": "As cores exibidas na tela são apenas aproximações, e podem ser muito imprecisas quando 'Densidade de Raios' está muito alta ou muito baixa." + }, + "languageDropdown": { + "title": "Linguagem: {{language}}", + "translatedFraction": "{{fraction}} traduzido" + }, + "aboutPage": { + "cite": "Citar este projeto", + "mainAuthors_one": "Autor Principal", + "mainAuthors_many": "Autores Principais", + "mainAuthors_other": "Autores Principais", + "contributors": "Contribuidores", + "contributorSorting": "Contribuidores do GitHub primeiro; outros ordenados cronologicamente.", + "contributionCategories": { + "code": "código", + "uiDesign": "UI design", + "gallery": "galeria", + "module": "módulo", + "translations_one": "tradução {{languages}}", + "translations_many": "traduções {{languages}}", + "translations_other": "traduções {{languages}}" + }, + "description": "Este projeto, incluindo o conteúdo da galeria, é licensiado sob a [Licença Apache 2.0](/license), e é oficialmente hospedado no site [PhyDemo(phydemo.app)](/phydemo) (anteriormente em ricktu288.github.io). O código fonte está [disponível no GitHub](/github), e [contribuições são bem-vindas](/contributing). Se houver questões ou sugestões, você pode abrir [issues](/github/issues) ou [discussões](/github/discussões) no GitHub, ou enviar um email para [ray-optics@phydemo.app](/email) se você não utilizar o GitHub." } - }, - "simulateColors": { - "title": "Simular Cores", - "description": "Simular cores (comprimentos de onda) de fontes luminosas, mistura de cores, filtragem de cores por bloqueadores e espelhos, e dispersão cromática de vidros.", - "instruction": "Você pode definir esses parâmetros para esses objetos quando selecionados. Para simular espectros de cor, sobreponha raios com comprimentos de onda diferentes.", - "warning": "As cores exibidas na tela são apenas aproximações, e podem ser muito imprecisas quando 'Densidade de Raios' está muito alta ou muito baixa." - }, - "languageDropdown": { - "title": "Linguagem: {{language}}", - "translatedFraction": "{{fraction}} traduzido" - } -} \ No newline at end of file +} diff --git a/locales/pt-BR/modules.json b/locales/pt-BR/modules.json new file mode 100644 index 00000000..722e957d --- /dev/null +++ b/locales/pt-BR/modules.json @@ -0,0 +1,108 @@ +{ + "modulesPage": { + "description": { + "makeNewTools": "O recurso \"Módulo\" permite que se faça novas ferramentas ao combinar, especializar, ou reparametrizar objetos criados por ferramentas existentes neste simulador.", + "embeddedInScene": "Módulos importados são embutidos nos dados da cena, então não serão automaticamente atualizados quando os autores dos módulos os atualizarem.", + "appearAsTools": "Módulos importados aparecerão como ferramentas na categoria \"Outros\". Por favor selecione e clique no espaço em branco de acordo com a ordem da sequência de pontos de controle (ver \"Especificação\")." + }, + "import": "Importar", + "imported": "Importado", + "specification": { + "title": "Especificação", + "controlPointSequence": "Sequência de pontos de controle", + "parameters": "Parâmetros" + }, + "customization": { + "title": "Personalização", + "description": "Módulos podem ser feitos ou personalizados diretamente dentro do app web utilizando o editor JSON incluso. Ver [o tutorial](/modules/tutorial). Personalização de módulos importados vai afetar apenas a cena atual." + }, + "contribution": { + "title": "Contribuição", + "description": "Contribuições à lista acima são bem-vindas. Para contribuir o seu módulo, veja [Contribuindo módulos](/contributing/modules)." + } + }, + "moduleData": { + "FresnelLens": { + "title": "Lente Fresnel", + "point1": "O primeiro ponto delimitador da lente", + "Nslice": "O número de fatias", + "refIndex": "O índice refrativo da lente", + "description": "Uma lente Fresnel feita a partir de um semicírculo de vidro. Versão modularizada [deste exemplo da Galeria](/gallery/fresnel-lens).", + "point2": "O segundo ponto delimitador da lente" + }, + "ContSpectrum": { + "point2": "Determina a direção dos raios", + "min": "O comprimento de onda mínimo", + "step": "O passo do comprimento de onda", + "brightness": "O brilho total", + "point1": "A origem dos raios", + "title": "Fonte de luz de espectro contínuo", + "description": "Uma fonte de luz com um espectro contínuo uniforme discretizada com determinado passo constante. Funciona somente quando \"Simular Cores\" está ligado.", + "max": "O comprimento de onda máximo" + }, + "CircleSource": { + "title": "Fonte de luz circular", + "r": "O raio do círculo", + "brightness": "O brilho total", + "point1": "O centro do círculo", + "description": "Um círculo com fontes pontuais de 180 graus uniformes colocadas ao redor de sua circunferência.", + "N": "O número de fontes pontuais" + }, + "Chaff": { + "title": "Chaff", + "point2": "O canto inferior direito do chaff", + "N": "O número de espelhos no chaff", + "point1": "O canto superior esquerdo do chaff", + "L": "O comprimento dos espelhos", + "description": "Chaff em um formato retangular consistindo de pedaços aleatórios de espelhos. Versão modularizada [deste exemplo da Galeria](/gallery/chaff-countermeasure)." + }, + "BeamExpander": { + "title": "Expansor de Raio", + "description": "A combinação de duas lentes ideais com a soma de seus comprimentos focais igual a sua distância de saparação. Elas expandem ou reduzem o diâmetro de um raio de luz colimada. Versão modularizada [deste exemplo da Galeria](/gallery/beam-expanders).", + "point1": "O centro da primeira lente", + "point2": "O segundo ponto da segunda lente", + "point3": "Determina o ponto focal comum das lentes" + }, + "RayRelay": { + "title": "Repassador de Raios", + "description": "Uma série de lentes idênticas com comprimento focal \\(f\\) e distância \\(d\\) entre as lentes. Uma trajetória de raios não divergente é garantida se e somente se \\(d\\leq 4f\\). Versão modularizada [deste exemplo da Galeria](/gallery/ray-relaying).", + "point1": "O primeiro ponto delimitador da primeira lente", + "f": "O comprimento focal das lentes", + "d": "A distância entre as lentes", + "N": "O número de lentes", + "point2": "O segundo ponto delimitador da primeira lente (deve ter o mesmo \\(x\\) que o primeiro ponto)" + }, + "OpticalFiber": { + "title": "Fibra Óptica", + "description": "Fibra óptica em formato de linha com determinadas espessuras de centro e revestimento e índices refrativos.", + "point1": "O primeiro ponto delimitador da fibra óptica", + "point2": "O segundo ponto delimitador da fibra óptica (deve ter o mesmo \\(y\\) que o primeiro ponto)", + "X": "A espessura do centro", + "Y": "A espessura do revestimento", + "n1": "O índice refrativo do centro", + "n2": "O índice refrativo do revestimento" + } + }, + "moduleTutorial": { + "title": "Tutorial para fazer Módulos da Óptica de Raios", + "jsonEditor": { + "title": "O editor JSON incluso", + "inIframesBelow": "IMPORTANTE: Nessa página de tutorial, se você não ver o editor de código JSON nos iframes abaixo, por favor habilite-o e recarregue esta página, pois vocÊ precisará de ver o código para entender como funciona.", + "currentlyNoVisual": "Este app atualmente não possui uma interface visual para criação de módulos, então é preciso diretamente editar o JSON da cena.", + "enableJsonEditor": "Você pode habilitar o editor JSON incluso ao clicar no menu \"configurações\" no canto superior direito do app, e então marcar \"Exibir editor JSON\". O editor de código deve aparecer no lado esquerdo do app, com o código JSON da cena atual. Certifique-se que a sua tela é grande o suficiente, já que este recurso não funciona bem em dispositivos móveis.", + "updateAccordingly": "Conforme você edita a cena utilizando o editor visual de cena, o código no editor JSON vai atualizar automaticamente, com a parte modificada destacada. Do mesmo modo, editar o código no editor JSON diretamente vai atualizar a cena automaticamente. Se você não for familiar com JSON ou qualquer tipo de formato de dados à base de texto, pode ser útil brincar com isso por um tempo.", + "objsArray": "Em particular, quando se adiciona um objeto à cena, ele é adicionado à lista `objs`. E se você modificar algumas de suas propriedades para um valor não padrão, elas aparecem como pares chave-valor nesse objeto." + }, + "basics": { + "title": "O básico de um módulo", + "lookAtExample": "Vamos ver o nosso primeiro exemplo de módulo.", + "lookAtJson": "Você deve ver quatro linhas de texto. Olhando no editor JSON, você verá que as primeira duas estão diretamente na lista `objs` de nível superior como normal, mas as últimas duas estão em `modules.ExampleModule.objs` ao invés disso.", + "moduleDef": "O `module` é um dicionário onde a chave é o nome do módulo (neste caso `ExampleModule`), e o valor é a definição do módulo. Em específico, a lista `modules.ExampleModule.objs` descreve (o padrão de) objetos dentro desse módulo, que é diferente do `objs` do nível superior que descreve objetos na cena." + }, + "opening": { + "description": "Este tutorial vai te guiar pelo processi básico de criação de um módulo personalizado, que pode ser completamente feito dentro do app web, sem necessidade de qualquer ambiente de desenvolvimento externo.", + "compareWithHandle": "Note que nem todos pontos de controle personalizados requerem um módulo. Alguns casos simples podem ser feitos com o recurso \"ponto de mauseio\" (ver a seção \"Agrupar, rotacionar e ajustar escala de objetos\" no popup de ajuda no canto inferior direito do simulador). Já que fazer um módulo é muito mais complicado que criar um ponto de manuseio, deve-se primeiro checar se o seu caso oise ser feito pelo recurso \"ponto de manuseio\" antes de considerar fazer um módulo. Veja [aqui](/gallery/black-cat-becomes-white) para um exemplo não trivial de um ponto de controle personalizado (mover dois sacos plásticos pra fora da água) sem utilizar um módulo.", + "moduleIntroduction": "O recurso \"Módulo\" da Simulação de Óptica de Raios permite a criação de combinações modulares de objetos com parâmetros personalizados, pontos de controle personalizados, e malhas de objetos. Esse recurso extende a capacidade deste simulador ao combinar, especializar, ou reparametrizar objetos criados por ferramentas existentes para criar novas ferramentas. Por exemplo, o módulo `CircleSource` (ver Ferramentas -> Outros -> Importar módulo) combina uma série de fontes pontuais criadas pela ferramenta existente \"Fonte pontual (<360°)\" ao redor de um círculo, para fazer uma ferramenta \"fonte circular\" que não existia no simulador. O módulo `FresnelLens` especializa a ferramenta \"Glass->Custom equation\", para que a equação represente uma curva específica da lente Fresnel parametrizada pelo número de fatias, assim fazendo uma ferramenta especializada \"Lente Fresnel\", que tambem não existia anteriormente. Além de fazer novas ferramentas, esse recurso também pode fazer algumas demonstrações de óptica mais interativas. Por exemplo, ao arrastar o terceiro ponto de controle do módulo `BeamExpander`, pode-se ver diretamente como a posição do ponto focal em comum das duas lentes afeta a largura do raio, sem necessitar ajustar os comprimentos focais das duas lentes individualmente." + } + } +} diff --git a/locales/pt-BR/simulator.json b/locales/pt-BR/simulator.json index 98cf67d3..53f13519 100644 --- a/locales/pt-BR/simulator.json +++ b/locales/pt-BR/simulator.json @@ -1,335 +1,335 @@ { - "welcome": { - "title": "Bem-vindo à Simulação de Óptica de Raios", - "instruction": "Para adicionar um componente ótico, selecione uma ferramenta e clique no espaço vazio.\nPara carregar um exemplo, por favor [visite a página da Galeria](/gallery).", - "loading": "Carregando cena a partir de URL... Por favor aguarde." - }, - "common": { - "saveButton": "Salvar", - "cancelButton": "Cancelar", - "defaultOption": "Padrão", - "closeButton": "Fechar" - }, - "file": { - "title": "Arquivo", - "undo": { - "title": "Desfazer" + "welcome": { + "title": "Bem-vindo à Simulação de Óptica de Raios", + "instruction": "Para adicionar um componente ótico, selecione uma ferramenta e clique no espaço vazio.\nPara carregar um exemplo, por favor [visite a página da Galeria](/gallery).", + "loading": "Carregando cena a partir de URL... Por favor aguarde." }, - "redo": { - "title": "Refazer" - }, - "reset": { - "title": "Reiniciar" - }, - "save": { - "title": "Salvar" - }, - "open": { - "title": "Abrir", - "description": "Abrir um arquivo existente ou imagem de fundo. A imagem de fundo será exibida a partir origem das coordenadas. (Ou solte o arquivo)" - }, - "export": { - "title": "Exportar como PNG/SVG" - }, - "copyLink": { - "title": "Copiar Link Compartilhável", - "description": "Copiar e ir para a URL direta da cena atual, que pode ser utilizada para compartilhamento(possivelmente via encurtador de URL). Também veja Configurações -> Sincronização automática de URL." - }, - "viewGallery": { - "title": "Ver Galeria", - "description": "Ir para a página web da Galeria para carregar um exemplo." - } - }, - "settings": { - "title": "Configurações", - "more": "Mais", - "rayDensity": { - "title": "Densidade de Raios", - "description": "Determina o número de raios a serem emitidos por feixes e fontes pontuais. Isso também afeta a precisão da detecção de imagens e da reprodução de cores." - }, - "layoutAids": { - "title": "Auxílio de posicionamento", - "showGrid": "Grade", - "snapToGrid": "Ajustar na grade", - "lockObjs": "Travar Objetos" - }, - "gridSize": { - "title": "Tamanho da Grade" - }, - "observerSize": { - "title": "Tamanho do Observador" - }, - "lengthScale": { - "title": "Escala de Comprimento", - "description": "Se a unidade padrão de comprimento estiver pequena demais ou grande demais para modelar um sistema físico quando interpretado como uma unidade física comum unit (ex.: milímetros), esse fator pode ser usado para alterar a escala da aparência (ex.: larguras de linha) na cena." - }, - "zoom": { - "title": "Zoom" - }, - "language": { - "title": "Linguagem" - }, - "autoSyncUrl": { - "title": "Sincronizar URL automaticamente", - "description": "Quando habilitado, a URL será atualizada automaticamente com a cena atual, então você não precisa de ficar salvando a cena manualmente. Para definir o título, use Arquivo -> Salvar -> Renomear" - }, - "showJsonEditor": { - "title": "Exibir editor JSON", - "description": "Exibir o editor de código para a representação JSON da cena, que é necessária quando criando um módulo personalizado (Ver Ferramentas -> Outros -> Importar Módulos -> Criar módulos personalizados)." - }, - "showStatusBox": { - "title": "Exibir caixa de status", - "description": "Exibir a caixa de status, que inclui as coordenadas do mouse, informação de performance e o brilho truncado (o brilho total dos raios truncados na série infinita de reflexão interna)." - }, - "showHelpPopups": { - "title": "Exibir popups de ajuda", - "description": "Define se vai exibir popups de ajuda quando pairando sobre botões. (Recarregue a página para fazer efeito.)" - }, - "advancedHelp": "Para ajuda avançada, veja o ícone de ajuda no canto inferior direito." - }, - "objBar": { - "showAdvanced": { - "title": "Mais opções..." - }, - "applyToAll": { - "title": "Aplicar em Todos" - }, - "duplicate": { - "title": "Duplicar" - }, - "delete": { - "title": "Apagar" - }, - "unselect": { - "title": "Desselecionar", - "description": "Desselecionar esse objeto (Botão direito do mouse em espaço vazio tem a mesma função.)" - } - }, - "sceneObjs": { "common": { - "lengthUnitInfo": "A unidade de comprimento utilizada nesse simulador (exceto comprimentos de onda) é arbitrária e pode ser interpretada como qualquer unidade física (ex.: milímetros) contanto que seja dentro da simulação. Se aunidade parecer pequena ou grande demais, por favor, ajuste Configurações -> Escala de Comprimento.", - "brightness": "Brilho", - "brightnessInfo": { - "rayDensity": "Somente faz efeito quando 'Densidade de Raios' está alta o suficiente.", - "rayDensitySlider": "Para controlar o número de raios emitidos, por favor ajuste o controle global de 'Densidade de Raios'." - }, - "wavelength": "Comprimento de onda", - "emisAngle": "Ângulo de Emissão", - "random": "Aleatório", - "lambert": "Lambertiano", - "focalLength": "Comprimento focal", - "eqnInfo": { - "constants": "Constantes suportadas", - "operators": "Operadores suportados", - "functions": "Funções suportadas" - }, - "imageDetectionWarning": "Esta ferramenta não suporta detecção de imagem.", - "nonSimulateColorsWarning": "Esta ferramenta só funciona quando \"Simular Cores\" está ligado." - }, - "Beam": { - "imageDetectionWarning": "Detecção de imagem pode não funcionar com raios aleatórios/divergentes." - }, - "AngleSource": { - "symmetric": "Simétrico" - }, - "BaseFilter": { - "filter": "Filtro", - "bandwidth": "Largura de banda", - "invert": "Inverter" - }, - "IdealMirror": { - "cartesianSign": "Convenção de Sinal Cartesiana" - }, - "BeamSplitter": { - "transRatio": "Razão de Transmissão" - }, - "BaseGlass": { - "refIndex": "Índice refrativo", - "refIndexInfo": { - "relative": "Relativo se dentro de outro vidro", - "effective": "Se este objeto deve ser simulado com índice refrativo absoluto n₁, mas estiver dentro de outro vidro de índice refrativo n₀, então você deve definir o índice refrativo como n₁/n₀ aqui. Em casos mais complicados que vários vidros se sobreponham, o índice refrativo efetivo da região sobreposta é igual ao produto dos índices refrativos individuais." - }, - "cauchyCoeff": "Coeficiente de Cauchy" - }, - "SphericalLens": { - "defBy": { - "radiiOfCurvature": "Raios de curvatura", - "focalDistances": "Distâncias Focais" - } - }, - "BaseGrinGlass": { - "refIndexFnInfo": { - "constants": "Constantes suportadas", - "operators": "Operadores suportados", - "functions": "Funções suportadas", - "lambda": "To simulate chromatic dispersion, use parameter {{lambda}} for the vacuum wavelength in nanometers.", - "diff": "Somente suporta funções diferenciáveis.", - "origin": "A origem de n(x,y) está em coordenadas absolutas e n~~ao move com o objeto. Você pode clicar duas vezes em um ponto de controle para inspecionar suas coordenadas absolutas.", - "accuracy": "Para simulação mais precisa, veja \"Mais opções...\"" - }, - "refIndexFnOrigin": "Origem de n(x,y)", - "stepSize": "Tamanho de passo da solução numérica", - "stepSizeInfo": "Tamanho de passo do método de Euler para resolver a equação do eikonal de raios - ver função 'step' e documentação dentro do arquivo 'BaseGrinGlass.js', para mais informações.", - "intersectTol": "Tolerância de Interseção", - "symbolicBodyMerging": "União simbólica de corpos", - "symbolicBodyMergingInfo": { - "all": "Esta opção se aplica a todos objetos GRIN na simulação.", - "impl": "Este simulador atualmente possi duas implementações de propagação de luz entre meios diferentes, para objetos GRIN - numérica e simbólica (ver funções 'multRefIndex' e 'devRefIndex' em 'BaseGrinGlass.js').", - "implNote": "A implementação numérica é mais rápida mas nem sempre funciona corretamente (dependende do caso específico) em cenários quando é usada com mais de um objeto GRIN, tal que ao menos um deles possua uma função de índice refrativo que não é definida todo o plano, enquanto a implementação simbólica é mais lenta, mas robusta a esse tipo de problema." - } - }, - "CircleGrinGlass": { - "epsInfo": { - "units": "Units - [length]^2.", - "functions": "Essa tolerância numérica é usada nas funções 'isOutsideGlass', 'isInsideGlass' e 'isOnBoundary', dentro do arquivo 'CircleGrinGlass.js'." - } - }, - "GrinGlass": { - "epsInfo": { - "units": "Units - [length].", - "functions": "Essa tolerância numérica é usada nas funções 'isOnBoundary' e 'countIntersections', dentro do arquivo'GrinGlass.js'." - } - }, - "Aperature": { - "diameter": "Diâmetro" - }, - "DiffractionGrating": { - "lineDensity": "Linhas/{{lengthUnit}}", - "customBrightness": "Brilho Personalizado", - "customBrightnessInfo": "Quando ligado, os brilhos dos raios difratados são personalizados por uma lista de números correspndendo a m = 0, 1, -1, 2, -2, .... O número será normalizado ao brilho do raio incidente. Os valores não na lista são definidos como 0. Por exemplo, \"1, 0.5, 0.5\" significa que o raio m=0 tem o mesmo brilho que o raio incidente, os raios m=1 e m=-1 têm metade do brilho, e todos os outros raios são ignorados.", - "slitRatio": "Largura de vão / Espaçamento de linha", - "mirrored": "Espelhado" - }, - "Ruler": { - "scaleInterval": "Intervalo da escala" - }, - "Detector": { - "info": { - "P": "P: A taxa de fluxo de energia em B/s (ver abaixo).", - "Fperp": "F⊥: A taxa de fluxo de momento perpendicular em (B/s)/c.", - "Fpar": "F∥: A taxa de fluxo de momento paralelo em (B/s)/c.", - "irradiance": "A irradiância no CSV exportado está em (B/s)/L.", - "length": "L é a unidade arbitrária de comprimento utilizada nesse simulador.", - "B": "B é uma unidade arbitrária de fluxo radiante ou fluxo luminoso, correspondente à unidade da opção \"Brilho\" sendo B/L para raios não Lambertianos e 500B/360° para fontes pontuais.", - "s": "O fator adimensional s é a \"Escala de Brilho\" exibida em Configurações -> Mostrar caixa de status, que é igual a 1 quando \"Densidade de Raios\" está acima de certo ponto e proporcional a \"Densidade de Raios\" caso contrário.", - "truncation": "Se alguns raios forem truncados na série infinita de reflexão interna, a truncação total é exibida como estimativas de erro." - }, - "irradMap": "Mapa de Irradiância", - "binSize": "Tamanho do coletor", - "exportData": "Exportar dados" - }, - "TextLabel": { - "textHere": "Texto Aqui", - "fontSize": "Tamanho da Fonte", - "font": "Fonte", - "fontStyle": "Estilo", - "fontStyles": { - "normal": "Normal", - "bold": "Negrito", - "italic": "Itálico", - "boldItalic": "Negrito Itálico", - "oblique": "Oblíquo", - "boldOblique": "Negrito Oblíquo" - }, - "alignment": "Alinhamento", - "alignments": { - "left": "Esquerda", - "center": "Centro", - "right": "Direita" - }, - "smallCaps": "Maiúsculo pequeno", - "angle": "Ângulo" - }, - "LineArrow": { - "arrow": "Seta frontal", - "backArrow": "Seta traseira" - }, - "Drawing": { - "finishDrawing": "Finalizar Desenho" - }, - "ModuleObj": { - "module": "Módulo", - "demodulize": "Demodulizar" - }, - "Handle": { - "handle": "Ponto de manuseio", - "transformation": "Transformação", - "transformations": { - "translation": "Translação", - "xTranslation": "Translação X", - "yTranslation": "Translação Y", - "rotation": "Rotação", - "scaling": "Escala" - } - }, - "CropBox": { - "title": "Exportar", - "cropBoxSize": "Tamanho da Caixa de Corte", - "format": "Formato", - "width": "Largura", - "rayCountLimit": "Limite de quantidade de raios", - "svgWarning": "Exportar como SVG: Misturas de cores e índices refrativos relativos abaixo de 1 não são suportados.", - "rayCountWarning": "O número atual de raios na cena é maior que o limite de número de raios. Você pode precisar de aumentar o limite nas opções da Caixa de Corte." - } - }, - "saveModal": { - "title": "Salvar", - "description": { - "autoSync": "Você pode usar Configurações -> Sincronizar URL automaticamente ao invés de salvar para um arquivo.", - "rename": "Clique \"Renomear\" para mudar o título sem salvar um arquivo.", - "contribute": "Você pode considerar [contribuir um novo item](/contributing/gallery) para a [Galeria](/gallery)." - }, - "fileName": "Nome", - "rename": "Renomear" - }, - "moduleModal": { - "title": "Importar Módulos", - "makeCustomModules": "Criar módulos personalizados", - "conflict": "Outro módulo com o mesmo nome já existe na cena atual. Você pode colocar outro nome, ou deixá-lo igual para sobrepor o módulo existente." - }, - "languageModal": { - "title": "Linguagem", - "translatedFraction": "traduzido", - "helpTranslate": "Ajude-nos a traduzir este aplicativo" - }, - "generalWarnings": { - "shareLinkTooLong": "Talvez a URL seja comprida demais para funcionar em algumas plataformas. Você pode precisar de usar \"Salvar\" e compartilhar o arquivo ao invés disso.", - "autoSyncUrlTooLarge": "A cena é grande demais para sincronizar com URL. Por favor, salve manualmente", - "identicalObjects": "Há dois elementos ópticos idênticos na cena que se sobrepõem completamente.", - "brightnessInconsistent": "O brilho de duas ou mais fontes de luz satura com razões inconsistentes. Isso pode levar a erros nas leituras do detector e reprodução de cores. Por favor aumente a densidade de raios ou reduza os brilhos das fontes luminosas." - }, - "statusBox": { - "rayCount": "Número de segmentos de raio", - "totalTruncation": "Brilho truncado", - "brightnessScale": "Escala de Brilho", - "timeElapsed": "Tempo decorrido", - "forceStopped": "Interrompido à força.", - "mouseCoordinates": "Coordenadas do Mouse" - }, - "footer": { - "processing": "Processando... Clique aqui para parar.", - "helpPopup": { - "constrainedDragging": { - "title": "Arraste restrito", - "description": "Enquanto arrasta um objeto, segure Shift para limitar ao sentido horizontal/vertical; segure Ctrl para clonar. Quando criando um objeto em formato de linha ou arrastando seus pontos finais, segure Shift para travar o ângulo ou ajustar para 0°, 45°, 90°; segure Ctrl para rotacionar/ajustar escala com relação a seu centro." - }, - "groupRotateScale": { - "title": "Agrupar, rotacionar e ajustar escala de objetos", - "description": "Segure Ctrl, clique em vários pontos de controle, então clique em espaço vazio para agrupar esses pontos e criar um ponto de manuseio. Arraste o ponto de manuseio (ou use as setas do teclado) para mover o grupo; Shift+arraste para limitar a horizontal/vertical; Ctrl+arraste para rotacionar, Ctrl+Shift+arraste para ajustar escala. Arraste o \"+\" para definir o centro de rotação/escala. Clique no ponto de manuseio e aperte Ctrl+D para duplicar o grupo; aperte Delete para desagrupar." - }, - "editCoordinates": { - "title": "Editar coordenadas diretamente", - "description": "Clique duplo ou clique com botão direito no ponto de controle do objeto, edite as coordenadas (x,y), então aperte Enter." - }, - "keyboardShortcuts": { - "title": "Atalhos de teclado", - "description": "Quando um objeto está selecionado (ao clicar nele), aperte as setas do teclado para movê-lo; Ctrl+D para duplicar; tecla Delete para apagar." - }, - "contactUs": { - "title": "Contate-nos", - "description": "O jeito sugerido é ir até [Discussões](/github/discussions) ou [Problemas](/github/issues) no GitHub. Se você não usar o GitHub, pode nos mandar um email em [ray-optics@phydemo.app](/email) (por favor use Inglês).", - "contribute": "Contribuições diretas também são bem-vindas (ver [o guia de contribuições](/contributing))." - } + "saveButton": "Salvar", + "cancelButton": "Cancelar", + "defaultOption": "Padrão", + "closeButton": "Fechar" + }, + "file": { + "title": "Arquivo", + "undo": { + "title": "Desfazer" + }, + "redo": { + "title": "Refazer" + }, + "reset": { + "title": "Reiniciar" + }, + "save": { + "title": "Salvar" + }, + "open": { + "title": "Abrir", + "description": "Abrir um arquivo existente ou imagem de fundo. A imagem de fundo será exibida a partir origem das coordenadas. (Ou solte o arquivo)" + }, + "export": { + "title": "Exportar como PNG/SVG" + }, + "copyLink": { + "title": "Copiar Link Compartilhável", + "description": "Copiar e ir para a URL direta da cena atual, que pode ser utilizada para compartilhamento(possivelmente via encurtador de URL). Também veja Configurações -> Sincronização automática de URL." + }, + "viewGallery": { + "title": "Ver Galeria", + "description": "Ir para a página web da Galeria para carregar um exemplo." + } + }, + "settings": { + "title": "Configurações", + "more": "Mais", + "rayDensity": { + "title": "Densidade de Raios", + "description": "Determina o número de raios a serem emitidos por feixes e fontes pontuais. Isso também afeta a precisão da detecção de imagens e da reprodução de cores." + }, + "layoutAids": { + "title": "Auxílio de posicionamento", + "showGrid": "Grade", + "snapToGrid": "Ajustar na grade", + "lockObjs": "Travar Objetos" + }, + "gridSize": { + "title": "Tamanho da Grade" + }, + "observerSize": { + "title": "Tamanho do Observador" + }, + "lengthScale": { + "title": "Escala de Comprimento", + "description": "Se a unidade padrão de comprimento estiver pequena demais ou grande demais para modelar um sistema físico quando interpretado como uma unidade física comum unit (ex.: milímetros), esse fator pode ser usado para alterar a escala da aparência (ex.: larguras de linha) na cena." + }, + "zoom": { + "title": "Zoom" + }, + "language": { + "title": "Linguagem" + }, + "autoSyncUrl": { + "title": "Sincronizar URL automaticamente", + "description": "Quando habilitado, a URL será atualizada automaticamente com a cena atual, então você não precisa de ficar salvando a cena manualmente. Para definir o título, use Arquivo -> Salvar -> Renomear." + }, + "showJsonEditor": { + "title": "Exibir editor JSON", + "description": "Exibir o editor de código para a representação JSON da cena, que é necessária quando criando um módulo personalizado (Ver Ferramentas -> Outros -> Importar Módulos -> Criar módulos personalizados)." + }, + "showStatusBox": { + "title": "Exibir caixa de status", + "description": "Exibir a caixa de status, que inclui as coordenadas do mouse, informação de performance e o brilho truncado (o brilho total dos raios truncados na série infinita de reflexão interna)." + }, + "showHelpPopups": { + "title": "Exibir popups de ajuda", + "description": "Define se vai exibir popups de ajuda quando pairando sobre botões. (Recarregue a página para fazer efeito.)" + }, + "advancedHelp": "Para ajuda avançada, veja o ícone de ajuda no canto inferior direito." + }, + "objBar": { + "showAdvanced": { + "title": "Mais opções..." + }, + "applyToAll": { + "title": "Aplicar em Todos" + }, + "duplicate": { + "title": "Duplicar" + }, + "delete": { + "title": "Apagar" + }, + "unselect": { + "title": "Desselecionar", + "description": "Desselecionar esse objeto (Botão direito do mouse em espaço vazio tem a mesma função.)" + } + }, + "sceneObjs": { + "common": { + "lengthUnitInfo": "A unidade de comprimento utilizada nesse simulador (exceto comprimentos de onda) é arbitrária e pode ser interpretada como qualquer unidade física (ex.: milímetros) contanto que seja dentro da simulação. Se aunidade parecer pequena ou grande demais, por favor, ajuste Configurações -> Escala de Comprimento.", + "brightness": "Brilho", + "brightnessInfo": { + "rayDensity": "Somente faz efeito quando 'Densidade de Raios' está alta o suficiente.", + "rayDensitySlider": "Para controlar o número de raios emitidos, por favor ajuste o controle global de 'Densidade de Raios'." + }, + "wavelength": "Comprimento de onda", + "emisAngle": "Ângulo de Emissão", + "random": "Aleatório", + "lambert": "Lambertiano", + "focalLength": "Comprimento focal", + "eqnInfo": { + "constants": "Constantes suportadas", + "operators": "Operadores suportados", + "functions": "Funções suportadas" + }, + "imageDetectionWarning": "Esta ferramenta não suporta detecção de imagem.", + "nonSimulateColorsWarning": "Esta ferramenta só funciona quando \"Simular Cores\" está ligado." + }, + "Beam": { + "imageDetectionWarning": "Detecção de imagem pode não funcionar com raios aleatórios/divergentes." + }, + "AngleSource": { + "symmetric": "Simétrico" + }, + "BaseFilter": { + "filter": "Filtro", + "bandwidth": "Largura de banda", + "invert": "Inverter" + }, + "IdealMirror": { + "cartesianSign": "Convenção de Sinal Cartesiana" + }, + "BeamSplitter": { + "transRatio": "Razão de Transmissão" + }, + "BaseGlass": { + "refIndex": "Índice refrativo", + "refIndexInfo": { + "relative": "Relativo se dentro de outro vidro", + "effective": "Se este objeto deve ser simulado com índice refrativo absoluto n₁, mas estiver dentro de outro vidro de índice refrativo n₀, então você deve definir o índice refrativo como n₁/n₀ aqui. Em casos mais complicados que vários vidros se sobreponham, o índice refrativo efetivo da região sobreposta é igual ao produto dos índices refrativos individuais." + }, + "cauchyCoeff": "Coeficiente de Cauchy" + }, + "SphericalLens": { + "defBy": { + "radiiOfCurvature": "Raios de curvatura", + "focalDistances": "Distâncias Focais" + } + }, + "BaseGrinGlass": { + "refIndexFnInfo": { + "constants": "Constantes suportadas", + "operators": "Operadores suportados", + "functions": "Funções suportadas", + "lambda": "Para simular dispersão cromática, use o parâmetro {{lambda}} para o comprimento de onda no vácuo em nanômetros.", + "diff": "Somente suporta funções diferenciáveis.", + "origin": "A origem de n(x,y) está em coordenadas absolutas e n~~ao move com o objeto. Você pode clicar duas vezes em um ponto de controle para inspecionar suas coordenadas absolutas.", + "accuracy": "Para simulação mais precisa, veja \"Mais opções...\"" + }, + "refIndexFnOrigin": "Origem de n(x,y)", + "stepSize": "Tamanho de passo da solução numérica", + "stepSizeInfo": "Tamanho de passo do método de Euler para resolver a equação do eikonal de raios - ver função 'step' e documentação dentro do arquivo 'BaseGrinGlass.js', para mais informações.", + "intersectTol": "Tolerância de Interseção", + "symbolicBodyMerging": "União simbólica de corpos", + "symbolicBodyMergingInfo": { + "all": "Esta opção se aplica a todos objetos GRIN na simulação.", + "impl": "Este simulador atualmente possi duas implementações de propagação de luz entre meios diferentes, para objetos GRIN - numérica e simbólica (ver funções 'multRefIndex' e 'devRefIndex' em 'BaseGrinGlass.js').", + "implNote": "A implementação numérica é mais rápida mas nem sempre funciona corretamente (dependende do caso específico) em cenários quando é usada com mais de um objeto GRIN, tal que ao menos um deles possua uma função de índice refrativo que não é definida todo o plano, enquanto a implementação simbólica é mais lenta, mas robusta a esse tipo de problema." + } + }, + "CircleGrinGlass": { + "epsInfo": { + "units": "Unidades - [comprimento]^2.", + "functions": "Essa tolerância numérica é usada nas funções 'isOutsideGlass', 'isInsideGlass' e 'isOnBoundary', dentro do arquivo 'CircleGrinGlass.js'." + } + }, + "GrinGlass": { + "epsInfo": { + "units": "Unidades - [comprimento].", + "functions": "Essa tolerância numérica é usada nas funções 'isOnBoundary' e 'countIntersections', dentro do arquivo'GrinGlass.js'." + } + }, + "Aperature": { + "diameter": "Diâmetro" + }, + "DiffractionGrating": { + "lineDensity": "Linhas/{{lengthUnit}}", + "customBrightness": "Brilho Personalizado", + "customBrightnessInfo": "Quando ligado, os brilhos dos raios difratados são personalizados por uma lista de números correspndendo a m = 0, 1, -1, 2, -2, .... O número será normalizado ao brilho do raio incidente. Os valores não na lista são definidos como 0. Por exemplo, \"1, 0.5, 0.5\" significa que o raio m=0 tem o mesmo brilho que o raio incidente, os raios m=1 e m=-1 têm metade do brilho, e todos os outros raios são ignorados.", + "slitRatio": "Largura de vão / Espaçamento de linha", + "mirrored": "Espelhado" + }, + "Ruler": { + "scaleInterval": "Intervalo da escala" + }, + "Detector": { + "info": { + "P": "P: A taxa de fluxo de energia em B/s (ver abaixo).", + "Fperp": "F⊥: A taxa de fluxo de momento perpendicular em (B/s)/c.", + "Fpar": "F∥: A taxa de fluxo de momento paralelo em (B/s)/c.", + "irradiance": "A irradiância no CSV exportado está em (B/s)/L.", + "length": "L é a unidade arbitrária de comprimento utilizada nesse simulador.", + "B": "B é uma unidade arbitrária de fluxo radiante ou fluxo luminoso, correspondente à unidade da opção \"Brilho\" sendo B/L para raios não Lambertianos e 500B/360° para fontes pontuais.", + "s": "O fator adimensional s é a \"Escala de Brilho\" exibida em Configurações -> Mostrar caixa de status, que é igual a 1 quando \"Densidade de Raios\" está acima de certo ponto e proporcional a \"Densidade de Raios\" caso contrário.", + "truncation": "Se alguns raios forem truncados na série infinita de reflexão interna, a truncação total é exibida como estimativas de erro." + }, + "irradMap": "Mapa de Irradiância", + "binSize": "Tamanho do coletor", + "exportData": "Exportar dados" + }, + "TextLabel": { + "textHere": "Texto Aqui", + "fontSize": "Tamanho da Fonte", + "font": "Fonte", + "fontStyle": "Estilo", + "fontStyles": { + "normal": "Normal", + "bold": "Negrito", + "italic": "Itálico", + "boldItalic": "Negrito Itálico", + "oblique": "Oblíquo", + "boldOblique": "Negrito Oblíquo" + }, + "alignment": "Alinhamento", + "alignments": { + "left": "Esquerda", + "center": "Centro", + "right": "Direita" + }, + "smallCaps": "Maiúsculo pequeno", + "angle": "Ângulo" + }, + "LineArrow": { + "arrow": "Seta frontal", + "backArrow": "Seta traseira" + }, + "Drawing": { + "finishDrawing": "Finalizar Desenho" + }, + "ModuleObj": { + "module": "Módulo", + "demodulize": "Demodulizar" + }, + "Handle": { + "handle": "Ponto de manuseio", + "transformation": "Transformação", + "transformations": { + "translation": "Translação", + "xTranslation": "Translação X", + "yTranslation": "Translação Y", + "rotation": "Rotação", + "scaling": "Escala" + } + }, + "CropBox": { + "title": "Exportar", + "cropBoxSize": "Tamanho da Caixa de Corte", + "format": "Formato", + "width": "Largura", + "rayCountLimit": "Limite de quantidade de raios", + "svgWarning": "Exportar como SVG: Misturas de cores e índices refrativos relativos abaixo de 1 não são suportados.", + "rayCountWarning": "O número atual de raios na cena é maior que o limite de número de raios. Você pode precisar de aumentar o limite nas opções da Caixa de Corte." + } + }, + "saveModal": { + "title": "Salvar", + "description": { + "autoSync": "Você pode usar Configurações -> Sincronizar URL automaticamente ao invés de salvar para um arquivo.", + "rename": "Clique \"Renomear\" para mudar o título sem salvar um arquivo.", + "contribute": "Você pode considerar [contribuir um novo item](/contributing/gallery) para a [Galeria](/gallery)." + }, + "fileName": "Nome", + "rename": "Renomear" + }, + "moduleModal": { + "title": "Importar Módulos", + "makeCustomModules": "Criar módulos personalizados", + "conflict": "Outro módulo com o mesmo nome já existe na cena atual. Você pode colocar outro nome, ou deixá-lo igual para sobrepor o módulo existente." + }, + "languageModal": { + "title": "Linguagem", + "translatedFraction": "traduzido", + "helpTranslate": "Ajude-nos a traduzir este aplicativo" + }, + "generalWarnings": { + "shareLinkTooLong": "Talvez a URL seja comprida demais para funcionar em algumas plataformas. Você pode precisar de usar \"Salvar\" e compartilhar o arquivo ao invés disso.", + "autoSyncUrlTooLarge": "A cena é grande demais para sincronizar com URL. Por favor, salve manualmente.", + "identicalObjects": "Há dois elementos ópticos idênticos na cena que se sobrepõem completamente.", + "brightnessInconsistent": "O brilho de duas ou mais fontes de luz satura com razões inconsistentes. Isso pode levar a erros nas leituras do detector e reprodução de cores. Por favor aumente a densidade de raios ou reduza os brilhos das fontes luminosas." + }, + "statusBox": { + "rayCount": "Número de segmentos de raio", + "totalTruncation": "Brilho truncado", + "brightnessScale": "Escala de Brilho", + "timeElapsed": "Tempo decorrido", + "forceStopped": "Interrompido à força.", + "mouseCoordinates": "Coordenadas do Mouse" + }, + "footer": { + "processing": "Processando... Clique aqui para parar.", + "helpPopup": { + "constrainedDragging": { + "title": "Arraste restrito", + "description": "Enquanto arrasta um objeto, segure Shift para limitar ao sentido horizontal/vertical; segure Ctrl para clonar. Quando criando um objeto em formato de linha ou arrastando seus pontos finais, segure Shift para travar o ângulo ou ajustar para 0°, 45°, 90°; segure Ctrl para rotacionar/ajustar escala com relação a seu centro." + }, + "groupRotateScale": { + "title": "Agrupar, rotacionar e ajustar escala de objetos", + "description": "Segure Ctrl, clique em vários pontos de controle, então clique em espaço vazio para agrupar esses pontos e criar um ponto de manuseio. Arraste o ponto de manuseio (ou use as setas do teclado) para mover o grupo; Shift+arraste para limitar a horizontal/vertical; Ctrl+arraste para rotacionar, Ctrl+Shift+arraste para ajustar escala. Arraste o \"+\" para definir o centro de rotação/escala. Clique no ponto de manuseio e aperte Ctrl+D para duplicar o grupo; aperte Delete para desagrupar." + }, + "editCoordinates": { + "title": "Editar coordenadas diretamente", + "description": "Clique duplo ou clique com botão direito no ponto de controle do objeto, edite as coordenadas (x,y), então aperte Enter." + }, + "keyboardShortcuts": { + "title": "Atalhos de teclado", + "description": "Quando um objeto está selecionado (ao clicar nele), aperte as setas do teclado para movê-lo; Ctrl+D para duplicar; tecla Delete para apagar." + }, + "contactUs": { + "title": "Contate-nos", + "description": "O jeito sugerido é ir até [Discussões](/github/discussions) ou [Problemas](/github/issues) no GitHub. Se você não usar o GitHub, pode nos mandar um email em [ray-optics@phydemo.app](/email) (por favor use Inglês).", + "contribute": "Contribuições diretas também são bem-vindas (ver [o guia de contribuições](/contributing))." + } + } } - } -} \ No newline at end of file +} diff --git a/locales/ru/gallery.json b/locales/ru/gallery.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/locales/ru/gallery.json @@ -0,0 +1 @@ +{} diff --git a/locales/ru/modules.json b/locales/ru/modules.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/locales/ru/modules.json @@ -0,0 +1 @@ +{} diff --git a/locales/si/gallery.json b/locales/si/gallery.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/locales/si/gallery.json @@ -0,0 +1 @@ +{} diff --git a/locales/si/modules.json b/locales/si/modules.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/locales/si/modules.json @@ -0,0 +1 @@ +{} diff --git a/locales/si/simulator.json b/locales/si/simulator.json index fb52adb1..fa2b59e0 100644 --- a/locales/si/simulator.json +++ b/locales/si/simulator.json @@ -1,207 +1,207 @@ { - "welcome": { - "title": "Ray Optics Simulation වෙත සාදරයෙන් පිළිගනිමු", - "instruction": "optical component එක් කිරීමට tool තෝරා හිස් අවකාශය මත click කරන්න.\nඋදාහරණ සඳහා [Gallery page වෙත යන්න](/gallery).", - "loading": "URL වෙතින් දර්ශනය load වේ... කරුණාකර රැඳී සිටින්න." - }, - "common": { - "saveButton": "Save", - "cancelButton": "අවලංගු කරන්න", - "closeButton": "වසන්න" - }, - "file": { - "undo": { - "title": "Undo" + "welcome": { + "title": "Ray Optics Simulation වෙත සාදරයෙන් පිළිගනිමු", + "instruction": "optical component එක් කිරීමට tool තෝරා හිස් අවකාශය මත click කරන්න.\nඋදාහරණ සඳහා [Gallery page වෙත යන්න](/gallery).", + "loading": "URL වෙතින් දර්ශනය load වේ... කරුණාකර රැඳී සිටින්න." }, - "redo": { - "title": "Redo" - }, - "reset": { - "title": "Reset" - }, - "save": { - "title": "Save" - }, - "open": { - "title": "විවෘත කරන්න" - }, - "export": { - "title": "PNG/SVG ලෙස save කරන්න" - }, - "copyLink": { - "title": "Share කිරීමට Link ඒක copy කරන්න." - }, - "viewGallery": { - "title": "Gallery බලන්න", - "description": "උදාහරණ සදහා Galleryට යන්න." - } - }, - "settings": { - "title": "සැකසුම්", - "more": "තවත්", - "rayDensity": { - "title": "කිරණ ඝණත්වය", - "description": "කදම්භ සහ ලක්ෂ්‍ය මූලාශ්‍ර මගින් විමෝචනය කළ යුතු කිරණ ගණන තීරණය කරයි. මෙය රූප හඳුනාගැනීමේ සහ වර්ණ විදැහුම්කරණයේ නිරවද්‍යතාවයට ද බලපායි." - }, - "layoutAids": { - "showGrid": "Grid" - }, - "gridSize": { - "title": "ජාලක ප්‍රමාණය" - }, - "observerSize": { - "title": "නිරීක්ෂකයාගේ ප්‍රමාණය" - }, - "zoom": { - "title": "විශාලනය" - }, - "language": { - "title": "භාෂාව" - }, - "showJsonEditor": { - "title": "JSON editor පෙන්වන්න" - }, - "showStatusBox": { - "title": "Status box පෙන්වන්න" - }, - "showHelpPopups": { - "title": "උදවු popup පෙන්වන්න", - "description": "බොත්තම් මත සැරිසරන විට උපකාර popup පෙන්විය යුතුද යන්න නිර්ණය. (බලපෑමට පිටුව refresh කරන්න.)" - }, - "advancedHelp": "වැඩිදුර උදව් සඳහා, පහළ-දකුණු කෙළවරේ ඇති help icon බලන්න." - }, - "objBar": { - "showAdvanced": { - "title": "තවත් විකල්පයන්..." - }, - "applyToAll": { - "title": "සියල්ලටම අයදුම් කරන්න" - }, - "duplicate": { - "title": "අනුපිටපත් කරන්න" - }, - "delete": { - "title": "මකන්න" - }, - "unselect": { - "title": "තේරීම ඉවත් කරන්න", - "description": "මෙම වස්තුව තේරීමෙන් ඉවත් කරන්න (හිස් අවකාශය මත දකුණු-ක්ලික් කීරීමෙන්ද කළ හැක)" - } - }, - "sceneObjs": { "common": { - "brightnessInfo": { - "rayDensity": "'කිරණ ඝනත්වය' ප්‍රමාණවත් තරම් ඉහළ නම් පමණක් ඵලදායී වේ.", - "rayDensitySlider": "විමෝචනය වන කිරණ සංඛ්‍යාව පාලනය කිරීමට, කරුණාකර ගෝලීය 'කිරණ ඝනත්වය' ස්ලයිඩරය සීරුමාරු කරන්න." - }, - "wavelength": "තරංග ආයාමය", - "emisAngle": "විමෝචන කෝණය", - "random": "අහඹු", - "focalLength": "නාභීය දුර", - "imageDetectionWarning": "මෙම මෙවලම ප්‍රතිබිම්භ හඳුනා ගැනීමට සහාය නොදක්වයි.", - "nonSimulateColorsWarning": "මෙම මෙවලම ක්‍රියා කරන්නේ \"වර්ණ අනුකරණය\" ක්‍රියාත්මක විට පමණි." - }, - "Beam": { - "imageDetectionWarning": "අපසාරී/අහඹු කදම්භ සමඟ ප්‍රතිබිම්භ හඳුනාගැනීම ක්‍රියා නොකරයි." - }, - "AngleSource": { - "symmetric": "සමමිතික" - }, - "BaseFilter": { - "filter": "පෙරහන", - "bandwidth": "Bandwidth", - "invert": "Invert" - }, - "BeamSplitter": { - "transRatio": "සම්ප්‍රේෂණ අනුපාතය" - }, - "BaseGlass": { - "refIndex": "වර්තන අංකය", - "refIndexInfo": { - "relative": "වෙනත් වීදුරුවක් ඇතුළත නම් සාපේක්ෂ", - "effective": "මෙම වස්තුව (නිරපේක්ෂ) වර්තන දර්ශකය n₁ සමඟ අනුකරණය කළ යුතු නමුත්, වර්තන දර්ශකය n₀ සහිත වෙනත් වීදුරුවක් තුළ තබා තිබේ නම්, ඔබ මෙහි වර්තන දර්ශකය n₁/n₀ ලෙස සැකසිය යුතුය. වීදුරු කිහිපයක් එකට අතිච්ඡාදනය වන වඩාත් සංකීර්ණ අවස්ථාවන්හිදී, අතිච්ඡාදනය වන කලාපයේ ඵලදායී පරාවර්තක දර්ශකය එක් එක් ඒවායේ පරාවර්තක දර්ශකවල ගුණිතයට සමාන වේ." - }, - "cauchyCoeff": "Cauchy සංගුණකය" - }, - "SphericalLens": { - "defBy": { - "focalDistances": "නාභීය දුර" - } - }, - "Aperature": { - "diameter": "විෂ්කම්භය" - }, - "DiffractionGrating": { - "lineDensity": "රේඛා/{{lengthUnit}}", - "slitRatio": "ස්ලිට් පළල / රේඛා පරතරය" - }, - "Ruler": { - "scaleInterval": "පරිමාණ පරතරය" - }, - "TextLabel": { - "textHere": "මෙතනින් ලියන්න", - "fontSize": "අකුරු ප්‍රමාණය", - "font": "අකුරු", - "fontStyle": "Style", - "fontStyles": { - "normal": "සාමාන්‍ය අකුරු", - "bold": "තද අකුරු", - "italic": "ඇල අකුරු", - "boldItalic": "තද ඇල අකුරු", - "oblique": "ආනත අකුරු", - "boldOblique": "තද ආනත අකුරු" - }, - "alignment": "පෙළගැස්ම", - "alignments": { - "left": "වම", - "center": "මධ්‍ය", - "right": "දකුණ" - }, - "smallCaps": "Small Caps", - "angle": "කෝණය" - }, - "LineArrow": { - "arrow": "ඉදිරියට ඊතලය", - "backArrow": "පසුපසට ඊතලය" - }, - "Drawing": { - "finishDrawing": "ඇඳීම අවසන් කරන්න" - }, - "ModuleObj": { - "module": "මොඩියුල" - }, - "CropBox": { - "title": "Export", - "cropBoxSize": "කොටුව crop කරන්න", - "format": "ආකෘතිය", - "width": "පළල", - "rayCountLimit": "කිරණ ගණන සීමාව" + "saveButton": "Save", + "cancelButton": "අවලංගු කරන්න", + "closeButton": "වසන්න" + }, + "file": { + "undo": { + "title": "Undo" + }, + "redo": { + "title": "Redo" + }, + "reset": { + "title": "Reset" + }, + "save": { + "title": "Save" + }, + "open": { + "title": "විවෘත කරන්න" + }, + "export": { + "title": "PNG/SVG ලෙස save කරන්න" + }, + "copyLink": { + "title": "Share කිරීමට Link ඒක copy කරන්න." + }, + "viewGallery": { + "title": "Gallery බලන්න", + "description": "උදාහරණ සදහා Galleryට යන්න." + } + }, + "settings": { + "title": "සැකසුම්", + "more": "තවත්", + "rayDensity": { + "title": "කිරණ ඝණත්වය", + "description": "කදම්භ සහ ලක්ෂ්‍ය මූලාශ්‍ර මගින් විමෝචනය කළ යුතු කිරණ ගණන තීරණය කරයි. මෙය රූප හඳුනාගැනීමේ සහ වර්ණ විදැහුම්කරණයේ නිරවද්‍යතාවයට ද බලපායි." + }, + "layoutAids": { + "showGrid": "Grid" + }, + "gridSize": { + "title": "ජාලක ප්‍රමාණය" + }, + "observerSize": { + "title": "නිරීක්ෂකයාගේ ප්‍රමාණය" + }, + "zoom": { + "title": "විශාලනය" + }, + "language": { + "title": "භාෂාව" + }, + "showJsonEditor": { + "title": "JSON editor පෙන්වන්න" + }, + "showStatusBox": { + "title": "Status box පෙන්වන්න" + }, + "showHelpPopups": { + "title": "උදවු popup පෙන්වන්න", + "description": "බොත්තම් මත සැරිසරන විට උපකාර popup පෙන්විය යුතුද යන්න නිර්ණය. (බලපෑමට පිටුව refresh කරන්න.)" + }, + "advancedHelp": "වැඩිදුර උදව් සඳහා, පහළ-දකුණු කෙළවරේ ඇති help icon බලන්න." + }, + "objBar": { + "showAdvanced": { + "title": "තවත් විකල්පයන්..." + }, + "applyToAll": { + "title": "සියල්ලටම අයදුම් කරන්න" + }, + "duplicate": { + "title": "අනුපිටපත් කරන්න" + }, + "delete": { + "title": "මකන්න" + }, + "unselect": { + "title": "තේරීම ඉවත් කරන්න", + "description": "මෙම වස්තුව තේරීමෙන් ඉවත් කරන්න (හිස් අවකාශය මත දකුණු-ක්ලික් කීරීමෙන්ද කළ හැක)" + } + }, + "sceneObjs": { + "common": { + "brightnessInfo": { + "rayDensity": "'කිරණ ඝනත්වය' ප්‍රමාණවත් තරම් ඉහළ නම් පමණක් ඵලදායී වේ.", + "rayDensitySlider": "විමෝචනය වන කිරණ සංඛ්‍යාව පාලනය කිරීමට, කරුණාකර ගෝලීය 'කිරණ ඝනත්වය' ස්ලයිඩරය සීරුමාරු කරන්න." + }, + "wavelength": "තරංග ආයාමය", + "emisAngle": "විමෝචන කෝණය", + "random": "අහඹු", + "focalLength": "නාභීය දුර", + "imageDetectionWarning": "මෙම මෙවලම ප්‍රතිබිම්භ හඳුනා ගැනීමට සහාය නොදක්වයි.", + "nonSimulateColorsWarning": "මෙම මෙවලම ක්‍රියා කරන්නේ \"වර්ණ අනුකරණය\" ක්‍රියාත්මක විට පමණි." + }, + "Beam": { + "imageDetectionWarning": "අපසාරී/අහඹු කදම්භ සමඟ ප්‍රතිබිම්භ හඳුනාගැනීම ක්‍රියා නොකරයි." + }, + "AngleSource": { + "symmetric": "සමමිතික" + }, + "BaseFilter": { + "filter": "පෙරහන", + "bandwidth": "Bandwidth", + "invert": "Invert" + }, + "BeamSplitter": { + "transRatio": "සම්ප්‍රේෂණ අනුපාතය" + }, + "BaseGlass": { + "refIndex": "වර්තන අංකය", + "refIndexInfo": { + "relative": "වෙනත් වීදුරුවක් ඇතුළත නම් සාපේක්ෂ", + "effective": "මෙම වස්තුව (නිරපේක්ෂ) වර්තන දර්ශකය n₁ සමඟ අනුකරණය කළ යුතු නමුත්, වර්තන දර්ශකය n₀ සහිත වෙනත් වීදුරුවක් තුළ තබා තිබේ නම්, ඔබ මෙහි වර්තන දර්ශකය n₁/n₀ ලෙස සැකසිය යුතුය. වීදුරු කිහිපයක් එකට අතිච්ඡාදනය වන වඩාත් සංකීර්ණ අවස්ථාවන්හිදී, අතිච්ඡාදනය වන කලාපයේ ඵලදායී පරාවර්තක දර්ශකය එක් එක් ඒවායේ පරාවර්තක දර්ශකවල ගුණිතයට සමාන වේ." + }, + "cauchyCoeff": "Cauchy සංගුණකය" + }, + "SphericalLens": { + "defBy": { + "focalDistances": "නාභීය දුර" + } + }, + "Aperature": { + "diameter": "විෂ්කම්භය" + }, + "DiffractionGrating": { + "lineDensity": "රේඛා/{{lengthUnit}}", + "slitRatio": "ස්ලිට් පළල / රේඛා පරතරය" + }, + "Ruler": { + "scaleInterval": "පරිමාණ පරතරය" + }, + "TextLabel": { + "textHere": "මෙතනින් ලියන්න", + "fontSize": "අකුරු ප්‍රමාණය", + "font": "අකුරු", + "fontStyle": "Style", + "fontStyles": { + "normal": "සාමාන්‍ය අකුරු", + "bold": "තද අකුරු", + "italic": "ඇල අකුරු", + "boldItalic": "තද ඇල අකුරු", + "oblique": "ආනත අකුරු", + "boldOblique": "තද ආනත අකුරු" + }, + "alignment": "පෙළගැස්ම", + "alignments": { + "left": "වම", + "center": "මධ්‍ය", + "right": "දකුණ" + }, + "smallCaps": "Small Caps", + "angle": "කෝණය" + }, + "LineArrow": { + "arrow": "ඉදිරියට ඊතලය", + "backArrow": "පසුපසට ඊතලය" + }, + "Drawing": { + "finishDrawing": "ඇඳීම අවසන් කරන්න" + }, + "ModuleObj": { + "module": "මොඩියුල" + }, + "CropBox": { + "title": "Export", + "cropBoxSize": "කොටුව crop කරන්න", + "format": "ආකෘතිය", + "width": "පළල", + "rayCountLimit": "කිරණ ගණන සීමාව" + } + }, + "saveModal": { + "title": "Save", + "fileName": "නම", + "rename": "Rename" + }, + "moduleModal": { + "title": "Import Modules" + }, + "languageModal": { + "title": "භාෂාව", + "translatedFraction": "පරිවර්තිතයි", + "helpTranslate": "මෙම යෙදුම පරිවර්තනය කිරීමට අපට උදවු කරන්න" + }, + "generalWarnings": { + "identicalObjects": "දර්ශනයේ සම්පූර්ණයෙන්ම අතිච්ඡාදනය වන සමාන දෘශ්‍ය මූලද්‍රව්‍ය දෙකක් ඇත." + }, + "statusBox": { + "rayCount": "කිරණ කොටස් සංඛ්‍යාව", + "totalTruncation": "කපා දැමූ දීප්තිය", + "timeElapsed": "ගතවූ කාලය", + "forceStopped": "බලහත්කාරයෙන් නතර විය.", + "mouseCoordinates": "Mouse ඛණ්ඩාංක" + }, + "footer": { + "processing": "සකසමින්... නතර කිරීමට මෙතන click කරන්න." } - }, - "saveModal": { - "title": "Save", - "fileName": "නම", - "rename": "Rename" - }, - "moduleModal": { - "title": "Import Modules" - }, - "languageModal": { - "title": "භාෂාව", - "translatedFraction": "පරිවර්තිතයි", - "helpTranslate": "මෙම යෙදුම පරිවර්තනය කිරීමට අපට උදවු කරන්න" - }, - "generalWarnings": { - "identicalObjects": "දර්ශනයේ සම්පූර්ණයෙන්ම අතිච්ඡාදනය වන සමාන දෘශ්‍ය මූලද්‍රව්‍ය දෙකක් ඇත." - }, - "statusBox": { - "rayCount": "කිරණ කොටස් සංඛ්‍යාව", - "totalTruncation": "කපා දැමූ දීප්තිය", - "timeElapsed": "ගතවූ කාලය", - "forceStopped": "බලහත්කාරයෙන් නතර විය.", - "mouseCoordinates": "Mouse ඛණ්ඩාංක" - }, - "footer": { - "processing": "සකසමින්... නතර කිරීමට මෙතන click කරන්න." - } -} \ No newline at end of file +} diff --git a/locales/zh-CN/modules.json b/locales/zh-CN/modules.json index 3f788158..d185f8c7 100644 --- a/locales/zh-CN/modules.json +++ b/locales/zh-CN/modules.json @@ -1,141 +1,141 @@ { - "modulesPage": { - "description": { - "makeNewTools": "「模块」功能透过将本模拟器中现有的工具所建立的物件进行组合、特化或重新参数化,来制作新的工具。", - "appearAsTools": "导入的模块将显示为「其他」类别中的工具。请选择并依照控制点顺序点击空白处(参见「规格」)。", - "embeddedInScene": "导入的模块将嵌入于场景的数据中,所以当原作者更新时并不会自动更新。" - }, - "import": "导入", - "imported": "已导入", - "specification": { - "title": "规格", - "controlPointSequence": "控制点顺序", - "parameters": "参数" - }, - "customization": { - "title": "客制化", - "description": "您可直接在本网页程序中使用内置的JSON编辑器制作或客制化模块。请参见[教程](/modules/tutorial)。将导入的模块客制化仅会影响目前的场景。" - }, - "contribution": { - "title": "贡献", - "description": "欢迎您贡献项目至以上的清单。欲贡献您的模块,请参见[貢獻模块](/contributing/modules)。" - } - }, - "moduleData": { - "FresnelLens": { - "title": "菲涅耳透镜", - "description": "从半圆形透光物制成的菲涅耳透镜。[此作品集范例](/gallery/fresnel-lens)的模块化版本。", - "point1": "透镜的第一个端点", - "point2": "透镜的第二个端点", - "Nslice": "切片数量", - "refIndex": "透镜的折射率" - }, - "ContSpectrum": { - "title": "连续光谱光源", - "description": "具有均匀连续光谱的光源,以指定的步长离散化。只在「模拟色彩」模式中运作。", - "point1": "光线的起点", - "point2": "决定光线的方向", - "min": "波长最小值", - "step": "波长的步长", - "max": "波长最大值", - "brightness": "总亮度" - }, - "CircleSource": { - "title": "圆形光源", - "description": "将一系列均匀的180度点光源置于圆周上所形成的光源。", - "point1": "该圆形的圆心", - "r": "该圆形的半径", - "N": "点光源的数量", - "brightness": "总亮度" - }, - "Chaff": { - "title": "干扰箔", - "description": "矩形的干扰箔,由许多随机的镜子组成。[此作品集范例](/gallery/chaff-countermeasure)的模块化版本。", - "point1": "干扰箔的左上角", - "point2": "干扰箔的右下角", - "N": "干扰箔中镜子的数量", - "L": "镜子的长度" - }, - "BeamExpander": { - "title": "扩束镜", - "description": "两个理想透镜的组合,使得两者焦距之和等于两者间的距离。此组合可以扩大或缩小准直光束的直径[此作品集范例](/gallery/beam-expanders)的模块化版本。", - "point1": "第一个透镜的中心点", - "point2": "第二个透镜的第二个点", - "point3": "决定共同焦点的位置" - }, - "RayRelay": { - "title": "光线中继", - "description": "一系列相同的理想透镜,焦距为 \\(f\\),间距为 \\(d\\)。若且唯若\\(d\\leq 4f\\)时,可以保证光线轨迹不会发散。[此作品集范例](/gallery/ray-relaying)的模块化版本。", - "point1": "第一个透镜的第一个端点", - "point2": "第一个透镜的第二个端点(应与第一点有相同的 \\(x\\))", - "f": "透镜的焦距", - "d": "透镜之间的距离", - "N": "透镜的数量" - }, - "OpticalFiber": { - "title": "光纤", - "description": "指定核心和包层折射率的线状光纤。", - "point1": "光纤的第一个端点", - "point2": "光纤的第二个端点(应与第一个点有相同的 \\(y\\))", - "X": "核心的厚度", - "Y": "包层的厚度", - "n1": "核心的折射率", - "n2": "包层的折射率" - } - }, - "moduleTutorial": { - "title": "「射线光学模拟」模块制作教程", - "opening": { - "description": "本教程将引导您完成建立自定义模块的基本步骤。这个功能可完全在本模拟器网页程序中实现,而不需要其他的开发环境。", - "moduleIntroduction": "「线光学模拟」的「模块」功能允许将物件以模块化的方式组合在一起,其中可包含自定义参数、自定义控制点与物件数组。本功能透过将本模拟器中现有的工具所建立的物件进行组合、特化或重新参数化,来制作新的工具,以扩充本模拟器的功能。例如,`CircleSource`模块(请参见工具->其他->导入模块)将现有的「点光源(<360°)」工具所建立的一系列点光源沿着一个圆形组合在一起,成为一个「圆形光源」工具,这在模拟器中原本并不存在。`FresnelLens`模块则是将「透光物->自定义函数」工具特化,使函数表示菲涅耳透镜的特定曲线,由切片数参数化,以制作一个特化的「菲涅耳透镜」工具,这在模拟器中原本也不存在。除了制作新工具外,这个功能还可以使一些光学演示更具互动性。例如,通过拖曳`BeamExpander`模块的第三个控制点,可以直接观察两个透镜的共同焦点位置如何影响光束宽度,而无需分别调整两个透镜的焦距。", - "compareWithHandle": "注意并非所有的自定义控制点都需要模块。一些简单的情况可能可以通过「控制杆」功能实现(请参见模拟器右下角的帮助弹出窗口中的「群组、旋转和缩放物件」部分)。由于制作模块比建立控制杆复杂得多,您应该在考虑制作模块之前检查您的情况是否可以通过「控制杆」功能实现。比如[这个例子](/gallery/black-cat-becomes-white)展示了一个相对复杂但不必使用模块的自定义控制点(将两个塑料袋从水中移开)。" - }, - "jsonEditor": { - "title": "内置的JSON编辑器", - "currentlyNoVisual": "本应用目前没有用于建立模块的视觉界面,因此您需要直接编辑场景的JSON原始码。", - "enableJsonEditor": "您可以通过点击应用程序右上角的「设置」下拉菜单,然后勾选「显示JSON编辑器」来启用内置的JSON编辑器。原始码编辑器会出现在界面的左侧,并显示目前场景的JSON原始码。请确保您有足够大的屏幕,因为这个功能在行动装置上效果不佳。", - "updateAccordingly": "当您使用可视化场景编辑器修改场景时,JSON编辑器中的原始码将自动更新,且更改的部分会突出显示。反之,直接在JSON编辑器中编辑原始码将相应更新场景。如果您不熟悉JSON或任何基于文字的数据格式,您可能会希望花一些时间来熟悉它。", - "objsArray": "特别是,当您将一个物件新增到场景中时,它将被新增到`objs`数组中。如果您将某些属性修改为非预设值,它们将作为该物件的键值对出现。", - "inIframesBelow": "注意:如果您在本教程页面中看不到下面的iframe中的JSON编辑器,请启用它并重新加载本页,因为您需要查看原始码以了解它的运作方式。" - }, - "basics": { - "title": "模块的基本概念", - "lookAtExample": "让我们看第一个例子。", - "lookAtJson": "您会看到四段文字。通过查看JSON编辑器,您将看到前两段直接位于顶层的`objs`数组中,但后两段位于`modules.ExampleModule.objs`中。", - "moduleDef": "`module`是一个字典,其中键是模块的名称(在本例中是`ExampleModule`),值是该模块的定义。特别是,`modules.ExampleModule.objs`数组描述了该模块中的物件(模板),这与描述场景中的物件的顶层`objs`数组不同。", - "putToScene": "要将模块中的物件放到场景中,我们需要一个「模块物件」,它位于顶层`objs`数组中,本例中是`objs[2]`,其类型是`ModuleObj`,其`module`属性是模块的名称。", - "moduleDefNotEditable": "`modules`字典中的模块定义无法由可视化场景编辑器编辑。因此,当您点选本例中的后两段文字时,您只选择了模块物件,而不是模块中的物件。由于本例中模块定义中的文字坐标是绝对坐标,因此后两段文字无法被拖曳。我们将在后面学习到如何使用控制点来使它们可被拖曳。", - "demodulize": "当您提取模块物件时,物件栏上会有一个「取消模块化」按钮。点选后会将模块物件「展开」为构成此模块的物件,此时`objs`将包含所有四段文字。这个操作是不可逆的(除非点击「复原」)。", - "createModule": "目前建议制作模块的方式为,首先使用JSON编辑器建立一个空的模块,然后使用可视化场景编辑器新增一些物件,最后使用JSON编辑器将这些物件从`objs`剪下并粘贴到`modules.ModuleName.objs`中。" - }, - "parameters": { - "title": "新增参数", - "lookAtExample": "模块中的物件可以由一组参数来定义。让我们看一个简单的例子", - "paramsArray": "这里`modules.ModuleName.params`是一个由形如`\"名称=起始值:增量:终止值:预设值\"`的字串构成的数组,定义了变数的名称和数值滑杆的范围。当提取模块物件时,滑杆将出现在物件栏上。", - "equationSyntax": "在`modules.ExampleModule.objs`数组中,任何值都可以使用这些参数来表示。在字串中(例如`TextLabel`的`text`属性)中,带有参数的数学式被反引号包围。对于数值参数(例如`TextLabel`的`fontSize`属性),您需要将其改为字串,以便您可以在其中使用反引号格式。因此每条数学式都被一对反引号和一对引号包围。这些数学式将使用math.js来计算([语法](/mathjs/syntax))。请参见该网页以了解您可以在数学式中使用的语法和函数。", - "valueStorage": "参数的实际值位于模块物件的`params`属性中。这部分与模块定义不同,其可以通过滑杆直接由可视化场景编辑器编辑。" - }, - "controlPoints": { - "title": "新增控制点", - "lookAtExample": "为了使模块物件可被拖曳,我们需要使用一组控制点来对模块中的物件位置进行参数化。让我们看一个例子", - "coordinatesOfControlPoints": "这里`modules.ModuleName.numPoints`描述了控制点的数量。控制点坐标之符号为 (`x_1`, `y_1`)、(`x_2`, `y_2`) 等等。其用在`modules.ExampleModule.objs`中的方式与前一节所述之参数相同。请注意索引从1开始。", - "valueStorage": "控制点的实际值位于模块物件的`controlPoints`属性中,其可以直接由可视化场景编辑器编辑,而非如第一个例子中写死在模块定义中的坐标。每个控制点在场景中显示为两个同心的灰色圆形,并且可以被拖曳。若您拖曳模块物件的其他地方(如文字标签),则所有的控制点会一起移动。", - "createAsTool": "由于我们的模块物件已经可以移动,我们可以很容易地建立多个实例,就像在本模拟器中其他的工具中一样。模块的名称显示在工具->其他菜单中,您可以选择它,然后按两个点来指定两个控制点的位置,就可建立此模块的另一个实例。您也可以使用物件栏上的「复制」按钮。" - }, - "arrayAndConditional": { - "title": "数组与条件", - "lookAtExample": "使用数组和条件语法,可以建立更复杂的模块。让我们看一个例子", - "specialKeys": "在`modules.ExampleModule.objs`中,任何数组中的物件都可以有两个特殊的键:`\"for\"`和`\"if\"`。`\"for\"`键的值是一个描述循环变数的字串,格式为`\"名称=起始值:增量:终止值\"`,或者是一个包含多个这种格式的字串的数组,描述多维循环。这样的物件在数组中根据循环变数被复制多次。`\"if\"`键的值是则是一个表示布尔值的字串,使得该物件只在布尔值为真时才会包含在数组中。", - "preventInfiniteLoop": "为了防止意外的无穷循环,每个`\"for\"`循环的总迭代次数由模块定义中的`maxLoopLength`属性限制,其预设值为1000。如果需要,您可以将此属性设定为更大的值。" - }, - "objsWithEqn": { - "title": "内置自定义数学式功能的物件", - "description": "对于已经具有自定义数学式输入的物件(例如镜子->自定义函数),JSON中的数学式属性是一个表示LaTeX数学式的字串,而不是math.js表达式。要在数学式中包含自定义参数,您必须将LaTeX数学式视为普通字串,并使用普通字串的模板语法。因此,反引号括起来的部分是math.js表达式,而反引号外部的则是LaTeX数学式。模块参数只能在math.js的部分中使用,而物件内置的自定义函数的自变量(例如\\(x\\))只能在LaTeX的部分中使用。以下例子产生一个形状为\\(y=\\cos(2\\pi x+\\phi)\\)的镜子,其中\\(\\phi\\)为模块参数", - "future": "未来可能会有一种统一的方式来输入数学式。" - }, - "objsWithShapeParam": { - "title": "内置形状参数化功能的物件", - "description": "对于已经支持使用不同方式定义其形状的物件(目前仅有透光物->球面透镜),有特殊的JSON语法可用于在模块定义中用这些方式来定义该物件,即使在顶层`objs`数组中这类的物件总是以形状来定义。以下是一个例子" + "modulesPage": { + "description": { + "makeNewTools": "「模块」功能透过将本模拟器中现有的工具所建立的物件进行组合、特化或重新参数化,来制作新的工具。", + "appearAsTools": "导入的模块将显示为「其他」类别中的工具。请选择并依照控制点顺序点击空白处(参见「规格」)。", + "embeddedInScene": "导入的模块将嵌入于场景的数据中,所以当原作者更新时并不会自动更新。" + }, + "import": "导入", + "imported": "已导入", + "specification": { + "title": "规格", + "controlPointSequence": "控制点顺序", + "parameters": "参数" + }, + "customization": { + "title": "客制化", + "description": "您可直接在本网页程序中使用内置的JSON编辑器制作或客制化模块。请参见[教程](/modules/tutorial)。将导入的模块客制化仅会影响目前的场景。" + }, + "contribution": { + "title": "贡献", + "description": "欢迎您贡献项目至以上的清单。欲贡献您的模块,请参见[貢獻模块](/contributing/modules)。" + } + }, + "moduleData": { + "FresnelLens": { + "title": "菲涅耳透镜", + "description": "从半圆形透光物制成的菲涅耳透镜。[此作品集范例](/gallery/fresnel-lens)的模块化版本。", + "point1": "透镜的第一个端点", + "point2": "透镜的第二个端点", + "Nslice": "切片数量", + "refIndex": "透镜的折射率" + }, + "ContSpectrum": { + "title": "连续光谱光源", + "description": "具有均匀连续光谱的光源,以指定的步长离散化。只在「模拟色彩」模式中运作。", + "point1": "光线的起点", + "point2": "决定光线的方向", + "min": "波长最小值", + "step": "波长的步长", + "max": "波长最大值", + "brightness": "总亮度" + }, + "CircleSource": { + "title": "圆形光源", + "description": "将一系列均匀的180度点光源置于圆周上所形成的光源。", + "point1": "该圆形的圆心", + "r": "该圆形的半径", + "N": "点光源的数量", + "brightness": "总亮度" + }, + "Chaff": { + "title": "干扰箔", + "description": "矩形的干扰箔,由许多随机的镜子组成。[此作品集范例](/gallery/chaff-countermeasure)的模块化版本。", + "point1": "干扰箔的左上角", + "point2": "干扰箔的右下角", + "N": "干扰箔中镜子的数量", + "L": "镜子的长度" + }, + "BeamExpander": { + "title": "扩束镜", + "description": "两个理想透镜的组合,使得两者焦距之和等于两者间的距离。此组合可以扩大或缩小准直光束的直径[此作品集范例](/gallery/beam-expanders)的模块化版本。", + "point1": "第一个透镜的中心点", + "point2": "第二个透镜的第二个点", + "point3": "决定共同焦点的位置" + }, + "RayRelay": { + "title": "光线中继", + "description": "一系列相同的理想透镜,焦距为 \\(f\\),间距为 \\(d\\)。若且唯若\\(d\\leq 4f\\)时,可以保证光线轨迹不会发散。[此作品集范例](/gallery/ray-relaying)的模块化版本。", + "point1": "第一个透镜的第一个端点", + "point2": "第一个透镜的第二个端点(应与第一点有相同的 \\(x\\))", + "f": "透镜的焦距", + "d": "透镜之间的距离", + "N": "透镜的数量" + }, + "OpticalFiber": { + "title": "光纤", + "description": "指定核心和包层折射率的线状光纤。", + "point1": "光纤的第一个端点", + "point2": "光纤的第二个端点(应与第一个点有相同的 \\(y\\))", + "X": "核心的厚度", + "Y": "包层的厚度", + "n1": "核心的折射率", + "n2": "包层的折射率" + } + }, + "moduleTutorial": { + "title": "「射线光学模拟」模块制作教程", + "opening": { + "description": "本教程将引导您完成建立自定义模块的基本步骤。这个功能可完全在本模拟器网页程序中实现,而不需要其他的开发环境。", + "moduleIntroduction": "「线光学模拟」的「模块」功能允许将物件以模块化的方式组合在一起,其中可包含自定义参数、自定义控制点与物件数组。本功能透过将本模拟器中现有的工具所建立的物件进行组合、特化或重新参数化,来制作新的工具,以扩充本模拟器的功能。例如,`CircleSource`模块(请参见工具->其他->导入模块)将现有的「点光源(<360°)」工具所建立的一系列点光源沿着一个圆形组合在一起,成为一个「圆形光源」工具,这在模拟器中原本并不存在。`FresnelLens`模块则是将「透光物->自定义函数」工具特化,使函数表示菲涅耳透镜的特定曲线,由切片数参数化,以制作一个特化的「菲涅耳透镜」工具,这在模拟器中原本也不存在。除了制作新工具外,这个功能还可以使一些光学演示更具互动性。例如,通过拖曳`BeamExpander`模块的第三个控制点,可以直接观察两个透镜的共同焦点位置如何影响光束宽度,而无需分别调整两个透镜的焦距。", + "compareWithHandle": "注意并非所有的自定义控制点都需要模块。一些简单的情况可能可以通过「控制杆」功能实现(请参见模拟器右下角的帮助弹出窗口中的「群组、旋转和缩放物件」部分)。由于制作模块比建立控制杆复杂得多,您应该在考虑制作模块之前检查您的情况是否可以通过「控制杆」功能实现。比如[这个例子](/gallery/black-cat-becomes-white)展示了一个相对复杂但不必使用模块的自定义控制点(将两个塑料袋从水中移开)。" + }, + "jsonEditor": { + "title": "内置的JSON编辑器", + "currentlyNoVisual": "本应用目前没有用于建立模块的视觉界面,因此您需要直接编辑场景的JSON原始码。", + "enableJsonEditor": "您可以通过点击应用程序右上角的「设置」下拉菜单,然后勾选「显示JSON编辑器」来启用内置的JSON编辑器。原始码编辑器会出现在界面的左侧,并显示目前场景的JSON原始码。请确保您有足够大的屏幕,因为这个功能在行动装置上效果不佳。", + "updateAccordingly": "当您使用可视化场景编辑器修改场景时,JSON编辑器中的原始码将自动更新,且更改的部分会突出显示。反之,直接在JSON编辑器中编辑原始码将相应更新场景。如果您不熟悉JSON或任何基于文字的数据格式,您可能会希望花一些时间来熟悉它。", + "objsArray": "特别是,当您将一个物件新增到场景中时,它将被新增到`objs`数组中。如果您将某些属性修改为非预设值,它们将作为该物件的键值对出现。", + "inIframesBelow": "注意:如果您在本教程页面中看不到下面的iframe中的JSON编辑器,请启用它并重新加载本页,因为您需要查看原始码以了解它的运作方式。" + }, + "basics": { + "title": "模块的基本概念", + "lookAtExample": "让我们看第一个例子。", + "lookAtJson": "您会看到四段文字。通过查看JSON编辑器,您将看到前两段直接位于顶层的`objs`数组中,但后两段位于`modules.ExampleModule.objs`中。", + "moduleDef": "`module`是一个字典,其中键是模块的名称(在本例中是`ExampleModule`),值是该模块的定义。特别是,`modules.ExampleModule.objs`数组描述了该模块中的物件(模板),这与描述场景中的物件的顶层`objs`数组不同。", + "putToScene": "要将模块中的物件放到场景中,我们需要一个「模块物件」,它位于顶层`objs`数组中,本例中是`objs[2]`,其类型是`ModuleObj`,其`module`属性是模块的名称。", + "moduleDefNotEditable": "`modules`字典中的模块定义无法由可视化场景编辑器编辑。因此,当您点选本例中的后两段文字时,您只选择了模块物件,而不是模块中的物件。由于本例中模块定义中的文字坐标是绝对坐标,因此后两段文字无法被拖曳。我们将在后面学习到如何使用控制点来使它们可被拖曳。", + "demodulize": "当您提取模块物件时,物件栏上会有一个「取消模块化」按钮。点选后会将模块物件「展开」为构成此模块的物件,此时`objs`将包含所有四段文字。这个操作是不可逆的(除非点击「复原」)。", + "createModule": "目前建议制作模块的方式为,首先使用JSON编辑器建立一个空的模块,然后使用可视化场景编辑器新增一些物件,最后使用JSON编辑器将这些物件从`objs`剪下并粘贴到`modules.ModuleName.objs`中。" + }, + "parameters": { + "title": "新增参数", + "lookAtExample": "模块中的物件可以由一组参数来定义。让我们看一个简单的例子", + "paramsArray": "这里`modules.ModuleName.params`是一个由形如`\"名称=起始值:增量:终止值:预设值\"`的字串构成的数组,定义了变数的名称和数值滑杆的范围。当提取模块物件时,滑杆将出现在物件栏上。", + "equationSyntax": "在`modules.ExampleModule.objs`数组中,任何值都可以使用这些参数来表示。在字串中(例如`TextLabel`的`text`属性)中,带有参数的数学式被反引号包围。对于数值参数(例如`TextLabel`的`fontSize`属性),您需要将其改为字串,以便您可以在其中使用反引号格式。因此每条数学式都被一对反引号和一对引号包围。这些数学式将使用math.js来计算([语法](/mathjs/syntax))。请参见该网页以了解您可以在数学式中使用的语法和函数。", + "valueStorage": "参数的实际值位于模块物件的`params`属性中。这部分与模块定义不同,其可以通过滑杆直接由可视化场景编辑器编辑。" + }, + "controlPoints": { + "title": "新增控制点", + "lookAtExample": "为了使模块物件可被拖曳,我们需要使用一组控制点来对模块中的物件位置进行参数化。让我们看一个例子", + "coordinatesOfControlPoints": "这里`modules.ModuleName.numPoints`描述了控制点的数量。控制点坐标之符号为 (`x_1`, `y_1`)、(`x_2`, `y_2`) 等等。其用在`modules.ExampleModule.objs`中的方式与前一节所述之参数相同。请注意索引从1开始。", + "valueStorage": "控制点的实际值位于模块物件的`controlPoints`属性中,其可以直接由可视化场景编辑器编辑,而非如第一个例子中写死在模块定义中的坐标。每个控制点在场景中显示为两个同心的灰色圆形,并且可以被拖曳。若您拖曳模块物件的其他地方(如文字标签),则所有的控制点会一起移动。", + "createAsTool": "由于我们的模块物件已经可以移动,我们可以很容易地建立多个实例,就像在本模拟器中其他的工具中一样。模块的名称显示在工具->其他菜单中,您可以选择它,然后按两个点来指定两个控制点的位置,就可建立此模块的另一个实例。您也可以使用物件栏上的「复制」按钮。" + }, + "arrayAndConditional": { + "title": "数组与条件", + "lookAtExample": "使用数组和条件语法,可以建立更复杂的模块。让我们看一个例子", + "specialKeys": "在`modules.ExampleModule.objs`中,任何数组中的物件都可以有两个特殊的键:`\"for\"`和`\"if\"`。`\"for\"`键的值是一个描述循环变数的字串,格式为`\"名称=起始值:增量:终止值\"`,或者是一个包含多个这种格式的字串的数组,描述多维循环。这样的物件在数组中根据循环变数被复制多次。`\"if\"`键的值是则是一个表示布尔值的字串,使得该物件只在布尔值为真时才会包含在数组中。", + "preventInfiniteLoop": "为了防止意外的无穷循环,每个`\"for\"`循环的总迭代次数由模块定义中的`maxLoopLength`属性限制,其预设值为1000。如果需要,您可以将此属性设定为更大的值。" + }, + "objsWithEqn": { + "title": "内置自定义数学式功能的物件", + "description": "对于已经具有自定义数学式输入的物件(例如镜子->自定义函数),JSON中的数学式属性是一个表示LaTeX数学式的字串,而不是math.js表达式。要在数学式中包含自定义参数,您必须将LaTeX数学式视为普通字串,并使用普通字串的模板语法。因此,反引号括起来的部分是math.js表达式,而反引号外部的则是LaTeX数学式。模块参数只能在math.js的部分中使用,而物件内置的自定义函数的自变量(例如\\(x\\))只能在LaTeX的部分中使用。以下例子产生一个形状为\\(y=\\cos(2\\pi x+\\phi)\\)的镜子,其中\\(\\phi\\)为模块参数", + "future": "未来可能会有一种统一的方式来输入数学式。" + }, + "objsWithShapeParam": { + "title": "内置形状参数化功能的物件", + "description": "对于已经支持使用不同方式定义其形状的物件(目前仅有透光物->球面透镜),有特殊的JSON语法可用于在模块定义中用这些方式来定义该物件,即使在顶层`objs`数组中这类的物件总是以形状来定义。以下是一个例子" + } } - } -} \ No newline at end of file +} diff --git a/locales/zh-CN/simulator.json b/locales/zh-CN/simulator.json index 095972ca..4903b2d2 100644 --- a/locales/zh-CN/simulator.json +++ b/locales/zh-CN/simulator.json @@ -1,335 +1,335 @@ { - "welcome": { - "title": "欢迎使用“射线光学模拟”", - "instruction": "若要加入光学元件,请选择工具并点击空白处。\n若要载入示例,[请前往“作品集”页面](/gallery)。", - "loading": "正在从网址载入场景... 请稍候。" - }, - "common": { - "saveButton": "保存", - "cancelButton": "取消", - "defaultOption": "默认", - "closeButton": "关闭" - }, - "file": { - "title": "文件", - "undo": { - "title": "撤销" + "welcome": { + "title": "欢迎使用“射线光学模拟”", + "instruction": "若要加入光学元件,请选择工具并点击空白处。\n若要载入示例,[请前往“作品集”页面](/gallery)。", + "loading": "正在从网址载入场景... 请稍候。" }, - "redo": { - "title": "重做" - }, - "reset": { - "title": "清空" - }, - "save": { - "title": "保存" - }, - "open": { - "title": "打开", - "description": "打开文件或背景图片。背景图片将从坐标原点显示。(或拖放文件)" - }, - "export": { - "title": "导出为PNG/SVG" - }, - "copyLink": { - "title": "复制分享连结", - "description": "复制并前往本场景的专属网址,以便分享连结(可考虑透过短网址工具)。另见设定->自动同步网址。" - }, - "viewGallery": { - "title": "浏览作品集", - "description": "前往「作品集」页面以载入示例。" - } - }, - "settings": { - "title": "设定", - "more": "更多选项", - "rayDensity": { - "title": "光线密度", - "description": "决定从光束与点光源射出的光线数量。这也会影响到像的侦测与颜色渲染的准确性。" - }, - "layoutAids": { - "title": "排版辅助", - "showGrid": "网格", - "snapToGrid": "对齐网格", - "lockObjs": "锁定物件" - }, - "gridSize": { - "title": "网格大小" - }, - "observerSize": { - "title": "观察者大小" - }, - "lengthScale": { - "title": "长度尺度", - "description": "如果将默认的长度单位视为常见的物理单位(例如毫米)时,模拟的物理系统看起来太小或太大,则可以使用此比例来缩放场景中的外观(例如线宽)。" - }, - "zoom": { - "title": "缩放" - }, - "language": { - "title": "语言" - }, - "autoSyncUrl": { - "title": "自动同步网址", - "description": "启用时,网址会随着场景自动更新,而不必持续手动储存场景。如需设定标题,请用文件->保存->重命名。" - }, - "showJsonEditor": { - "title": "显示 JSON 编辑器", - "description": "显示表达场景代码的 JSON 编辑器。在创建自定义模块时需要使用(见工具->其他->导入模块->创建自定义模块)。" - }, - "showStatusBox": { - "title": "显示状态方块", - "description": "显示状态方块,其中包含滑鼠座标,效能信息,以及被截断的亮度(光线在内反射的无穷级数中被截断的总亮度)。" - }, - "showHelpPopups": { - "title": "显示提示泡泡", - "description": "决定滑鼠移到按钮上方时是否显示提示泡泡(须重新载入网页以套用变更)" - }, - "advancedHelp": "进阶说明详见右下角的说明图示。" - }, - "objBar": { - "showAdvanced": { - "title": "更多选项…" - }, - "applyToAll": { - "title": "套用全部" - }, - "duplicate": { - "title": "复制" - }, - "delete": { - "title": "删除" - }, - "unselect": { - "title": "取消选取", - "description": "取消选取此物件(在空白处按滑鼠右键也有相同的功能)" - } - }, - "sceneObjs": { "common": { - "lengthUnitInfo": "本模拟器中的长度单位(除波长外)为一个任意单位。您可将其视为任何物理单位(例如毫米),只要在整个模拟中保持一致。如果单位看起来太小或太大,请调整设定->长度尺度。", - "brightness": "亮度", - "brightnessInfo": { - "rayDensity": "只在「光线密度」够高时才有作用。", - "rayDensitySlider": "如需改变射出的光线数量,请调整全域性的「光线密度」滑杆。" - }, - "wavelength": "波长", - "emisAngle": "发射角", - "random": "随机", - "lambert": "朗伯", - "focalLength": "焦距", - "eqnInfo": { - "constants": "支持的常数", - "operators": "支持的运算符", - "functions": "支持的函数" - }, - "imageDetectionWarning": "本工具不支持像的侦测。", - "nonSimulateColorsWarning": "本工具只在「模拟色彩」模式下运作。" - }, - "Beam": { - "imageDetectionWarning": "使用发散或随机光束时,像的侦测可能无法正常运作。" - }, - "AngleSource": { - "symmetric": "对称" - }, - "BaseFilter": { - "filter": "滤光", - "bandwidth": "带宽", - "invert": "反向" - }, - "IdealMirror": { - "cartesianSign": "笛卡尔符号约定" - }, - "BeamSplitter": { - "transRatio": "透光率" - }, - "BaseGlass": { - "refIndex": "折射率", - "refIndexInfo": { - "relative": "于另一透光物内部时为相对值", - "effective": "如需模拟此物件之(绝对)折射率为 n₁,但其位于折射率为 n₀ 之另一透光物内部的情形,则此处折射率应设为 n₁/n₀ 。在更复杂的组合中,若多个透光物互相重叠,则重叠区域之等效折射率为个别折射率之乘积。" - }, - "cauchyCoeff": "柯西系数" - }, - "SphericalLens": { - "defBy": { - "radiiOfCurvature": "曲率半径", - "focalDistances": "前/后焦距" - } - }, - "BaseGrinGlass": { - "refIndexFnInfo": { - "constants": "支持的常数", - "operators": "支持的运算符", - "functions": "支持的函数", - "lambda": "如需模拟色散,请用参数 {{lambda}} 代表真空中波长,单位为纳米。", - "diff": "仅支持可微函数。", - "origin": "n(x,y)的原点为绝对座标,不跟随对象移动。在控制点上点两下可显示其绝对座标。", - "accuracy": "如需较精确的模拟,请见「更多选项...」" - }, - "refIndexFnOrigin": "n(x,y)的原点", - "stepSize": "数值求解器步长", - "stepSizeInfo": "用欧拉法求解光线程函方程(eikonal ray equation)的步长 - 更多资讯详见 'BaseGrinGlass.js' 中的 'step' 函数与原始码文件。", - "intersectTol": "相交容忍度", - "symbolicBodyMerging": "符号式物体融合", - "symbolicBodyMergingInfo": { - "all": "本选项会套用至所有渐变折射率透光物。", - "impl": "本模拟器目前有两种光线经过不同渐变折射率介质的实作 - 数值与符号(见 'BaseGrinGlass.js' 中的 'multRefIndex' 与 'devRefIndex' 函数)。", - "implNote": "数值的实作较快,但使用多个渐变折射率介质,且至少有一个介质的折射率没有在整个平面上有定义时,无法在所有情况下正常运作(取决于具体情况)。相较之下,符号的实作较慢但在这种情况下仍可正常运作。" - } - }, - "CircleGrinGlass": { - "epsInfo": { - "units": "单位 - [长度]^2.", - "functions": "本数值容忍度被用于 'CircleGrinGlass.js' 中的 'isOutsideGlass', 'isInsideGlass' 以及 'isOnBoundary' 函数。" - } - }, - "GrinGlass": { - "epsInfo": { - "units": "单位 - [长度].", - "functions": "本数值容忍度被用于 'GrinGlass.js' 中的 'isOutsideGlass', 'isInsideGlass' 以及 'isOnBoundary' 函数。" - } - }, - "Aperature": { - "diameter": "直径" - }, - "DiffractionGrating": { - "lineDensity": "线数/{{lengthUnit}}", - "customBrightness": "自定义亮度", - "customBrightnessInfo": "启用时,衍射光的亮度将由一数值数组来决定,对应到 m = 0, 1, -1, 2, -2, ...。这些数字为相对于入射光的亮度。数组中没有的数值将被设为0。例如,\"1, 0.5, 0.5\" 表示 m=0 的光线与入射光的亮度相同,m=1 与 m=-1 的光线为入射光的一半,其他光线则被忽略。", - "slitRatio": "狭缝宽度 / 线间距", - "mirrored": "反射" - }, - "Ruler": { - "scaleInterval": "刻度间距" - }, - "Detector": { - "info": { - "P": "P: 能量流率(通量),单位为 B/s(见下文)。", - "Fperp": "F⊥: 垂直动量流率,单位为 (B/s)/c。", - "Fpar": "F∥: 平行动量流率,单位为 (B/s)/c。", - "irradiance": "导出的 CSV 中的辐照度单位为 (B/s)/L。", - "length": "L 是本模拟器中使用的任意长度单位。", - "B": "B 是辐射通量或光通量的任意单位,对应到「亮度」选项的单位:非朗伯光束为 B/L,点光源为 500B/360°。", - "s": "无量纲因子 s 是「设定」->「显示状态栏」中显示的「亮度尺度」,当「光线密度」高于某个阈值时为1,否则与「光线密度」成正比。", - "truncation": "如果某些光线在内反射的无穷级数中被截断,则总截断量将显示为误差估计。" - }, - "irradMap": "辐照度图", - "binSize": "组距", - "exportData": "导出数据" - }, - "TextLabel": { - "textHere": "在此输入文字", - "fontSize": "字型大小", - "font": "字型", - "fontStyle": "样式", - "fontStyles": { - "normal": "正常", - "bold": "粗体", - "italic": "斜体", - "boldItalic": "粗斜体", - "oblique": "倾斜", - "boldOblique": "粗倾斜" - }, - "alignment": "对齐", - "alignments": { - "left": "左", - "center": "中", - "right": "右" - }, - "smallCaps": "小型大写", - "angle": "角度" - }, - "LineArrow": { - "arrow": "前向箭头", - "backArrow": "后向箭头" - }, - "Drawing": { - "finishDrawing": "停止绘图" - }, - "ModuleObj": { - "module": "模块", - "demodulize": "取消模块化" - }, - "Handle": { - "handle": "控制杆", - "transformation": "变换", - "transformations": { - "translation": "平移", - "xTranslation": "X 平移", - "yTranslation": "Y 平移", - "rotation": "旋转", - "scaling": "缩放" - } - }, - "CropBox": { - "title": "导出", - "cropBoxSize": "剪取框大小", - "format": "格式", - "width": "宽度", - "rayCountLimit": "光线数量上限", - "svgWarning": "导出为SVG:不支持混色与相对折射率低于1的情形。", - "rayCountWarning": "目前场景中的光线数量大于光线数量上限。 您可能需要将剪取框选项中的光线数量上限调高。" - } - }, - "saveModal": { - "title": "保存", - "description": { - "autoSync": "您可使用设定->自动同步网址而不必存成文件。", - "rename": "按「重命名」会改变标题但不会存成文件。", - "contribute": "您可以考虑[贡献新的项目](/contributing/gallery)到[「作品集」](/gallery)中。" - }, - "fileName": "名称", - "rename": "重命名" - }, - "moduleModal": { - "title": "导入模块", - "makeCustomModules": "制作自定义模块", - "conflict": "场景中已有一个同名但不相同的模块。您可以指定新的名称,或保留相同名称以取代原模块。" - }, - "languageModal": { - "title": "语言", - "translatedFraction": "已翻译", - "helpTranslate": "协助我们翻译本程序" - }, - "generalWarnings": { - "shareLinkTooLong": "本网址过长,在部分平台上可能无法正常运作。建议改用「保存」并分享文件。", - "autoSyncUrlTooLarge": "本场景过大,无法与网址同步。 请自行储存场景。", - "identicalObjects": "场景中有两个完全相同的光学元件完全重合。 这可能会导致非预期的行为。", - "brightnessInconsistent": "有至少两个光源的亮度以不一致的比例达到饱和。这可能会导致探测器的读数与色彩渲染错误。请提高光线密度或降低光源亮度。" - }, - "statusBox": { - "rayCount": "光线片段数量", - "totalTruncation": "被截断的亮度", - "brightnessScale": "亮度尺度", - "timeElapsed": "花费时间", - "forceStopped": "已强制终止。", - "mouseCoordinates": "滑鼠座标" - }, - "footer": { - "processing": "处理中…… 按此处以终止。", - "helpPopup": { - "constrainedDragging": { - "title": "限制拖曳行为", - "description": "拖曳物件时,按住 Shift 可限制于水平或垂直移动;按住 Ctrl 可复制物件。建立线型物件或拖曳其端点时,按住 Shift 可锁定角度或吸附至 0°、45°、90°;按住 Ctrl 可对于中心点旋转或缩放。" - }, - "groupRotateScale": { - "title": "群组、旋转及缩放物件", - "description": "按住 Ctrl,点击多个控制点(如端点),并点击空白处可将这些点群组并建立控制杆。拖曳控制杆(或按方向键)可平移群组;Shift+拖曳可限制于水平或垂直移动;Ctrl+拖曳可旋转群组;Ctrl+Shift+拖曳可缩放群组。可移动「+」设定旋转或缩放中心。点击控制杆并按 Ctrl+D 可复制群组;按 Delete 可解散群组。" - }, - "editCoordinates": { - "title": "直接编辑座标", - "description": "对控制点(如端点)点两下或按右键,输入 (x,y) 座标,然后按 Enter。" - }, - "keyboardShortcuts": { - "title": "键盘快速键", - "description": "当一物件在被选取的状态(被点击)时,按方向键可移动物件;按 Ctrl+D 可复制物件;按 Delete 可删除物件。" - }, - "contactUs": { - "title": "联络我们", - "description": "建议使用 GitHub 上的 [Discussions](/github/discussions) 或 [Issues](/github/issues) 功能(请使用英文)。若您对 GitHub 不熟,也可发送电子邮件至 [ray-optics@phydemo.app](/email)(可使用中文)。", - "contribute": "也欢迎直接进行贡献(见[贡献指南](/contributing))。" - } + "saveButton": "保存", + "cancelButton": "取消", + "defaultOption": "默认", + "closeButton": "关闭" + }, + "file": { + "title": "文件", + "undo": { + "title": "撤销" + }, + "redo": { + "title": "重做" + }, + "reset": { + "title": "清空" + }, + "save": { + "title": "保存" + }, + "open": { + "title": "打开", + "description": "打开文件或背景图片。背景图片将从坐标原点显示。(或拖放文件)" + }, + "export": { + "title": "导出为PNG/SVG" + }, + "copyLink": { + "title": "复制分享连结", + "description": "复制并前往本场景的专属网址,以便分享连结(可考虑透过短网址工具)。另见设定->自动同步网址。" + }, + "viewGallery": { + "title": "浏览作品集", + "description": "前往「作品集」页面以载入示例。" + } + }, + "settings": { + "title": "设定", + "more": "更多选项", + "rayDensity": { + "title": "光线密度", + "description": "决定从光束与点光源射出的光线数量。这也会影响到像的侦测与颜色渲染的准确性。" + }, + "layoutAids": { + "title": "排版辅助", + "showGrid": "网格", + "snapToGrid": "对齐网格", + "lockObjs": "锁定物件" + }, + "gridSize": { + "title": "网格大小" + }, + "observerSize": { + "title": "观察者大小" + }, + "lengthScale": { + "title": "长度尺度", + "description": "如果将默认的长度单位视为常见的物理单位(例如毫米)时,模拟的物理系统看起来太小或太大,则可以使用此比例来缩放场景中的外观(例如线宽)。" + }, + "zoom": { + "title": "缩放" + }, + "language": { + "title": "语言" + }, + "autoSyncUrl": { + "title": "自动同步网址", + "description": "启用时,网址会随着场景自动更新,而不必持续手动储存场景。如需设定标题,请用文件->保存->重命名。" + }, + "showJsonEditor": { + "title": "显示 JSON 编辑器", + "description": "显示表达场景代码的 JSON 编辑器。在创建自定义模块时需要使用(见工具->其他->导入模块->创建自定义模块)。" + }, + "showStatusBox": { + "title": "显示状态方块", + "description": "显示状态方块,其中包含滑鼠座标,效能信息,以及被截断的亮度(光线在内反射的无穷级数中被截断的总亮度)。" + }, + "showHelpPopups": { + "title": "显示提示泡泡", + "description": "决定滑鼠移到按钮上方时是否显示提示泡泡(须重新载入网页以套用变更)" + }, + "advancedHelp": "进阶说明详见右下角的说明图示。" + }, + "objBar": { + "showAdvanced": { + "title": "更多选项…" + }, + "applyToAll": { + "title": "套用全部" + }, + "duplicate": { + "title": "复制" + }, + "delete": { + "title": "删除" + }, + "unselect": { + "title": "取消选取", + "description": "取消选取此物件(在空白处按滑鼠右键也有相同的功能)" + } + }, + "sceneObjs": { + "common": { + "lengthUnitInfo": "本模拟器中的长度单位(除波长外)为一个任意单位。您可将其视为任何物理单位(例如毫米),只要在整个模拟中保持一致。如果单位看起来太小或太大,请调整设定->长度尺度。", + "brightness": "亮度", + "brightnessInfo": { + "rayDensity": "只在「光线密度」够高时才有作用。", + "rayDensitySlider": "如需改变射出的光线数量,请调整全域性的「光线密度」滑杆。" + }, + "wavelength": "波长", + "emisAngle": "发射角", + "random": "随机", + "lambert": "朗伯", + "focalLength": "焦距", + "eqnInfo": { + "constants": "支持的常数", + "operators": "支持的运算符", + "functions": "支持的函数" + }, + "imageDetectionWarning": "本工具不支持像的侦测。", + "nonSimulateColorsWarning": "本工具只在「模拟色彩」模式下运作。" + }, + "Beam": { + "imageDetectionWarning": "使用发散或随机光束时,像的侦测可能无法正常运作。" + }, + "AngleSource": { + "symmetric": "对称" + }, + "BaseFilter": { + "filter": "滤光", + "bandwidth": "带宽", + "invert": "反向" + }, + "IdealMirror": { + "cartesianSign": "笛卡尔符号约定" + }, + "BeamSplitter": { + "transRatio": "透光率" + }, + "BaseGlass": { + "refIndex": "折射率", + "refIndexInfo": { + "relative": "于另一透光物内部时为相对值", + "effective": "如需模拟此物件之(绝对)折射率为 n₁,但其位于折射率为 n₀ 之另一透光物内部的情形,则此处折射率应设为 n₁/n₀ 。在更复杂的组合中,若多个透光物互相重叠,则重叠区域之等效折射率为个别折射率之乘积。" + }, + "cauchyCoeff": "柯西系数" + }, + "SphericalLens": { + "defBy": { + "radiiOfCurvature": "曲率半径", + "focalDistances": "前/后焦距" + } + }, + "BaseGrinGlass": { + "refIndexFnInfo": { + "constants": "支持的常数", + "operators": "支持的运算符", + "functions": "支持的函数", + "lambda": "如需模拟色散,请用参数 {{lambda}} 代表真空中波长,单位为纳米。", + "diff": "仅支持可微函数。", + "origin": "n(x,y)的原点为绝对座标,不跟随对象移动。在控制点上点两下可显示其绝对座标。", + "accuracy": "如需较精确的模拟,请见「更多选项...」" + }, + "refIndexFnOrigin": "n(x,y)的原点", + "stepSize": "数值求解器步长", + "stepSizeInfo": "用欧拉法求解光线程函方程(eikonal ray equation)的步长 - 更多资讯详见 'BaseGrinGlass.js' 中的 'step' 函数与原始码文件。", + "intersectTol": "相交容忍度", + "symbolicBodyMerging": "符号式物体融合", + "symbolicBodyMergingInfo": { + "all": "本选项会套用至所有渐变折射率透光物。", + "impl": "本模拟器目前有两种光线经过不同渐变折射率介质的实作 - 数值与符号(见 'BaseGrinGlass.js' 中的 'multRefIndex' 与 'devRefIndex' 函数)。", + "implNote": "数值的实作较快,但使用多个渐变折射率介质,且至少有一个介质的折射率没有在整个平面上有定义时,无法在所有情况下正常运作(取决于具体情况)。相较之下,符号的实作较慢但在这种情况下仍可正常运作。" + } + }, + "CircleGrinGlass": { + "epsInfo": { + "units": "单位 - [长度]^2.", + "functions": "本数值容忍度被用于 'CircleGrinGlass.js' 中的 'isOutsideGlass', 'isInsideGlass' 以及 'isOnBoundary' 函数。" + } + }, + "GrinGlass": { + "epsInfo": { + "units": "单位 - [长度].", + "functions": "本数值容忍度被用于 'GrinGlass.js' 中的 'isOutsideGlass', 'isInsideGlass' 以及 'isOnBoundary' 函数。" + } + }, + "Aperature": { + "diameter": "直径" + }, + "DiffractionGrating": { + "lineDensity": "线数/{{lengthUnit}}", + "customBrightness": "自定义亮度", + "customBrightnessInfo": "启用时,衍射光的亮度将由一数值数组来决定,对应到 m = 0, 1, -1, 2, -2, ...。这些数字为相对于入射光的亮度。数组中没有的数值将被设为0。例如,\"1, 0.5, 0.5\" 表示 m=0 的光线与入射光的亮度相同,m=1 与 m=-1 的光线为入射光的一半,其他光线则被忽略。", + "slitRatio": "狭缝宽度 / 线间距", + "mirrored": "反射" + }, + "Ruler": { + "scaleInterval": "刻度间距" + }, + "Detector": { + "info": { + "P": "P: 能量流率(通量),单位为 B/s(见下文)。", + "Fperp": "F⊥: 垂直动量流率,单位为 (B/s)/c。", + "Fpar": "F∥: 平行动量流率,单位为 (B/s)/c。", + "irradiance": "导出的 CSV 中的辐照度单位为 (B/s)/L。", + "length": "L 是本模拟器中使用的任意长度单位。", + "B": "B 是辐射通量或光通量的任意单位,对应到「亮度」选项的单位:非朗伯光束为 B/L,点光源为 500B/360°。", + "s": "无量纲因子 s 是「设定」->「显示状态栏」中显示的「亮度尺度」,当「光线密度」高于某个阈值时为1,否则与「光线密度」成正比。", + "truncation": "如果某些光线在内反射的无穷级数中被截断,则总截断量将显示为误差估计。" + }, + "irradMap": "辐照度图", + "binSize": "组距", + "exportData": "导出数据" + }, + "TextLabel": { + "textHere": "在此输入文字", + "fontSize": "字型大小", + "font": "字型", + "fontStyle": "样式", + "fontStyles": { + "normal": "正常", + "bold": "粗体", + "italic": "斜体", + "boldItalic": "粗斜体", + "oblique": "倾斜", + "boldOblique": "粗倾斜" + }, + "alignment": "对齐", + "alignments": { + "left": "左", + "center": "中", + "right": "右" + }, + "smallCaps": "小型大写", + "angle": "角度" + }, + "LineArrow": { + "arrow": "前向箭头", + "backArrow": "后向箭头" + }, + "Drawing": { + "finishDrawing": "停止绘图" + }, + "ModuleObj": { + "module": "模块", + "demodulize": "取消模块化" + }, + "Handle": { + "handle": "控制杆", + "transformation": "变换", + "transformations": { + "translation": "平移", + "xTranslation": "X 平移", + "yTranslation": "Y 平移", + "rotation": "旋转", + "scaling": "缩放" + } + }, + "CropBox": { + "title": "导出", + "cropBoxSize": "剪取框大小", + "format": "格式", + "width": "宽度", + "rayCountLimit": "光线数量上限", + "svgWarning": "导出为SVG:不支持混色与相对折射率低于1的情形。", + "rayCountWarning": "目前场景中的光线数量大于光线数量上限。 您可能需要将剪取框选项中的光线数量上限调高。" + } + }, + "saveModal": { + "title": "保存", + "description": { + "autoSync": "您可使用设定->自动同步网址而不必存成文件。", + "rename": "按「重命名」会改变标题但不会存成文件。", + "contribute": "您可以考虑[贡献新的项目](/contributing/gallery)到[「作品集」](/gallery)中。" + }, + "fileName": "名称", + "rename": "重命名" + }, + "moduleModal": { + "title": "导入模块", + "makeCustomModules": "制作自定义模块", + "conflict": "场景中已有一个同名但不相同的模块。您可以指定新的名称,或保留相同名称以取代原模块。" + }, + "languageModal": { + "title": "语言", + "translatedFraction": "已翻译", + "helpTranslate": "协助我们翻译本程序" + }, + "generalWarnings": { + "shareLinkTooLong": "本网址过长,在部分平台上可能无法正常运作。建议改用「保存」并分享文件。", + "autoSyncUrlTooLarge": "本场景过大,无法与网址同步。 请自行储存场景。", + "identicalObjects": "场景中有两个完全相同的光学元件完全重合。 这可能会导致非预期的行为。", + "brightnessInconsistent": "有至少两个光源的亮度以不一致的比例达到饱和。这可能会导致探测器的读数与色彩渲染错误。请提高光线密度或降低光源亮度。" + }, + "statusBox": { + "rayCount": "光线片段数量", + "totalTruncation": "被截断的亮度", + "brightnessScale": "亮度尺度", + "timeElapsed": "花费时间", + "forceStopped": "已强制终止。", + "mouseCoordinates": "滑鼠座标" + }, + "footer": { + "processing": "处理中…… 按此处以终止。", + "helpPopup": { + "constrainedDragging": { + "title": "限制拖曳行为", + "description": "拖曳物件时,按住 Shift 可限制于水平或垂直移动;按住 Ctrl 可复制物件。建立线型物件或拖曳其端点时,按住 Shift 可锁定角度或吸附至 0°、45°、90°;按住 Ctrl 可对于中心点旋转或缩放。" + }, + "groupRotateScale": { + "title": "群组、旋转及缩放物件", + "description": "按住 Ctrl,点击多个控制点(如端点),并点击空白处可将这些点群组并建立控制杆。拖曳控制杆(或按方向键)可平移群组;Shift+拖曳可限制于水平或垂直移动;Ctrl+拖曳可旋转群组;Ctrl+Shift+拖曳可缩放群组。可移动「+」设定旋转或缩放中心。点击控制杆并按 Ctrl+D 可复制群组;按 Delete 可解散群组。" + }, + "editCoordinates": { + "title": "直接编辑座标", + "description": "对控制点(如端点)点两下或按右键,输入 (x,y) 座标,然后按 Enter。" + }, + "keyboardShortcuts": { + "title": "键盘快速键", + "description": "当一物件在被选取的状态(被点击)时,按方向键可移动物件;按 Ctrl+D 可复制物件;按 Delete 可删除物件。" + }, + "contactUs": { + "title": "联络我们", + "description": "建议使用 GitHub 上的 [Discussions](/github/discussions) 或 [Issues](/github/issues) 功能(请使用英文)。若您对 GitHub 不熟,也可发送电子邮件至 [ray-optics@phydemo.app](/email)(可使用中文)。", + "contribute": "也欢迎直接进行贡献(见[贡献指南](/contributing))。" + } + } } - } -} \ No newline at end of file +} diff --git a/locales/zh-TW/modules.json b/locales/zh-TW/modules.json index 8ebd7d57..21cd42b7 100644 --- a/locales/zh-TW/modules.json +++ b/locales/zh-TW/modules.json @@ -1,141 +1,141 @@ { - "modulesPage": { - "description": { - "makeNewTools": "「模組」功能透過將本模擬器中現有的工具所建立的物件進行組合、特化或重新參數化,來製作新的工具。", - "appearAsTools": "匯入的模組將顯示為「其他」類別中的工具。請選擇並依照控制點順序點擊空白處(參見「規格」)。", - "embeddedInScene": "匯入的模組將嵌入於場景的資料中,所以當原作者更新時並不會自動更新。" - }, - "import": "匯入", - "imported": "已匯入", - "specification": { - "title": "規格", - "controlPointSequence": "控制點順序", - "parameters": "參數" - }, - "customization": { - "title": "客製化", - "description": "您可直接在本網頁程式中使用內建的 JSON 編輯器製作或客製化模組。請參見[教學](/modules/tutorial)。將匯入的模組客製化僅會影響目前的場景。" - }, - "contribution": { - "title": "貢獻", - "description": "歡迎您貢獻項目至以上的清單。欲貢獻您的模組,請參見[貢獻模組](/contributing/modules)。" - } - }, - "moduleData": { - "FresnelLens": { - "title": "菲涅耳透鏡", - "description": "從半圓形透光物製成的菲涅耳透鏡。[此作品集範例](/gallery/fresnel-lens)的模組化版本。", - "point1": "透鏡的第一個端點", - "point2": "透鏡的第二個端點", - "Nslice": "切片數量", - "refIndex": "透鏡的折射率" - }, - "ContSpectrum": { - "title": "連續光譜光源", - "description": "具有均勻連續光譜的光源,以指定的步長離散化。只在「模擬色彩」模式中運作。", - "point1": "光線的起點", - "point2": "決定光線的方向", - "min": "波長最小值", - "step": "波長的步長", - "max": "波長最大值", - "brightness": "總亮度" - }, - "CircleSource": { - "title": "圓形光源", - "description": "將一系列均勻的180度點光源置於圓周上所形成的光源。", - "point1": "該圓形的圓心", - "r": "該圓形的半徑", - "N": "點光源的數量", - "brightness": "總亮度" - }, - "Chaff": { - "title": "干擾箔", - "description": "矩形的干擾箔,由許多隨機的鏡子組成。[此作品集範例](/gallery/chaff-countermeasure)的模組化版本。", - "point1": "干擾箔的左上角", - "point2": "干擾箔的右下角", - "N": "干擾箔中鏡子的數量", - "L": "鏡子的長度" - }, - "BeamExpander": { - "title": "擴束鏡", - "description": "兩個理想透鏡的組合,使得兩者焦距之和等於兩者間的距離。此組合可以擴大或縮小準直光束的直徑[此作品集範例](/gallery/beam-expanders)的模組化版本。", - "point1": "第一個透鏡的中心點", - "point2": "第二個透鏡的第二個點", - "point3": "決定共同焦點的位置" - }, - "RayRelay": { - "title": "光線中繼", - "description": "一系列相同的理想透鏡,焦距為 \\(f\\),間距為 \\(d\\)。若且唯若 \\(d\\leq 4f\\) 時,可以保證光線軌跡不會發散。[此作品集範例](/gallery/ray-relaying)的模組化版本。", - "point1": "第一個透鏡的第一個端點", - "point2": "第一個透鏡的第二個端點(應與第一點有相同的 \\(x\\))", - "f": "透鏡的焦距", - "d": "透鏡之間的距離", - "N": "透鏡的數量" - }, - "OpticalFiber": { - "title": "光纖", - "description": "指定核心和包層折射率的線狀光纖。", - "point1": "光纖的第一個端點", - "point2": "光纖的第二個端點(應與第一個點有相同的 \\(y\\))", - "X": "核心的厚度", - "Y": "包層的厚度", - "n1": "核心的折射率", - "n2": "包層的折射率" - } - }, - "moduleTutorial": { - "title": "「線光學模擬」模組製作教學", - "opening": { - "description": "本教學將引導您完成建立自訂模組的基本步驟。這個功能可完全在本模擬器網頁程式中實現,而不需要其他的開發環境。", - "moduleIntroduction": "「線光學模擬」的「模組」功能允許將物件以模組化的方式組合在一起,其中可包含自訂參數、自訂控制點與物件陣列。本功能透過將本模擬器中現有的工具所建立的物件進行組合、特化或重新參數化,來製作新的工具,以擴充本模擬器的功能。例如,`CircleSource` 模組(請參見工具->其他->匯入模組)將現有的「點光源(<360°)」工具所建立的一系列點光源沿著一個圓形組合在一起,成為一個「圓形光源」工具,這在模擬器中原本並不存在。 `FresnelLens` 模組則是將「透光物->自訂函數」工具特化,使函數表示菲涅耳透鏡的特定曲線,由切片數參數化,以製作一個特化的「菲涅耳透鏡」工具,這在模擬器中原本也不存在。除了製作新工具外,這個功能還可以使一些光學演示更具互動性。例如,通過拖曳 `BeamExpander` 模組的第三個控制點,可以直接觀察兩個透鏡的共同焦點位置如何影響光束寬度,而無需分別調整兩個透鏡的焦距。", - "compareWithHandle": "注意並非所有的自訂控制點都需要模組。一些簡單的情況可能可以通過「控制桿」功能實現(請參見模擬器右下角的幫助彈出窗口中的「群組、旋轉和縮放物件」部分)。由於製作模組比建立控制桿複雜得多,您應該在考慮製作模組之前檢查您的情況是否可以通過「控制桿」功能實現。比如[這個例子](/gallery/black-cat-becomes-white)展示了一個相對複雜但不必使用模組的自訂控制點(將兩個塑料袋從水中移開)。" - }, - "jsonEditor": { - "title": "內建的 JSON 編輯器", - "currentlyNoVisual": "本程式目前沒有用於建立模組的視覺界面,因此您需要直接編輯場景的 JSON 原始碼。", - "enableJsonEditor": "您可以通過點選網頁介面右上角的「設定」下拉選單,然後勾選「顯示 JSON 編輯器」來啟用內建的 JSON 編輯器。原始碼編輯器會出現在介面的左側,並顯示目前場景的 JSON 原始碼。請確保您有足夠大的螢幕,因為這個功能在行動裝置上效果不佳。", - "updateAccordingly": "當您使用視覺化場景編輯器修改場景時,JSON 編輯器中的原始碼將自動更新,且更改的部分會突出顯示。反之,直接在 JSON 編輯器中編輯原始碼將相應更新場景。如果您不熟悉 JSON 或任何基於文字的資料格式,您可能會希望花一些時間來熟悉它。", - "objsArray": "特別是,當您將一個物件新增到場景中時,它將被新增到 `objs` 陣列中。如果您將某些屬性修改為非預設值,它們將作為該物件的鍵值對出現。", - "inIframesBelow": "注意:如果您在本教學頁面中看不到下面的 iframe 中的 JSON 編輯器,請啟用它並重新載入本頁,因為您需要查看原始碼以了解它的運作方式。" - }, - "basics": { - "title": "模組的基本概念", - "lookAtExample": "讓我們看第一個例子。", - "lookAtJson": "您會看到四段文字。通過查看 JSON 編輯器,您將看到前兩段直接位於頂層的 `objs` 陣列中,但後兩段位於 `modules.ExampleModule.objs` 中。", - "moduleDef": "`module` 是一個字典,其中鍵是模組的名稱(在本例中是 `ExampleModule`),值是該模組的定義。特別是,`modules.ExampleModule.objs` 陣列描述了該模組中的物件(模板),這與描述場景中的物件的頂層 `objs` 陣列不同。", - "putToScene": "要將模組中的物件放到場景中,我們需要一個「模組物件」,它位於頂層 `objs` 陣列中,本例中是 `objs[2]`,其類型是 `ModuleObj`,其 `module` 屬性是模組的名稱。", - "moduleDefNotEditable": "`modules` 字典中的模組定義無法由視覺化場景編輯器編輯。因此,當您點選本例中的後兩段文字時,您只選擇了模組物件,而不是模組中的物件。由於本例中模組定義中的文字座標是絕對座標,因此後兩段文字無法被拖曳。我們將在後面學習到如何使用控制點來使它們可被拖曳。", - "demodulize": "當您選取模組物件時,物件欄上會有一個「取消模組化」按鈕。點選後會將模組物件「展開」為構成此模組的物件,此時 `objs` 將包含所有四段文字。這個操作是不可逆的(除非按「復原」)。", - "createModule": "目前建議製作模組的方式為,首先使用 JSON 編輯器建立一個空的模組,然後使用視覺化場景編輯器新增一些物件,最後使用 JSON 編輯器將這些物件從 `objs` 剪下並貼上到 `modules.ModuleName.objs` 中。" - }, - "parameters": { - "title": "新增參數", - "lookAtExample": "模組中的物件可以由一組參數來定義。讓我們看一個簡單的例子", - "paramsArray": "這裡 `modules.ModuleName.params` 是一個由形如 `\"名稱=起始值:增量:終止值:預設值\"`的字串構成的陣列,定義了變數的名稱和數值滑桿的範圍。當選取模組物件時,滑桿將出現在物件欄上。", - "equationSyntax": "在 `modules.ExampleModule.objs` 陣列中,任何值都可以使用這些參數來表示。在字串中(例如 `TextLabel` 的 `text` 屬性)中,帶有參數的數學式被反引號包圍。對於數值參數(例如 `TextLabel` 的 `fontSize` 屬性),您需要將其改為字串,以便您可以在其中使用反引號格式。因此每條數學式都被一對反引號和一對引號包圍。這些數學式將使用 math.js 來計算([語法](/mathjs/syntax))。請參見該網頁以了解您可以在數學式中使用的語法和函數。", - "valueStorage": "參數的實際值位於模組物件的 `params` 屬性中。這部分與模組定義不同,其可以通過滑桿直接由視覺化場景編輯器編輯。" - }, - "controlPoints": { - "title": "新增控制點", - "lookAtExample": "為了使模組物件可被拖曳,我們需要使用一組控制點來對模組中的物件位置進行參數化。讓我們看一個例子", - "coordinatesOfControlPoints": "這裡 `modules.ModuleName.numPoints` 描述了控制點的數量。控制點座標之符號為 (`x_1`, `y_1`)、(`x_2`, `y_2`) 等等。其用在 `modules.ExampleModule.objs` 中的方式與前一節所述之參數相同。請注意索引從 1 開始。", - "valueStorage": "控制點的實際值位於模組物件的 `controlPoints` 屬性中,其可以直接由視覺化場景編輯器編輯,而非如第一個例子中寫死在模組定義中的座標。每個控制點在場景中顯示為兩個同心的灰色圓形,並且可以被拖曳。若您拖曳模組物件的其他地方(如文字標籤),則所有的控制點會一起移動。", - "createAsTool": "由於我們的模組物件已經可以移動,我們可以很容易地建立多個實例,就像在本模擬器中其他的工具中一樣。模組的名稱顯示在工具->其他選單中,您可以選擇它,然後按兩個點來指定兩個控制點的位置,就可建立此模組的另一個實例。您也可以使用物件欄上的「複製」按鈕。" - }, - "arrayAndConditional": { - "title": "陣列與條件", - "lookAtExample": "使用陣列和條件語法,可以建立更複雜的模組。讓我們看一個例子", - "specialKeys": "在 `modules.ExampleModule.objs` 中,任何陣列中的物件都可以有兩個特殊的鍵: `\"for\"` 和 `\"if\"`。 `\"for\"` 鍵的值是一個描述迴圈變數的字串,格式為 `\"名稱=起始值:增量:終止值\"`,或者是一個包含多個這種格式的字串的陣列,描述多維迴圈。這樣的物件在陣列中根據迴圈變數被複製多次。`\"if\"` 鍵的值是則是一個表示布林值的字串,使得該物件只在布林值為真時才會包含在陣列中。", - "preventInfiniteLoop": "為了防止意外的無窮迴圈,每個 `\"for\"` 迴圈的總迭代次數由模組定義中的 `maxLoopLength` 屬性限制,其預設值為 1000。如果需要,您可以將此屬性設定為更大的值。" - }, - "objsWithEqn": { - "title": "內建自訂數學式功能的物件", - "description": "對於已經具有自訂數學式輸入的物件(例如鏡子 -> 自訂函數),JSON 中的數學式屬性是一個表示 LaTeX 數學式的字串,而不是 math.js 表達式。要在數學式中包含自訂參數,您必須將 LaTeX 數學式視為普通字串,並使用普通字串的模板語法。因此,反引號括起來的部分是 math.js 表達式,而反引號外部的則是 LaTeX 數學式。模組參數只能在 math.js 的部分中使用,而物件內建的自訂函數的自變量(例如 \\(x\\))只能在 LaTeX 的部分中使用。以下例子產生一個形狀為 \\(y=\\cos(2\\pi x+\\phi)\\) 的鏡子,其中 \\(\\phi\\) 為模組參數", - "future": "未來可能會有一種統一的方式來輸入數學式。" - }, - "objsWithShapeParam": { - "title": "內建形狀參數化功能的物件", - "description": "對於已經支援使用不同方式定義其形狀的物件(目前僅有透光物 -> 球面透鏡),有特殊的 JSON 語法可用於在模組定義中用這些方式來定義該物件,即使在頂層 `objs` 陣列中這類的物件總是以形狀來定義。以下是一個例子" + "modulesPage": { + "description": { + "makeNewTools": "「模組」功能透過將本模擬器中現有的工具所建立的物件進行組合、特化或重新參數化,來製作新的工具。", + "appearAsTools": "匯入的模組將顯示為「其他」類別中的工具。請選擇並依照控制點順序點擊空白處(參見「規格」)。", + "embeddedInScene": "匯入的模組將嵌入於場景的資料中,所以當原作者更新時並不會自動更新。" + }, + "import": "匯入", + "imported": "已匯入", + "specification": { + "title": "規格", + "controlPointSequence": "控制點順序", + "parameters": "參數" + }, + "customization": { + "title": "客製化", + "description": "您可直接在本網頁程式中使用內建的 JSON 編輯器製作或客製化模組。請參見[教學](/modules/tutorial)。將匯入的模組客製化僅會影響目前的場景。" + }, + "contribution": { + "title": "貢獻", + "description": "歡迎您貢獻項目至以上的清單。欲貢獻您的模組,請參見[貢獻模組](/contributing/modules)。" + } + }, + "moduleData": { + "FresnelLens": { + "title": "菲涅耳透鏡", + "description": "從半圓形透光物製成的菲涅耳透鏡。[此作品集範例](/gallery/fresnel-lens)的模組化版本。", + "point1": "透鏡的第一個端點", + "point2": "透鏡的第二個端點", + "Nslice": "切片數量", + "refIndex": "透鏡的折射率" + }, + "ContSpectrum": { + "title": "連續光譜光源", + "description": "具有均勻連續光譜的光源,以指定的步長離散化。只在「模擬色彩」模式中運作。", + "point1": "光線的起點", + "point2": "決定光線的方向", + "min": "波長最小值", + "step": "波長的步長", + "max": "波長最大值", + "brightness": "總亮度" + }, + "CircleSource": { + "title": "圓形光源", + "description": "將一系列均勻的180度點光源置於圓周上所形成的光源。", + "point1": "該圓形的圓心", + "r": "該圓形的半徑", + "N": "點光源的數量", + "brightness": "總亮度" + }, + "Chaff": { + "title": "干擾箔", + "description": "矩形的干擾箔,由許多隨機的鏡子組成。[此作品集範例](/gallery/chaff-countermeasure)的模組化版本。", + "point1": "干擾箔的左上角", + "point2": "干擾箔的右下角", + "N": "干擾箔中鏡子的數量", + "L": "鏡子的長度" + }, + "BeamExpander": { + "title": "擴束鏡", + "description": "兩個理想透鏡的組合,使得兩者焦距之和等於兩者間的距離。此組合可以擴大或縮小準直光束的直徑[此作品集範例](/gallery/beam-expanders)的模組化版本。", + "point1": "第一個透鏡的中心點", + "point2": "第二個透鏡的第二個點", + "point3": "決定共同焦點的位置" + }, + "RayRelay": { + "title": "光線中繼", + "description": "一系列相同的理想透鏡,焦距為 \\(f\\),間距為 \\(d\\)。若且唯若 \\(d\\leq 4f\\) 時,可以保證光線軌跡不會發散。[此作品集範例](/gallery/ray-relaying)的模組化版本。", + "point1": "第一個透鏡的第一個端點", + "point2": "第一個透鏡的第二個端點(應與第一點有相同的 \\(x\\))", + "f": "透鏡的焦距", + "d": "透鏡之間的距離", + "N": "透鏡的數量" + }, + "OpticalFiber": { + "title": "光纖", + "description": "指定核心和包層折射率的線狀光纖。", + "point1": "光纖的第一個端點", + "point2": "光纖的第二個端點(應與第一個點有相同的 \\(y\\))", + "X": "核心的厚度", + "Y": "包層的厚度", + "n1": "核心的折射率", + "n2": "包層的折射率" + } + }, + "moduleTutorial": { + "title": "「線光學模擬」模組製作教學", + "opening": { + "description": "本教學將引導您完成建立自訂模組的基本步驟。這個功能可完全在本模擬器網頁程式中實現,而不需要其他的開發環境。", + "moduleIntroduction": "「線光學模擬」的「模組」功能允許將物件以模組化的方式組合在一起,其中可包含自訂參數、自訂控制點與物件陣列。本功能透過將本模擬器中現有的工具所建立的物件進行組合、特化或重新參數化,來製作新的工具,以擴充本模擬器的功能。例如,`CircleSource` 模組(請參見工具->其他->匯入模組)將現有的「點光源(<360°)」工具所建立的一系列點光源沿著一個圓形組合在一起,成為一個「圓形光源」工具,這在模擬器中原本並不存在。 `FresnelLens` 模組則是將「透光物->自訂函數」工具特化,使函數表示菲涅耳透鏡的特定曲線,由切片數參數化,以製作一個特化的「菲涅耳透鏡」工具,這在模擬器中原本也不存在。除了製作新工具外,這個功能還可以使一些光學演示更具互動性。例如,通過拖曳 `BeamExpander` 模組的第三個控制點,可以直接觀察兩個透鏡的共同焦點位置如何影響光束寬度,而無需分別調整兩個透鏡的焦距。", + "compareWithHandle": "注意並非所有的自訂控制點都需要模組。一些簡單的情況可能可以通過「控制桿」功能實現(請參見模擬器右下角的幫助彈出窗口中的「群組、旋轉和縮放物件」部分)。由於製作模組比建立控制桿複雜得多,您應該在考慮製作模組之前檢查您的情況是否可以通過「控制桿」功能實現。比如[這個例子](/gallery/black-cat-becomes-white)展示了一個相對複雜但不必使用模組的自訂控制點(將兩個塑料袋從水中移開)。" + }, + "jsonEditor": { + "title": "內建的 JSON 編輯器", + "currentlyNoVisual": "本程式目前沒有用於建立模組的視覺界面,因此您需要直接編輯場景的 JSON 原始碼。", + "enableJsonEditor": "您可以通過點選網頁介面右上角的「設定」下拉選單,然後勾選「顯示 JSON 編輯器」來啟用內建的 JSON 編輯器。原始碼編輯器會出現在介面的左側,並顯示目前場景的 JSON 原始碼。請確保您有足夠大的螢幕,因為這個功能在行動裝置上效果不佳。", + "updateAccordingly": "當您使用視覺化場景編輯器修改場景時,JSON 編輯器中的原始碼將自動更新,且更改的部分會突出顯示。反之,直接在 JSON 編輯器中編輯原始碼將相應更新場景。如果您不熟悉 JSON 或任何基於文字的資料格式,您可能會希望花一些時間來熟悉它。", + "objsArray": "特別是,當您將一個物件新增到場景中時,它將被新增到 `objs` 陣列中。如果您將某些屬性修改為非預設值,它們將作為該物件的鍵值對出現。", + "inIframesBelow": "注意:如果您在本教學頁面中看不到下面的 iframe 中的 JSON 編輯器,請啟用它並重新載入本頁,因為您需要查看原始碼以了解它的運作方式。" + }, + "basics": { + "title": "模組的基本概念", + "lookAtExample": "讓我們看第一個例子。", + "lookAtJson": "您會看到四段文字。通過查看 JSON 編輯器,您將看到前兩段直接位於頂層的 `objs` 陣列中,但後兩段位於 `modules.ExampleModule.objs` 中。", + "moduleDef": "`module` 是一個字典,其中鍵是模組的名稱(在本例中是 `ExampleModule`),值是該模組的定義。特別是,`modules.ExampleModule.objs` 陣列描述了該模組中的物件(模板),這與描述場景中的物件的頂層 `objs` 陣列不同。", + "putToScene": "要將模組中的物件放到場景中,我們需要一個「模組物件」,它位於頂層 `objs` 陣列中,本例中是 `objs[2]`,其類型是 `ModuleObj`,其 `module` 屬性是模組的名稱。", + "moduleDefNotEditable": "`modules` 字典中的模組定義無法由視覺化場景編輯器編輯。因此,當您點選本例中的後兩段文字時,您只選擇了模組物件,而不是模組中的物件。由於本例中模組定義中的文字座標是絕對座標,因此後兩段文字無法被拖曳。我們將在後面學習到如何使用控制點來使它們可被拖曳。", + "demodulize": "當您選取模組物件時,物件欄上會有一個「取消模組化」按鈕。點選後會將模組物件「展開」為構成此模組的物件,此時 `objs` 將包含所有四段文字。這個操作是不可逆的(除非按「復原」)。", + "createModule": "目前建議製作模組的方式為,首先使用 JSON 編輯器建立一個空的模組,然後使用視覺化場景編輯器新增一些物件,最後使用 JSON 編輯器將這些物件從 `objs` 剪下並貼上到 `modules.ModuleName.objs` 中。" + }, + "parameters": { + "title": "新增參數", + "lookAtExample": "模組中的物件可以由一組參數來定義。讓我們看一個簡單的例子", + "paramsArray": "這裡 `modules.ModuleName.params` 是一個由形如 `\"名稱=起始值:增量:終止值:預設值\"`的字串構成的陣列,定義了變數的名稱和數值滑桿的範圍。當選取模組物件時,滑桿將出現在物件欄上。", + "equationSyntax": "在 `modules.ExampleModule.objs` 陣列中,任何值都可以使用這些參數來表示。在字串中(例如 `TextLabel` 的 `text` 屬性)中,帶有參數的數學式被反引號包圍。對於數值參數(例如 `TextLabel` 的 `fontSize` 屬性),您需要將其改為字串,以便您可以在其中使用反引號格式。因此每條數學式都被一對反引號和一對引號包圍。這些數學式將使用 math.js 來計算([語法](/mathjs/syntax))。請參見該網頁以了解您可以在數學式中使用的語法和函數。", + "valueStorage": "參數的實際值位於模組物件的 `params` 屬性中。這部分與模組定義不同,其可以通過滑桿直接由視覺化場景編輯器編輯。" + }, + "controlPoints": { + "title": "新增控制點", + "lookAtExample": "為了使模組物件可被拖曳,我們需要使用一組控制點來對模組中的物件位置進行參數化。讓我們看一個例子", + "coordinatesOfControlPoints": "這裡 `modules.ModuleName.numPoints` 描述了控制點的數量。控制點座標之符號為 (`x_1`, `y_1`)、(`x_2`, `y_2`) 等等。其用在 `modules.ExampleModule.objs` 中的方式與前一節所述之參數相同。請注意索引從 1 開始。", + "valueStorage": "控制點的實際值位於模組物件的 `controlPoints` 屬性中,其可以直接由視覺化場景編輯器編輯,而非如第一個例子中寫死在模組定義中的座標。每個控制點在場景中顯示為兩個同心的灰色圓形,並且可以被拖曳。若您拖曳模組物件的其他地方(如文字標籤),則所有的控制點會一起移動。", + "createAsTool": "由於我們的模組物件已經可以移動,我們可以很容易地建立多個實例,就像在本模擬器中其他的工具中一樣。模組的名稱顯示在工具->其他選單中,您可以選擇它,然後按兩個點來指定兩個控制點的位置,就可建立此模組的另一個實例。您也可以使用物件欄上的「複製」按鈕。" + }, + "arrayAndConditional": { + "title": "陣列與條件", + "lookAtExample": "使用陣列和條件語法,可以建立更複雜的模組。讓我們看一個例子", + "specialKeys": "在 `modules.ExampleModule.objs` 中,任何陣列中的物件都可以有兩個特殊的鍵: `\"for\"` 和 `\"if\"`。 `\"for\"` 鍵的值是一個描述迴圈變數的字串,格式為 `\"名稱=起始值:增量:終止值\"`,或者是一個包含多個這種格式的字串的陣列,描述多維迴圈。這樣的物件在陣列中根據迴圈變數被複製多次。`\"if\"` 鍵的值是則是一個表示布林值的字串,使得該物件只在布林值為真時才會包含在陣列中。", + "preventInfiniteLoop": "為了防止意外的無窮迴圈,每個 `\"for\"` 迴圈的總迭代次數由模組定義中的 `maxLoopLength` 屬性限制,其預設值為 1000。如果需要,您可以將此屬性設定為更大的值。" + }, + "objsWithEqn": { + "title": "內建自訂數學式功能的物件", + "description": "對於已經具有自訂數學式輸入的物件(例如鏡子 -> 自訂函數),JSON 中的數學式屬性是一個表示 LaTeX 數學式的字串,而不是 math.js 表達式。要在數學式中包含自訂參數,您必須將 LaTeX 數學式視為普通字串,並使用普通字串的模板語法。因此,反引號括起來的部分是 math.js 表達式,而反引號外部的則是 LaTeX 數學式。模組參數只能在 math.js 的部分中使用,而物件內建的自訂函數的自變量(例如 \\(x\\))只能在 LaTeX 的部分中使用。以下例子產生一個形狀為 \\(y=\\cos(2\\pi x+\\phi)\\) 的鏡子,其中 \\(\\phi\\) 為模組參數", + "future": "未來可能會有一種統一的方式來輸入數學式。" + }, + "objsWithShapeParam": { + "title": "內建形狀參數化功能的物件", + "description": "對於已經支援使用不同方式定義其形狀的物件(目前僅有透光物 -> 球面透鏡),有特殊的 JSON 語法可用於在模組定義中用這些方式來定義該物件,即使在頂層 `objs` 陣列中這類的物件總是以形狀來定義。以下是一個例子" + } } - } -} \ No newline at end of file +} diff --git a/locales/zh-TW/simulator.json b/locales/zh-TW/simulator.json index 809563ed..12cb6e7d 100644 --- a/locales/zh-TW/simulator.json +++ b/locales/zh-TW/simulator.json @@ -1,335 +1,335 @@ { - "welcome": { - "title": "歡迎使用「線光學模擬」", - "instruction": "若要加入光學元件,請選擇工具並點擊空白處。\n若要載入範例,[請前往「作品集」頁面](/gallery)。", - "loading": "正在從網址載入場景... 請稍候。" - }, - "common": { - "saveButton": "儲存", - "cancelButton": "取消", - "defaultOption": "預設", - "closeButton": "關閉" - }, - "file": { - "title": "檔案", - "undo": { - "title": "復原" + "welcome": { + "title": "歡迎使用「線光學模擬」", + "instruction": "若要加入光學元件,請選擇工具並點擊空白處。\n若要載入範例,[請前往「作品集」頁面](/gallery)。", + "loading": "正在從網址載入場景... 請稍候。" }, - "redo": { - "title": "重做" - }, - "reset": { - "title": "重設" - }, - "save": { - "title": "儲存" - }, - "open": { - "title": "開啟", - "description": "開啟檔案或背景圖片。背景圖片將從座標原點顯示。(或拖放檔案)" - }, - "export": { - "title": "匯出為PNG/SVG" - }, - "copyLink": { - "title": "複製分享連結", - "description": "複製並前往本場景的專屬網址,以便分享連結(可考慮透過短網址工具)。另見設定->自動同步網址。" - }, - "viewGallery": { - "title": "瀏覽作品集", - "description": "前往「作品集」頁面以載入範例。" - } - }, - "settings": { - "title": "設定", - "more": "更多選項", - "rayDensity": { - "title": "光線密度", - "description": "決定從光束與點光源射出的光線數量。這也會影響到像的偵測與顏色渲染的準確性。" - }, - "layoutAids": { - "title": "排版輔助", - "showGrid": "格線", - "snapToGrid": "對齊格線", - "lockObjs": "鎖定物件" - }, - "gridSize": { - "title": "格線大小" - }, - "observerSize": { - "title": "觀察者大小" - }, - "lengthScale": { - "title": "長度尺度", - "description": "如果將預設的長度單位視為常見的物理單位(例如毫米)時,模擬的物理系統看起來太小或太大,則可以使用此比例來縮放場景中的外觀(例如線寬)。" - }, - "zoom": { - "title": "縮放" - }, - "language": { - "title": "語言" - }, - "autoSyncUrl": { - "title": "自動同步網址", - "description": "啟用時,網址會隨著場景自動更新,而不必持續手動儲存場景。如需設定標題,請用檔案->儲存->重新命名。" - }, - "showJsonEditor": { - "title": "顯示 JSON 編輯器", - "description": "顯示表達場景原始碼的 JSON 編輯器。在建立自訂模組時需要使用(見工具->其他->匯入模組->建立自訂模組)。" - }, - "showStatusBox": { - "title": "顯示狀態方塊", - "description": "顯示狀態方塊,其中包含滑鼠座標,效能資訊,以及被截斷的亮度(光線在內反射的無窮級數中被截斷的總亮度)。" - }, - "showHelpPopups": { - "title": "顯示提示泡泡", - "description": "決定滑鼠移到按鈕上方時是否顯示提示泡泡(須重新載入網頁以套用變更)" - }, - "advancedHelp": "進階說明詳見右下角的說明圖示。" - }, - "objBar": { - "showAdvanced": { - "title": "更多選項…" - }, - "applyToAll": { - "title": "套用全部" - }, - "duplicate": { - "title": "複製" - }, - "delete": { - "title": "刪除" - }, - "unselect": { - "title": "取消選取", - "description": "取消選取此物件(在空白處按滑鼠右鍵也有相同的功能)" - } - }, - "sceneObjs": { "common": { - "lengthUnitInfo": "本模擬器中的長度單位(除波長外)為一個任意單位。您可將其視為任何物理單位(例如毫米),只要在整個模擬中保持一致。如果單位看起來太小或太大,請調整設定->長度尺度。", - "brightness": "亮度", - "brightnessInfo": { - "rayDensity": "只在「光線密度」夠高時才有作用。", - "rayDensitySlider": "如需改變射出的光線數量,請調整全域性的「光線密度」滑桿。" - }, - "wavelength": "波長", - "emisAngle": "發射角", - "random": "隨機", - "lambert": "朗伯", - "focalLength": "焦距", - "eqnInfo": { - "constants": "支援的常數", - "operators": "支援的運算子", - "functions": "支援的函數" - }, - "imageDetectionWarning": "本工具不支援像的偵測。", - "nonSimulateColorsWarning": "本工具只在「模擬色彩」模式下運作。" - }, - "Beam": { - "imageDetectionWarning": "使用發散或隨機光束時,像的偵測可能無法正常運作。" - }, - "AngleSource": { - "symmetric": "對稱" - }, - "BaseFilter": { - "filter": "濾光", - "bandwidth": "帶寬", - "invert": "反向" - }, - "IdealMirror": { - "cartesianSign": "卡氏符號約定" - }, - "BeamSplitter": { - "transRatio": "透光率" - }, - "BaseGlass": { - "refIndex": "折射率", - "refIndexInfo": { - "relative": "於另一透光物內部時為相對值", - "effective": "如需模擬此物件之(絕對)折射率為 n₁,但其位於折射率為 n₀ 之另一透光物內部的情形,則此處折射率應設為 n₁/n₀ 。在更複雜的組合中,若多個透光物互相重疊,則重疊區域之等效折射率為個別折射率之乘積。" - }, - "cauchyCoeff": "柯西係數" - }, - "SphericalLens": { - "defBy": { - "radiiOfCurvature": "曲率半徑", - "focalDistances": "前/後焦距" - } - }, - "BaseGrinGlass": { - "refIndexFnInfo": { - "constants": "支援的常數", - "operators": "支援的運算子", - "functions": "支援的函數", - "lambda": "如需模擬色散,請用參數 {{lambda}} 代表真空中波長,單位為奈米。", - "diff": "僅支援可微函數。", - "origin": "n(x,y)的原點為絕對座標,不跟隨物件移動。在控制點上點兩下可顯示其絕對座標。", - "accuracy": "如需較精確的模擬,請見「更多選項...」" - }, - "refIndexFnOrigin": "n(x,y)的原點", - "stepSize": "數值求解器步長", - "stepSizeInfo": "用歐拉法求解光線程函方程(eikonal ray equation)的步長 - 更多資訊詳見 'BaseGrinGlass.js' 中的 'step' 函數與原始碼文件。", - "intersectTol": "相交容忍度", - "symbolicBodyMerging": "符號式物體融合", - "symbolicBodyMergingInfo": { - "all": "本選項會套用至所有漸變折射率透光物。", - "impl": "本模擬器目前有兩種光線經過不同漸變折射率介質的實作 - 數值與符號(見 'BaseGrinGlass.js' 中的 'multRefIndex' 與 'devRefIndex' 函數)。", - "implNote": "數值的實作較快,但使用多個漸變折射率介質,且至少有一個介質的折射率沒有在整個平面上有定義時,無法在所有情況下正常運作(取決於具體情況)。相較之下,符號的實作較慢但在這種情況下仍可正常運作。" - } - }, - "CircleGrinGlass": { - "epsInfo": { - "units": "單位 - [長度]^2.", - "functions": "本數值容忍度被用於 'CircleGrinGlass.js' 中的 'isOutsideGlass', 'isInsideGlass' 以及 'isOnBoundary' 函數。" - } - }, - "GrinGlass": { - "epsInfo": { - "units": "單位 - [長度].", - "functions": "本數值容忍度被用於 'GrinGlass.js' 中的 'isOutsideGlass', 'isInsideGlass' 以及 'isOnBoundary' 函數。" - } - }, - "Aperature": { - "diameter": "直徑" - }, - "DiffractionGrating": { - "lineDensity": "線數/{{lengthUnit}}", - "customBrightness": "自訂亮度", - "customBrightnessInfo": "啟用時,繞射光的亮度將由一數值陣列來決定,對應到 m = 0, 1, -1, 2, -2, ...。這些數字為相對於入射光的亮度。陣列中沒有的數值將被設為 0。例如,\"1, 0.5, 0.5\" 表示 m=0 的光線與入射光的亮度相同,m=1 與 m=-1 的光線為入射光的一半,其他光線則被忽略。", - "slitRatio": "狹縫寬度 / 線間距", - "mirrored": "反射" - }, - "Ruler": { - "scaleInterval": "刻度間距" - }, - "Detector": { - "info": { - "P": "P: 能量流率(通量),單位為 B/s(見下文)。", - "Fperp": "F⊥: 垂直動量流率,單位為 (B/s)/c。", - "Fpar": "F∥: 平行動量流率,單位為 (B/s)/c。", - "irradiance": "匯出的 CSV 中的輻照度單位為 (B/s)/L。", - "length": "L 是本模擬器中使用的任意長度單位。", - "B": "B 是輻射通量或光通量的任意單位,對應到「亮度」選項的單位:非朗伯光束為 B/L,點光源為 500B/360°。", - "s": "無因次因子 s 是「設定」->「顯示狀態欄」中顯示的「亮度尺度」,當「光線密度」高於某個閾值時為 1,否則與「光線密度」成正比。", - "truncation": "如果某些光線在內反射的無窮級數中被截斷,則總截斷量將顯示為誤差估計。" - }, - "irradMap": "輻照度圖", - "binSize": "組距", - "exportData": "匯出數據" - }, - "TextLabel": { - "textHere": "在此輸入文字", - "fontSize": "字型大小", - "font": "字型", - "fontStyle": "樣式", - "fontStyles": { - "normal": "正常", - "bold": "粗體", - "italic": "斜體", - "boldItalic": "粗斜體", - "oblique": "傾斜", - "boldOblique": "粗傾斜" - }, - "alignment": "對齊", - "alignments": { - "left": "左", - "center": "中", - "right": "右" - }, - "smallCaps": "小型大寫", - "angle": "角度" - }, - "LineArrow": { - "arrow": "前向箭頭", - "backArrow": "後向箭頭" - }, - "Drawing": { - "finishDrawing": "停止繪圖" - }, - "ModuleObj": { - "module": "模組", - "demodulize": "取消模組化" - }, - "Handle": { - "handle": "控制桿", - "transformation": "變換", - "transformations": { - "translation": "平移", - "xTranslation": "X 平移", - "yTranslation": "Y 平移", - "rotation": "旋轉", - "scaling": "縮放" - } - }, - "CropBox": { - "title": "匯出", - "cropBoxSize": "剪取框大小", - "format": "格式", - "width": "寬度", - "rayCountLimit": "光線數量上限", - "svgWarning": "匯出為SVG:不支援混色與相對折射率低於1的情形。", - "rayCountWarning": "目前場景中的光線數量大於光線數量上限。您可能需要將剪取框選項中的光線數量上限調高。" - } - }, - "saveModal": { - "title": "儲存", - "description": { - "autoSync": "您可使用設定->自動同步網址而不必存成檔案。", - "rename": "按「重新命名」會改變標題但不會存成檔案。", - "contribute": "您可以考慮[貢獻新的項目](/contributing/gallery)到[「作品集」](/gallery)中。" - }, - "fileName": "名稱", - "rename": "重新命名" - }, - "moduleModal": { - "title": "匯入模組", - "makeCustomModules": "製作自訂模組", - "conflict": "場景中已有一個同名但不相同的模組。您可以指定新的名稱,或保留相同名稱以取代原模組。" - }, - "languageModal": { - "title": "語言", - "translatedFraction": "已翻譯", - "helpTranslate": "協助我們翻譯本程式" - }, - "generalWarnings": { - "shareLinkTooLong": "本網址過長,在部分平臺上可能無法正常運作。建議改用「儲存」並分享檔案。", - "autoSyncUrlTooLarge": "本場景過大,無法與網址同步。請自行儲存場景。", - "identicalObjects": "場景中有兩個完全相同的光學元件完全重合。這可能會導致非預期的行為。", - "brightnessInconsistent": "有至少兩個光源的亮度以不一致的比例達到飽和。這可能會導致探測器的讀數與色彩渲染錯誤。請提高光線密度或降低光源亮度。" - }, - "statusBox": { - "rayCount": "光線片段數量", - "totalTruncation": "被截斷的亮度", - "brightnessScale": "亮度尺度", - "timeElapsed": "花費時間", - "forceStopped": "已強制終止。", - "mouseCoordinates": "滑鼠座標" - }, - "footer": { - "processing": "處理中…… 按此處以終止。", - "helpPopup": { - "constrainedDragging": { - "title": "限制拖曳行為", - "description": "拖曳物件時,按住 Shift 可限制於水平或垂直移動;按住 Ctrl 可複製物件。建立線型物件或拖曳其端點時,按住 Shift 可鎖定角度或吸附至 0°、45°、90°;按住 Ctrl 可對於中心點旋轉或縮放。" - }, - "groupRotateScale": { - "title": "群組、旋轉及縮放物件", - "description": "按住 Ctrl,點擊多個控制點(如端點),並點擊空白處可將這些點群組並建立控制桿。拖曳控制桿(或按方向鍵)可平移群組;Shift+拖曳可限制於水平或垂直移動;Ctrl+拖曳可旋轉群組;Ctrl+Shift+拖曳可縮放群組。可移動「+」設定旋轉或縮放中心。點擊控制桿並按 Ctrl+D 可複製群組;按 Delete 可解散群組。" - }, - "editCoordinates": { - "title": "直接編輯座標", - "description": "對控制點(如端點)點兩下或按右鍵,輸入 (x,y) 座標,然後按 Enter。" - }, - "keyboardShortcuts": { - "title": "鍵盤快速鍵", - "description": "當一物件在被選取的狀態(被點擊)時,按方向鍵可移動物件;按 Ctrl+D 可複製物件;按 Delete 可刪除物件。" - }, - "contactUs": { - "title": "聯絡我們", - "description": "建議使用 GitHub 上的 [Discussions](/github/discussions) 或 [Issues](/github/issues) 功能(請使用英文)。若您對 GitHub 不熟,也可發送電子郵件至 [ray-optics@phydemo.app](/email)(可使用中文)。", - "contribute": "也歡迎直接進行貢獻(見[貢獻指南](/contributing))。" - } + "saveButton": "儲存", + "cancelButton": "取消", + "defaultOption": "預設", + "closeButton": "關閉" + }, + "file": { + "title": "檔案", + "undo": { + "title": "復原" + }, + "redo": { + "title": "重做" + }, + "reset": { + "title": "重設" + }, + "save": { + "title": "儲存" + }, + "open": { + "title": "開啟", + "description": "開啟檔案或背景圖片。背景圖片將從座標原點顯示。(或拖放檔案)" + }, + "export": { + "title": "匯出為PNG/SVG" + }, + "copyLink": { + "title": "複製分享連結", + "description": "複製並前往本場景的專屬網址,以便分享連結(可考慮透過短網址工具)。另見設定->自動同步網址。" + }, + "viewGallery": { + "title": "瀏覽作品集", + "description": "前往「作品集」頁面以載入範例。" + } + }, + "settings": { + "title": "設定", + "more": "更多選項", + "rayDensity": { + "title": "光線密度", + "description": "決定從光束與點光源射出的光線數量。這也會影響到像的偵測與顏色渲染的準確性。" + }, + "layoutAids": { + "title": "排版輔助", + "showGrid": "格線", + "snapToGrid": "對齊格線", + "lockObjs": "鎖定物件" + }, + "gridSize": { + "title": "格線大小" + }, + "observerSize": { + "title": "觀察者大小" + }, + "lengthScale": { + "title": "長度尺度", + "description": "如果將預設的長度單位視為常見的物理單位(例如毫米)時,模擬的物理系統看起來太小或太大,則可以使用此比例來縮放場景中的外觀(例如線寬)。" + }, + "zoom": { + "title": "縮放" + }, + "language": { + "title": "語言" + }, + "autoSyncUrl": { + "title": "自動同步網址", + "description": "啟用時,網址會隨著場景自動更新,而不必持續手動儲存場景。如需設定標題,請用檔案->儲存->重新命名。" + }, + "showJsonEditor": { + "title": "顯示 JSON 編輯器", + "description": "顯示表達場景原始碼的 JSON 編輯器。在建立自訂模組時需要使用(見工具->其他->匯入模組->建立自訂模組)。" + }, + "showStatusBox": { + "title": "顯示狀態方塊", + "description": "顯示狀態方塊,其中包含滑鼠座標,效能資訊,以及被截斷的亮度(光線在內反射的無窮級數中被截斷的總亮度)。" + }, + "showHelpPopups": { + "title": "顯示提示泡泡", + "description": "決定滑鼠移到按鈕上方時是否顯示提示泡泡(須重新載入網頁以套用變更)" + }, + "advancedHelp": "進階說明詳見右下角的說明圖示。" + }, + "objBar": { + "showAdvanced": { + "title": "更多選項…" + }, + "applyToAll": { + "title": "套用全部" + }, + "duplicate": { + "title": "複製" + }, + "delete": { + "title": "刪除" + }, + "unselect": { + "title": "取消選取", + "description": "取消選取此物件(在空白處按滑鼠右鍵也有相同的功能)" + } + }, + "sceneObjs": { + "common": { + "lengthUnitInfo": "本模擬器中的長度單位(除波長外)為一個任意單位。您可將其視為任何物理單位(例如毫米),只要在整個模擬中保持一致。如果單位看起來太小或太大,請調整設定->長度尺度。", + "brightness": "亮度", + "brightnessInfo": { + "rayDensity": "只在「光線密度」夠高時才有作用。", + "rayDensitySlider": "如需改變射出的光線數量,請調整全域性的「光線密度」滑桿。" + }, + "wavelength": "波長", + "emisAngle": "發射角", + "random": "隨機", + "lambert": "朗伯", + "focalLength": "焦距", + "eqnInfo": { + "constants": "支援的常數", + "operators": "支援的運算子", + "functions": "支援的函數" + }, + "imageDetectionWarning": "本工具不支援像的偵測。", + "nonSimulateColorsWarning": "本工具只在「模擬色彩」模式下運作。" + }, + "Beam": { + "imageDetectionWarning": "使用發散或隨機光束時,像的偵測可能無法正常運作。" + }, + "AngleSource": { + "symmetric": "對稱" + }, + "BaseFilter": { + "filter": "濾光", + "bandwidth": "帶寬", + "invert": "反向" + }, + "IdealMirror": { + "cartesianSign": "卡氏符號約定" + }, + "BeamSplitter": { + "transRatio": "透光率" + }, + "BaseGlass": { + "refIndex": "折射率", + "refIndexInfo": { + "relative": "於另一透光物內部時為相對值", + "effective": "如需模擬此物件之(絕對)折射率為 n₁,但其位於折射率為 n₀ 之另一透光物內部的情形,則此處折射率應設為 n₁/n₀ 。在更複雜的組合中,若多個透光物互相重疊,則重疊區域之等效折射率為個別折射率之乘積。" + }, + "cauchyCoeff": "柯西係數" + }, + "SphericalLens": { + "defBy": { + "radiiOfCurvature": "曲率半徑", + "focalDistances": "前/後焦距" + } + }, + "BaseGrinGlass": { + "refIndexFnInfo": { + "constants": "支援的常數", + "operators": "支援的運算子", + "functions": "支援的函數", + "lambda": "如需模擬色散,請用參數 {{lambda}} 代表真空中波長,單位為奈米。", + "diff": "僅支援可微函數。", + "origin": "n(x,y)的原點為絕對座標,不跟隨物件移動。在控制點上點兩下可顯示其絕對座標。", + "accuracy": "如需較精確的模擬,請見「更多選項...」" + }, + "refIndexFnOrigin": "n(x,y)的原點", + "stepSize": "數值求解器步長", + "stepSizeInfo": "用歐拉法求解光線程函方程(eikonal ray equation)的步長 - 更多資訊詳見 'BaseGrinGlass.js' 中的 'step' 函數與原始碼文件。", + "intersectTol": "相交容忍度", + "symbolicBodyMerging": "符號式物體融合", + "symbolicBodyMergingInfo": { + "all": "本選項會套用至所有漸變折射率透光物。", + "impl": "本模擬器目前有兩種光線經過不同漸變折射率介質的實作 - 數值與符號(見 'BaseGrinGlass.js' 中的 'multRefIndex' 與 'devRefIndex' 函數)。", + "implNote": "數值的實作較快,但使用多個漸變折射率介質,且至少有一個介質的折射率沒有在整個平面上有定義時,無法在所有情況下正常運作(取決於具體情況)。相較之下,符號的實作較慢但在這種情況下仍可正常運作。" + } + }, + "CircleGrinGlass": { + "epsInfo": { + "units": "單位 - [長度]^2.", + "functions": "本數值容忍度被用於 'CircleGrinGlass.js' 中的 'isOutsideGlass', 'isInsideGlass' 以及 'isOnBoundary' 函數。" + } + }, + "GrinGlass": { + "epsInfo": { + "units": "單位 - [長度].", + "functions": "本數值容忍度被用於 'GrinGlass.js' 中的 'isOutsideGlass', 'isInsideGlass' 以及 'isOnBoundary' 函數。" + } + }, + "Aperature": { + "diameter": "直徑" + }, + "DiffractionGrating": { + "lineDensity": "線數/{{lengthUnit}}", + "customBrightness": "自訂亮度", + "customBrightnessInfo": "啟用時,繞射光的亮度將由一數值陣列來決定,對應到 m = 0, 1, -1, 2, -2, ...。這些數字為相對於入射光的亮度。陣列中沒有的數值將被設為 0。例如,\"1, 0.5, 0.5\" 表示 m=0 的光線與入射光的亮度相同,m=1 與 m=-1 的光線為入射光的一半,其他光線則被忽略。", + "slitRatio": "狹縫寬度 / 線間距", + "mirrored": "反射" + }, + "Ruler": { + "scaleInterval": "刻度間距" + }, + "Detector": { + "info": { + "P": "P: 能量流率(通量),單位為 B/s(見下文)。", + "Fperp": "F⊥: 垂直動量流率,單位為 (B/s)/c。", + "Fpar": "F∥: 平行動量流率,單位為 (B/s)/c。", + "irradiance": "匯出的 CSV 中的輻照度單位為 (B/s)/L。", + "length": "L 是本模擬器中使用的任意長度單位。", + "B": "B 是輻射通量或光通量的任意單位,對應到「亮度」選項的單位:非朗伯光束為 B/L,點光源為 500B/360°。", + "s": "無因次因子 s 是「設定」->「顯示狀態欄」中顯示的「亮度尺度」,當「光線密度」高於某個閾值時為 1,否則與「光線密度」成正比。", + "truncation": "如果某些光線在內反射的無窮級數中被截斷,則總截斷量將顯示為誤差估計。" + }, + "irradMap": "輻照度圖", + "binSize": "組距", + "exportData": "匯出數據" + }, + "TextLabel": { + "textHere": "在此輸入文字", + "fontSize": "字型大小", + "font": "字型", + "fontStyle": "樣式", + "fontStyles": { + "normal": "正常", + "bold": "粗體", + "italic": "斜體", + "boldItalic": "粗斜體", + "oblique": "傾斜", + "boldOblique": "粗傾斜" + }, + "alignment": "對齊", + "alignments": { + "left": "左", + "center": "中", + "right": "右" + }, + "smallCaps": "小型大寫", + "angle": "角度" + }, + "LineArrow": { + "arrow": "前向箭頭", + "backArrow": "後向箭頭" + }, + "Drawing": { + "finishDrawing": "停止繪圖" + }, + "ModuleObj": { + "module": "模組", + "demodulize": "取消模組化" + }, + "Handle": { + "handle": "控制桿", + "transformation": "變換", + "transformations": { + "translation": "平移", + "xTranslation": "X 平移", + "yTranslation": "Y 平移", + "rotation": "旋轉", + "scaling": "縮放" + } + }, + "CropBox": { + "title": "匯出", + "cropBoxSize": "剪取框大小", + "format": "格式", + "width": "寬度", + "rayCountLimit": "光線數量上限", + "svgWarning": "匯出為SVG:不支援混色與相對折射率低於1的情形。", + "rayCountWarning": "目前場景中的光線數量大於光線數量上限。您可能需要將剪取框選項中的光線數量上限調高。" + } + }, + "saveModal": { + "title": "儲存", + "description": { + "autoSync": "您可使用設定->自動同步網址而不必存成檔案。", + "rename": "按「重新命名」會改變標題但不會存成檔案。", + "contribute": "您可以考慮[貢獻新的項目](/contributing/gallery)到[「作品集」](/gallery)中。" + }, + "fileName": "名稱", + "rename": "重新命名" + }, + "moduleModal": { + "title": "匯入模組", + "makeCustomModules": "製作自訂模組", + "conflict": "場景中已有一個同名但不相同的模組。您可以指定新的名稱,或保留相同名稱以取代原模組。" + }, + "languageModal": { + "title": "語言", + "translatedFraction": "已翻譯", + "helpTranslate": "協助我們翻譯本程式" + }, + "generalWarnings": { + "shareLinkTooLong": "本網址過長,在部分平臺上可能無法正常運作。建議改用「儲存」並分享檔案。", + "autoSyncUrlTooLarge": "本場景過大,無法與網址同步。請自行儲存場景。", + "identicalObjects": "場景中有兩個完全相同的光學元件完全重合。這可能會導致非預期的行為。", + "brightnessInconsistent": "有至少兩個光源的亮度以不一致的比例達到飽和。這可能會導致探測器的讀數與色彩渲染錯誤。請提高光線密度或降低光源亮度。" + }, + "statusBox": { + "rayCount": "光線片段數量", + "totalTruncation": "被截斷的亮度", + "brightnessScale": "亮度尺度", + "timeElapsed": "花費時間", + "forceStopped": "已強制終止。", + "mouseCoordinates": "滑鼠座標" + }, + "footer": { + "processing": "處理中…… 按此處以終止。", + "helpPopup": { + "constrainedDragging": { + "title": "限制拖曳行為", + "description": "拖曳物件時,按住 Shift 可限制於水平或垂直移動;按住 Ctrl 可複製物件。建立線型物件或拖曳其端點時,按住 Shift 可鎖定角度或吸附至 0°、45°、90°;按住 Ctrl 可對於中心點旋轉或縮放。" + }, + "groupRotateScale": { + "title": "群組、旋轉及縮放物件", + "description": "按住 Ctrl,點擊多個控制點(如端點),並點擊空白處可將這些點群組並建立控制桿。拖曳控制桿(或按方向鍵)可平移群組;Shift+拖曳可限制於水平或垂直移動;Ctrl+拖曳可旋轉群組;Ctrl+Shift+拖曳可縮放群組。可移動「+」設定旋轉或縮放中心。點擊控制桿並按 Ctrl+D 可複製群組;按 Delete 可解散群組。" + }, + "editCoordinates": { + "title": "直接編輯座標", + "description": "對控制點(如端點)點兩下或按右鍵,輸入 (x,y) 座標,然後按 Enter。" + }, + "keyboardShortcuts": { + "title": "鍵盤快速鍵", + "description": "當一物件在被選取的狀態(被點擊)時,按方向鍵可移動物件;按 Ctrl+D 可複製物件;按 Delete 可刪除物件。" + }, + "contactUs": { + "title": "聯絡我們", + "description": "建議使用 GitHub 上的 [Discussions](/github/discussions) 或 [Issues](/github/issues) 功能(請使用英文)。若您對 GitHub 不熟,也可發送電子郵件至 [ray-optics@phydemo.app](/email)(可使用中文)。", + "contribute": "也歡迎直接進行貢獻(見[貢獻指南](/contributing))。" + } + } } - } -} \ No newline at end of file +} diff --git a/scripts/buildInlineLocaleData.mjs b/scripts/buildInlineLocaleData.mjs index 73d893c3..fa9b3ea6 100644 --- a/scripts/buildInlineLocaleData.mjs +++ b/scripts/buildInlineLocaleData.mjs @@ -37,7 +37,9 @@ export default function() { // See if main.json and simulator.json both exist in the language directory. Otherwise, skip this language. const mainPath = path.join(__dirname, '../locales', lang, 'main.json'); const simulatorPath = path.join(__dirname, '../locales', lang, 'simulator.json'); - if (!fs.existsSync(mainPath) || !fs.existsSync(simulatorPath)) { + if (!fs.existsSync(mainPath) || !fs.existsSync(simulatorPath) || + Object.keys(JSON.parse(fs.readFileSync(mainPath, 'utf8'))).length === 0 || + Object.keys(JSON.parse(fs.readFileSync(simulatorPath, 'utf8'))).length === 0) { continue; } diff --git a/scripts/buildWebpages.mjs b/scripts/buildWebpages.mjs index ddbbc2ac..aeb55368 100644 --- a/scripts/buildWebpages.mjs +++ b/scripts/buildWebpages.mjs @@ -171,7 +171,9 @@ for (const lang of langs) { const simulatorPath = path.join(__dirname, '../locales', lang, 'simulator.json'); const galleryPath = path.join(__dirname, '../locales', lang, 'gallery.json'); const modulesPath = path.join(__dirname, '../locales', lang, 'modules.json'); - if (!fs.existsSync(mainPath) || !fs.existsSync(simulatorPath)) { + if (!fs.existsSync(mainPath) || !fs.existsSync(simulatorPath) || + Object.keys(JSON.parse(fs.readFileSync(mainPath, 'utf8'))).length === 0 || + Object.keys(JSON.parse(fs.readFileSync(simulatorPath, 'utf8'))).length === 0) { continue; }