"
- },
- "open": {
- "message": "Öffnen"
- },
- "layoutaids": {
- "incomplete": true,
- "message": "Layout Aids"
- },
- "lockObjs": {
- "message": "Objekte sperren"
- },
- "showGrid": {
- "message": "Raster"
- },
- "snapToGrid": {
- "message": "Anrasten"
- },
- "snaptogrid": {
- "message": "Anrasten"
- },
- "length_unit_popover": {
- "incomplete": true,
- "message": "The unit of length used in this simulator (except for wavelengths) is an arbitrary unit, which can be interpreted as any physical unit (e.g. millimeters) as long as it is consistent throughout the simulation. If the unit appears too small or too large, please adjust Settings -> Length Scale."
- },
- "lengthScale": {
- "incomplete": true,
- "message": "Length ScaleBeta"
- },
- "lengthScale_popover": {
- "incomplete": true,
- "message": "If the default unit of length is too small or too large to model a physical system when interpreted as a common physical unit (e.g. millimeters), this factor can be used to scale the appearance (e.g. line widths) in the scene."
- },
- "brightness": {
- "message": "Helligkeit"
- },
- "wavelength": {
- "message": "Wellenlänge (nm)"
- },
- "dichroic": {
- "message": "Dichroitische"
- },
- "filter": {
- "message": "Filter"
- },
- "bandwidth": {
- "message": "Bandbreite (nm)"
- },
- "invert": {
- "incomplete": true,
- "message": "Invert"
- },
- "emisAngle": {
- "message": "Emissionswinkel (°)"
- },
- "mirrored": {
- "incomplete": true,
- "message": "Mirrored"
- },
- "lineDensity": {
- "incomplete": true,
- "message": "Lines/mm"
- },
- "slitRatio": {
- "incomplete": true,
- "message": "Slit width / line spacing"
- },
- "customBrightness": {
- "incomplete": true,
- "message": "Custom Brightness"
- },
- "customBrightness_note_popover": {
- "incomplete": true,
- "message": "When on, the brightnesses of the diffracted rays are customized by an array of numbers corresponding to m = 0, 1, -1, 2, -2, .... The number is to be normalized to the brightness of the incident ray. The values not in the array are set to 0. For example, \"1, 0.5, 0.5\" means the m=0 ray has the same brightness as the incident ray, the m=1 and m=-1 rays have half the brightness, and all other rays are ignored."
- },
- "symmetric": {
- "message": "symmetrisch"
- },
- "eqn_note": {
- "incomplete": true,
- "message": "
Supported constants: pi e
Supported operators: + - * / ^
Supported functions: sqrt sin cos tan sec csc cot sinh cosh tanh log exp arcsin arccos arctan arcsinh arccosh arctanh floor round ceil trunc sgn max min abs
Supported functions: sqrt sin cos tan sec csc cot sinh cosh tanh log arcsin arccos arctan
To simulate chromatic dispersion, use parameter lambda for the vacuum wavelength in nanometers.Beta
Only supports differentiable functions.
The origin of n(x,y) is in the absolute coordinates and does not move with the object. You may double-click a control-point to inspect its absolute coordinates.
For a more accurate simulation, see \"More options...\"
This toggle applies to all GRIN objects in the simulation.
This simulator has currently two implementations of light propagation between different mediums, for GRIN objects - numerical and symbolic (see 'multRefIndex' and 'devRefIndex' functions in 'CircleGrinGlass.js').
The numerical implementation is faster but doesn't always work properly (depending on the specific case) in scenarios when used with more than one GRIN object, such that at least one of them has a refractive index function which is not defined in the entire plane, while the symbolic implementation is slower but robust to such problems.
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.
Step size of Euler's method for solving the eikonal ray equation - see 'step' function and documentation inside the 'CircleGrinGlass.js' file, for more information.
This numerical tolerance is used in the functions 'isOnBoundary' and 'countIntersections', inside the 'GrinGlass.js' file.
"
- },
- "cauchyCoeff": {
- "message": "Cauchy Koeffizient"
- },
- "transRatio": {
- "message": "Transmissionsgrad"
- },
- "applytoall": {
- "message": "Alle anwenden"
- },
- "duplicate": {
- "message": "Duplizieren"
- },
- "delete": {
- "message": "Löschen"
- },
- "unselect": {
- "incomplete": true,
- "message": "Unselect"
- },
- "unselect_popover": {
- "incomplete": true,
- "message": "Unselect this object (Right-click on blank space has the same function.)"
- },
- "showadvanced": {
- "incomplete": true,
- "message": "More options..."
- },
- "processing": {
- "message": "In Bearbeitung... hier klicken, um zu stoppen."
- },
- "contribute": {
- "message": "Mitmachen"
- },
- "github": {
- "message": "GitHub"
- },
- "about": {
- "message": "Über"
- },
- "about_url": {
- "message": "https://phydemo.app/ray-optics/about"
- },
- "translate": {
- "message": "Helfen beim Übersetzen"
- },
- "translated": {
- "message": "übersetzt"
- },
- "undo_popover": {
- "message": "Letzte Aktion rückgängig machen. (Strg+Z)"
- },
- "redo_popover": {
- "message": "Letzte Aktion wieder herstellen. (Strg+Y)"
- },
- "reset_popover": {
- "message": "Alle Änderungen zurücksetzen."
- },
- "save_popover": {
- "message": "Die aktuelle Szene als Datei speichern."
- },
- "open_popover": {
- "message": "Öffnet eine existierende Datei oder ein Hintergrundbild. Das Hintergundbild wird relativ zum Koordinatenursprung angezeigt. (Oder Datei hierher ziehen.)"
- },
- "get_link_popover": {
- "incomplete": true,
- "message": "Copy and go to the direct URL for the current scene, which can be used for sharing (possibly via a URL shortener). Also see Settings -> Auto sync URL."
- },
- "get_link_warning": {
- "message": "Die URL ist zu lang für einige Platformen. Es kann nötig sein die Datei zu \"Speichern\" und zu teilen."
- },
- "export_svg_warning": {
- "message": "Export als SVG-Datei. Farbmischungen und relative Brechungsindizes kleiner 1 sind nicht unterstützt."
- },
- "export_ray_count_warning": {
- "incomplete": true,
- "message": "The current number of rays in the scene is larger than the ray count limit. You may need to increase the ray count limit in the Crop Box options."
- },
- "view_gallery_popover": {
- "message": "Zur Galerie-Seite wechseln und ein Beispiel laden."
- },
- "tool_SingleRay_popover": {
- "message": "Ein einzelner Lichtstrahl, der durch zwei Punkte definiert ist. (Ziehen oder Klicken zum Erzeugen. Der erste Punkt ist die Quelle, die in Richtung des zweiten Punkts zielt.)"
- },
- "tool_Beam_popover": {
- "incomplete": true,
- "message": "A parallel or divergent beam of rays emerges from a line segment, with density controlled by the 'Ray density' slider. (Drag or click to create.)"
- },
- "tool_PointSource_popover": {
- "message": "Strahlen entspringen aus einem einzigen Punkt, wobei die Zahl durch den Schieberegler \"Strahl-Anzahldichte\" eingestellt wird. (Klicken zum Erzeugen.)"
- },
- "tool_AngleSource_popover": {
- "message": "Punktquelle mit definiertem Emissions-Winkel."
- },
- "tool_Mirror_popover": {
- "message": "Simulieren Sie die Reflexion von Licht auf einem Spiegel. (Ziehen oder Klicken zum Erzeugen.)"
- },
- "tool_ArcMirror_popover": {
- "message": "Ein Spiegel bestehend aus einem Kreisbogen, definiert durch drei Punkte. (Ziehen oder Klicken zum Erzeugen. Die ersten 2 Punkte definieren die Länge des Bogens, der letzte die Bogenkrümmung.)"
- },
- "tool_ParabolicMirror_popover": {
- "message": "Ein parabolischer Spiegel, definiert durch drei Punkte. (Ziehen oder Klicken zum Erzeugen.)"
- },
- "tool_CustomMirror_popover": {
- "message": "Ein Spiegel dessen Form durch eine Gleichung y = f(x) bestimmt ist, wobei (x,y) transformierte Koordinaten sind mit den Randpunkten (-1,0) und (1,0). (Ziehen oder Klicken zum Erzeugen.)"
- },
- "tool_BeamSplitter_popover": {
- "message": "Ein Spiegel, der einen Teil der Lichtstrahlen durchlässt. (Ziehen oder Klicken zum Erzeugen.)"
- },
- "tool_IdealMirror_popover": {
- "message": "Der idealisierte \"gekrümmte\" Spiegel, der die Spiegelgleichung (1/p + 1/q = 1/f) erfüllt. Die Brennweite kann direkt eingestellt werden. (Ziehen oder Klicken zum Erzeugen.)"
- },
- "tool_PlaneGlass_popover": {
- "message": "Simulieren Sie die Brechung und Reflexion von Licht auf einer Oberfläche. (Ziehen oder Klicken zum Erzeugen.)"
- },
- "tool_CircleGlass_popover": {
- "message": "Kreisförmiger Glaskörper, definiert durch Mittelpunkt und einen Punkt auf dem Umfang. (Ziehen oder Klicken zum Erzeugen.)"
- },
- "tool_CircleGrinGlass_popover": {
- "incomplete": true,
- "message": "Glass with a custom refractive index function n(x,y) and a circular boundary. (Drag or click to create.)"
- },
- "tool_Glass_popover": {
- "message": "Beliebig gefortmer Glaskörper aus Liniensegmenten und Kreisbögen konstruiert. (Klicken, um ein Liniensegment zu erzeugen; Ziehen, um einen Kreisbogen zu erzeugen; auf den Startpunkt klicken, um die Form abzuschließen.)"
- },
- "tool_GrinGlass_popover": {
- "incomplete": true,
- "message": "Glass with a custom refractive index function n(x,y) and a polygonal boundary. WARNING: Only simple polygons are supported, otherwise the behavior is unpredictable. (Click to create a segment, click on the starting point when finish drawing.)"
- },
- "tool_IdealLens_popover": {
- "message": "Eine ideale Linse, die die Linsengleichung (1/p + 1/q = 1/f) erfüllt. Die Brennweite kann direkt eingestellt werden. (Ziehen oder Klicken zum Erzeugen.)"
- },
- "tool_SphericalLens_popover": {
- "message": "Eine sphärische Linse. (Klicken zum Erzeugen.)"
- },
- "tool_CustomGlass_popover": {
- "message": "Glaskörper mit einer Form, welche durch eine benutzerspezifische Ungleichung f(x) < y < g(x) definiert ist, wobei (x,y) trransformierte Koordinaten sind mit den Randpunkten (-1,0) und (1,0). (Ziehen oder Klicken zum Erzeugen.)"
- },
- "tool_Blocker_popover": {
- "message": "Ein linienförmiger Absorber, der die einfallenden Strahlen absorbiert. (Ziehen oder Klicken zum Erzeugen.)"
- },
- "tool_Aperture_popover": {
- "incomplete": true,
- "message": "A pair of light blockers which absorbs the incident rays. The size of the hole can be adjusted symmetrically. (Drag or click the two endpoints to create.)"
- },
- "tool_CircleBlocker_popover": {
- "message": "Ein kreisförmiger Absorber. (Ziehen oder Klicken zum Erzeugen.)"
- },
- "tool_DiffractionGrating_popover": {
- "incomplete": true,
- "message": "A diffraction grating that splits light at an angle depending on wavelength. Warning: The intensities of diffracted rays may not be accurate. (Drag or click to create.)"
- },
- "tool_Ruler_popover": {
- "message": "Ein Lineal von einem Nullpunkt bis zu einem anderen Punkt. (Ziehen oder Klicken zum Erzeugen.)"
- },
- "tool_Protractor_popover": {
- "message": "Ein Winkelmesser, der vom Zentrum und einem anderen Punkt für die Nullrichtung definiert ist. Die Skala ist in Grad. (Ziehen oder Klicken zum Erzeugen.)"
- },
- "tool_Detector_popover": {
- "message": "Ein Messwerkzeug für Energieflussrate (P), der Rate des senkrechten Impulsflusses (F∩) und der Rate des parallelen Impulsflusses (F∥) durch ein Segment. (Ziehen oder Klicken zum Erzeugen.) Die Einheiten sind willkürlich."
- },
- "tool_Detector_info_popover": {
- "incomplete": true,
- "message": "
P: The rate of energy flow (flux) in B/s (see below).
F⊥: The rate of perpendicular momentum flow in (B/s)/c.
F∥: The rate of parallel momentum flow in (B/s)/c.
The irradiance in the exported CSV is in (B/s)/L.
L is the arbitrary unit of length used in this simulator.
B is an arbitrary unit of radiant flux or luminous flux, corresponding to the unit of the \"Brightness\" option being B/L for non-Lambertian beams and 500B/360° for point sources.
The dimensionless factor s is the \"Brightness Scale\" shown in Settings -> Show status box, which equals 1 when \"Ray Density\" is above some threshold and proportional to \"Ray Density\" otherwise.
If some rays are truncated in the infinite series of internal reflection, the total truncation is shown as error estimates.
"
- },
- "tool_TextLabel_popover": {
- "message": "Ein Text-Label."
- },
- "tool_LineArrow_popover": {
- "incomplete": true,
- "message": "A line segment or arrow. (Drag or click to create.)"
- },
- "tool_Drawing_popover": {
- "incomplete": true,
- "message": "A freehand drawing tool. (Drag to draw.)"
- },
- "tool__popover": {
- "message": "Ziehen um die Ansicht zu Verschieben. (Rechte Maustaste hat die gleiche Funktion.)"
- },
- "mode_rays_popover": {
- "message": "In dieser Ansicht werden die Lichtstrahlen angezeigt. Wenn die \"Strahl-Anzahldichte\" hoch ist, scheinen sie kontinuierlich zu sein."
- },
- "mode_extended_popover": {
- "message": "In dieser Ansicht werden die Lichtstrahlen als auch ihre Verlängerungen angezeigt. Orange bezeichnet die Rückwärtsverlängerung, während Grau vorwärts deutet. Wenn 'Farben simulieren' aktiv ist, werden die Quellfarben verwendet und stattdessen durch Strichelung unterschieden."
- },
- "mode_images_popover": {
- "message": "In dieser Ansicht wird die Position aller Bilder angezeigt. Gelb bedeutet echtes Bild, orange steht für virtuelle Bilder und grau (nicht in diesem Bild dargestellt) bedeutet virtuelles Objekt. Beachten Sie, dass einige Bilder nicht erkannt werden können, wenn die \"Strahl-Anzahldichte\" nicht hoch genug ist. Wenn 'Farben simulieren' aktiv ist, werden Bilder in der Quellfarbe angezeigt, und stattdessen nach Punktgröße unterschieden."
- },
- "mode_observer_popover": {
- "message": "In dieser Ansicht werden die Strahlen und Bilder von der Beobachterperspektive angezeigt. Der blaue Punkt ist der Beobachter. Alle Strahlen, die ihn kreuzen, gelten als \"wird beobachtet\". Der Beobachter weiß nicht, wo die Strahlen tatsächlich beginnen, 'denkt' aber, dass sie an einem Punkt beginnen, an dem sie sich schneiden. Die Strahlen sind blau und die Punkte gelb (real) oder orange (virtuell) dargestellt. (Ziehen Sie den großen blauen Kreis um den Beobachter zu bewegen.) Wenn 'Farben simulieren' aktiv ist, werden die Strahlen mit den Quellfarben dargestellt."
- },
- "simulateColors_popover": {
- "incomplete": true,
- "message": "Simulate colors (wavelengths) of light sources, mixture of colors, color filtering of blockers and mirrors, and chromatic dispersion of glasses. You can set those parameters for those objects when selected. To simulate color spectra, overlap rays with different wavelengths. The colors shown on the screen are only rough approximations, and can be very inaccurate when 'Ray density' is too high or too low."
- },
- "rayDensity_popover": {
- "incomplete": true,
- "message": "Determines the number of rays to be emitted by beams and point sources. This also affects the accuracy of image detection and color rendering."
- },
- "showGrid_popover": {
- "message": "Sichtbarkeit des Gitters."
- },
- "grid_popover": {
- "message": "Objekte auf dem Gitter einrasten."
- },
- "lockObjs_popover": {
- "message": "Verschieben von Objekten sperren."
- },
- "zoom_popover": {
- "message": "Ansicht zoomen. (in Prozent)"
- },
- "help_popover": {
- "incomplete": true,
- "message": "Constrained dragging
When dragging an object, hold Shift to limit to horizontal/vertical; hold Ctrl to clone. When creating a line-shaped object or dragging its endpoints, hold Shift to lock the angle or snap to 0°, 45°, 90°; hold Ctrl to rotate/scale about its center.
Group, rotate, and scale objects
Hold Ctrl, click several control points (e.g. endpoints), then click empty space to group these points and create a handle. Drag the handle (or press arrow keys) to move the group; Shift+drag to limit to horizontal/vertical; Ctrl+drag to rotate, Ctrl+Shift+drag to scale. Drag the \"+\" to set rotation/scaling center. Click the handle and press Ctrl+D to duplicate the group; press Delete to ungroup.
Edit coordinates directly
Double-click or right-click the control point (e.g. endpoint) of the object, edit the (x,y) coordinates, then press Enter.
Keyboard shortcuts
When an object is selected (by clicking it), press arrow keys to move; Ctrl+D to duplicate; Delete key to delete.
"
- },
- "open": {
- "message": "Open"
- },
- "layoutaids": {
- "message": "Layout Aids"
- },
- "lockObjs": {
- "message": "Lock Objects"
- },
- "showGrid": {
- "message": "Grid"
- },
- "snapToGrid": {
- "message": "Snap to Grid"
- },
- "snaptogrid": {
- "message": "Snap to Grid"
- },
- "length_unit_popover": {
- "message": "The unit of length used in this simulator (except for wavelengths) is an arbitrary unit, which can be interpreted as any physical unit (e.g. millimeters) as long as it is consistent throughout the simulation. If the unit appears too small or too large, please adjust Settings -> Length Scale."
- },
- "lengthScale": {
- "message": "Length ScaleBeta"
- },
- "lengthScale_popover": {
- "message": "If the default unit of length is too small or too large to model a physical system when interpreted as a common physical unit (e.g. millimeters), this factor can be used to scale the appearance (e.g. line widths) in the scene."
- },
- "brightness": {
- "message": "Brightness"
- },
- "wavelength": {
- "message": "Wavelength (nm)"
- },
- "dichroic": {
- "message": "Dichroic"
- },
- "filter": {
- "message": "Filter"
- },
- "bandwidth": {
- "message": "Bandwidth (nm)"
- },
- "invert": {
- "message": "Invert"
- },
- "emisAngle": {
- "message": "Emission Angle (°)"
- },
- "mirrored": {
- "message": "Mirrored"
- },
- "lineDensity": {
- "message": "Lines/mm"
- },
- "slitRatio": {
- "message": "Slit width / line spacing"
- },
- "customBrightness": {
- "message": "Custom Brightness"
- },
- "customBrightness_note_popover": {
- "message": "When on, the brightnesses of the diffracted rays are customized by an array of numbers corresponding to m = 0, 1, -1, 2, -2, .... The number is to be normalized to the brightness of the incident ray. The values not in the array are set to 0. For example, \"1, 0.5, 0.5\" means the m=0 ray has the same brightness as the incident ray, the m=1 and m=-1 rays have half the brightness, and all other rays are ignored."
- },
- "symmetric": {
- "message": "Symmetric"
- },
- "eqn_note": {
- "message": "
Supported constants: pi e
Supported operators: + - * / ^
Supported functions: sqrt sin cos tan sec csc cot sinh cosh tanh log exp arcsin arccos arctan arcsinh arccosh arctanh floor round ceil trunc sgn max min abs
Supported functions: sqrt sin cos tan sec csc cot sinh cosh tanh log arcsin arccos arctan
To simulate chromatic dispersion, use parameter lambda for the vacuum wavelength in nanometers.Beta
Only supports differentiable functions.
The origin of n(x,y) is in the absolute coordinates and does not move with the object. You may double-click a control-point to inspect its absolute coordinates.
For a more accurate simulation, see \"More options...\"
This toggle applies to all GRIN objects in the simulation.
This simulator has currently two implementations of light propagation between different mediums, for GRIN objects - numerical and symbolic (see 'multRefIndex' and 'devRefIndex' functions in 'CircleGrinGlass.js').
The numerical implementation is faster but doesn't always work properly (depending on the specific case) in scenarios when used with more than one GRIN object, such that at least one of them has a refractive index function which is not defined in the entire plane, while the symbolic implementation is slower but robust to such problems.
If this object is to be simulated with (absolute) refractive index n₁, but is placed inside another glass with refractive index n₀, then you should set the refractive index to n₁/n₀ here. In more complicated cases that several glasses overlap together, the effective reflective index of the overlapping region equals the product of the reflective indices of individual ones.
Step size of Euler's method for solving the eikonal ray equation - see 'step' function and documentation inside the 'CircleGrinGlass.js' file, for more information.
This numerical tolerance is used in the functions 'isOnBoundary' and 'countIntersections', inside the 'GrinGlass.js' file.
"
- },
- "cauchyCoeff": {
- "message": "Cauchy coefficient"
- },
- "transRatio": {
- "message": "Transmission Ratio"
- },
- "applytoall": {
- "message": "Apply to All"
- },
- "duplicate": {
- "message": "Duplicate"
- },
- "delete": {
- "message": "Delete"
- },
- "unselect": {
- "message": "Unselect"
- },
- "unselect_popover": {
- "message": "Unselect this object (Right-click on blank space has the same function.)"
- },
- "showadvanced": {
- "message": "More options..."
- },
- "processing": {
- "message": "Processing... Click here to stop."
- },
- "contribute": {
- "message": "Contribute"
- },
- "github": {
- "message": "GitHub"
- },
- "about": {
- "message": "About"
- },
- "about_url": {
- "message": "https://phydemo.app/ray-optics/about"
- },
- "translate": {
- "message": "Help us translate this app"
- },
- "translated": {
- "message": "translated"
- },
- "undo_popover": {
- "message": "Undo last action. (Ctrl+Z)"
- },
- "redo_popover": {
- "message": "Redo last action. (Ctrl+Y)"
- },
- "reset_popover": {
- "message": "Reset all changes."
- },
- "save_popover": {
- "message": "Save the current scene as a file."
- },
- "open_popover": {
- "message": "Open an existing file or background image. The background image will be shown from the coordinate origin. (Or drop the file)"
- },
- "get_link_popover": {
- "message": "Copy and go to the direct URL for the current scene, which can be used for sharing (possibly via a URL shortener). Also see Settings -> Auto sync URL."
- },
- "get_link_warning": {
- "message": "The URL is too long that it may not work on some platforms. You may need to use \"Save\" and share the file instead."
- },
- "export_svg_warning": {
- "message": "Export to SVG: Color mixtures and relative refractive indices below 1 are not supported."
- },
- "export_ray_count_warning": {
- "message": "The current number of rays in the scene is larger than the ray count limit. You may need to increase the ray count limit in the Crop Box options."
- },
- "view_gallery_popover": {
- "message": "Go to the Gallery webpage to load an example."
- },
- "tool_SingleRay_popover": {
- "message": "A single ray of light defined by two points. (Drag or Click to create. The first point is the source, shooting toward the second point.)"
- },
- "tool_Beam_popover": {
- "message": "A parallel or divergent beam of rays emerges from a line segment, with density controlled by the 'Ray density' slider. (Drag or click to create.)"
- },
- "tool_PointSource_popover": {
- "message": "Rays emerge from a single point, with number controlled by the 'Ray density' slider. (Click to create.)"
- },
- "tool_AngleSource_popover": {
- "message": "Point source with a given emission angle."
- },
- "tool_Mirror_popover": {
- "message": "Simulate the reflection of light on a mirror. (Drag or click to create.)"
- },
- "tool_ArcMirror_popover": {
- "message": "A mirror whose shape is part of a circle, which is defined by three points. (Drag or click to create. The first 2 points define the gap between arc's edges, the last point defines the arc's size.)"
- },
- "tool_ParabolicMirror_popover": {
- "message": "A mirror whose shape is a parabola, which is defined by three points. (Drag or click to create.)"
- },
- "tool_CustomMirror_popover": {
- "message": "A mirror whose shape is defined by a custom equation y = f(x), where (x,y) is in the transformed coordinates in which the two control points are (-1,0) and (1,0). (Drag or click to create.)"
- },
- "tool_BeamSplitter_popover": {
- "message": "A mirror that transmits a percentage of incoming light. (Drag or click to create.)"
- },
- "tool_IdealMirror_popover": {
- "message": "The idealized 'curved' mirror which obeys exactly the mirror equation (1/p + 1/q = 1/f). The focal length can be set directly. (Drag or click to create.)"
- },
- "tool_PlaneGlass_popover": {
- "message": "Simulate the refraction and reflection of light on a surface. (Drag or click to create.)"
- },
- "tool_CircleGlass_popover": {
- "message": "Glass with a circle shape, defined by its center and a point on the surface. (Drag or click to create.)"
- },
- "tool_CircleGrinGlass_popover": {
- "message": "Glass with a custom refractive index function n(x,y) and a circular boundary. (Drag or click to create.)"
- },
- "tool_Glass_popover": {
- "message": "Glass with any shapes constructed from line segments and circular arcs. (Click to create a segment, drag to create an arc, click on the starting point when finish drawing.)"
- },
- "tool_GrinGlass_popover": {
- "message": "Glass with a custom refractive index function n(x,y) and a polygonal boundary. WARNING: Only simple polygons are supported, otherwise the behavior is unpredictable. (Click to create a segment, click on the starting point when finish drawing.)"
- },
- "tool_IdealLens_popover": {
- "message": "An ideal lens which obeys exactly the thin lens equation (1/p + 1/q = 1/f). The focal length can be set directly. (Drag or click to create.)"
- },
- "tool_SphericalLens_popover": {
- "message": "A spherical lens. (Click to create.)"
- },
- "tool_CustomGlass_popover": {
- "message": "Glass with the shape defined by a custom inequality f(x) < y < g(x), where (x,y) is in the transformed coordinates in which the two control points are (-1,0) and (1,0). (Drag or click to create.)"
- },
- "tool_Blocker_popover": {
- "message": "A line-segment light blocker which absorbs the incident rays. (Drag or click to create.)"
- },
- "tool_Aperture_popover": {
- "message": "A pair of light blockers which absorbs the incident rays. The size of the hole can be adjusted symmetrically. (Drag or click the two endpoints to create.)"
- },
- "tool_CircleBlocker_popover": {
- "message": "A circle light blocker which absorbs the incident rays. (Drag or click to create.)"
- },
- "tool_DiffractionGrating_popover": {
- "message": "A diffraction grating that splits light at an angle depending on wavelength. Warning: The intensities of diffracted rays may not be accurate. (Drag or click to create.)"
- },
- "tool_Ruler_popover": {
- "message": "A ruler from a point for zero and another point. (Drag or click to create.)"
- },
- "tool_Protractor_popover": {
- "message": "A protractor defined from the center and another point for the zero direction. The scale is in degrees. (Drag or click to create.)"
- },
- "tool_Detector_popover": {
- "message": "A tool for measuring the rate of energy flow (P), the rate of perpendicular momentum flow (F⊥), and the rate of parallel momentum flow (F∥) through a line segment. (Drag or click to create the line segment.) The units are arbitrary."
- },
- "tool_Detector_info_popover": {
- "message": "
P: The rate of energy flow (flux) in B/s (see below).
F⊥: The rate of perpendicular momentum flow in (B/s)/c.
F∥: The rate of parallel momentum flow in (B/s)/c.
The irradiance in the exported CSV is in (B/s)/L.
L is the arbitrary unit of length used in this simulator.
B is an arbitrary unit of radiant flux or luminous flux, corresponding to the unit of the \"Brightness\" option being B/L for non-Lambertian beams and 500B/360° for point sources.
The dimensionless factor s is the \"Brightness Scale\" shown in Settings -> Show status box, which equals 1 when \"Ray Density\" is above some threshold and proportional to \"Ray Density\" otherwise.
If some rays are truncated in the infinite series of internal reflection, the total truncation is shown as error estimates.
"
- },
- "tool_TextLabel_popover": {
- "message": "A text label."
- },
- "tool_LineArrow_popover": {
- "message": "A line segment or arrow. (Drag or click to create.)"
- },
- "tool_Drawing_popover": {
- "message": "A freehand drawing tool. (Drag to draw.)"
- },
- "tool__popover": {
- "message": "Drag to move the view. (Mouse right button drag has the same function.)"
- },
- "mode_rays_popover": {
- "message": "Show the rays. When the 'Ray density' is high, they appear to be continuous."
- },
- "mode_extended_popover": {
- "message": "Show both the rays and its extension. Orange indicates backward extensions, and gray indicates forward ones. When 'Simulate Colors' is on, they are shown in source colors and distinguished by dashing instead."
- },
- "mode_images_popover": {
- "message": "Show the position of all images. Yellow points indicate real images, orange indicates virtual images, and gray (none in this picture) indicates virtual objects. Note that some images cannot be detected if 'Ray density' is not high enough. When 'Simulate Colors' is on, they are shown in source colors and distinguished by dot sizes instead."
- },
- "mode_observer_popover": {
- "message": "Simulate the rays and images seen from some position. The blue circle is the observer. Any rays crossing it are considered to be 'observed'. The observer does not know where the rays actually begin, but may think they begin at some point(s) if they intersect there. The rays are shown in blue, and the points in yellow (real) or orange (virtual). (Drag the big blue dot to move the observer.) When 'Simulate Colors' is on, they are shown in source colors instead."
- },
- "simulateColors_popover": {
- "message": "Simulate colors (wavelengths) of light sources, mixture of colors, color filtering of blockers and mirrors, and chromatic dispersion of glasses. You can set those parameters for those objects when selected. To simulate color spectra, overlap rays with different wavelengths. The colors shown on the screen are only rough approximations, and can be very inaccurate when 'Ray density' is too high or too low."
- },
- "rayDensity_popover": {
- "message": "Determines the number of rays to be emitted by beams and point sources. This also affects the accuracy of image detection and color rendering."
- },
- "showGrid_popover": {
- "message": "Defines the visibility of the background grid."
- },
- "grid_popover": {
- "message": "Defines whether to snap to grid."
- },
- "lockObjs_popover": {
- "message": "Defines whether the objects can be moved or not."
- },
- "zoom_popover": {
- "message": "Zoom the view with percentage."
- },
- "help_popover": {
- "message": "Constrained dragging
When dragging an object, hold Shift to limit to horizontal/vertical; hold Ctrl to clone. When creating a line-shaped object or dragging its endpoints, hold Shift to lock the angle or snap to 0°, 45°, 90°; hold Ctrl to rotate/scale about its center.
Group, rotate, and scale objects
Hold Ctrl, click several control points (e.g. endpoints), then click empty space to group these points and create a handle. Drag the handle (or press arrow keys) to move the group; Shift+drag to limit to horizontal/vertical; Ctrl+drag to rotate, Ctrl+Shift+drag to scale. Drag the \"+\" to set rotation/scaling center. Click the handle and press Ctrl+D to duplicate the group; press Delete to ungroup.
Edit coordinates directly
Double-click or right-click the control point (e.g. endpoint) of the object, edit the (x,y) coordinates, then press Enter.
Keyboard shortcuts
When an object is selected (by clicking it), press arrow keys to move; Ctrl+D to duplicate; Delete key to delete.
"
- },
- "show_help_popups": {
- "message": "Show help popups"
- },
- "show_help_popups_popover": {
- "message": "Defines whether to show help popups when hovering over buttons. (Reload the page to take effect.)"
- },
- "show_json_editor": {
- "message": "Show JSON editorBeta"
- },
- "show_json_editor_popover": {
- "message": "Show the code editor for the JSON representation of the scene, which is needed when creating a custom module (See Tools -> Other -> Import Modules -> Make custom modules)."
- },
- "show_status": {
- "message": "Show status box"
- },
- "show_status_popover": {
- "message": "Show the status box, which includes the mouse coordinates, performance information, and the truncated brightness (the total brightness of the rays truncated in the infinite series of internal reflection)."
- },
- "auto_sync_url": {
- "message": "Auto sync URL"
- },
- "auto_sync_url_popover": {
- "message": "When enabled, the URL will be updated automatically with the current scene, so you don't need to keep saving the scene manually. To set the title, use File -> Save -> Rename."
- },
- "auto_sync_url_warning": {
- "message": "The scene is too large to sync with URL. Please save it manually."
- },
- "gridSize": {
- "message": "Grid Size"
- },
- "observer_size": {
- "message": "Observer Size"
- },
- "language": {
- "message": "Language"
- },
- "close": {
- "message": "Close"
- },
- "advanced_help": {
- "message": "For advanced help, see the help icon in the lower-right corner."
- },
- "ray_count": {
- "message": "Number of ray segments: "
- },
- "total_truncation": {
- "message": "Truncated brightness: "
- },
- "brightness_scale": {
- "message": "Brightness Scale: "
- },
- "time_elapsed": {
- "message": "Time elapsed (ms): "
- },
- "force_stopped": {
- "message": "Force stopped."
- },
- "mouse_coordinates": {
- "message": "Mouse coordinates: "
- },
- "modules_tutorial": {
- "message": "Make custom modules"
- },
- "modules_tutorial_url": {
- "message": "https://phydemo.app/ray-optics/modules/tutorial"
- },
- "identical_optical_objects_warning": {
- "message": "There are two identical optical elements in the scene that overlap completely. This may cause unexpected behavior."
- },
- "import_modules": {
- "message": "Import Modules..."
- },
- "import_modules_title": {
- "message": "Import Modules"
- },
- "modules_url": {
- "message": "../modules/modules.html"
- },
- "remove_module": {
- "message": "Remove module"
- },
- "module_conflict": {
- "message": "A different module with the same name already exists in the current scene. You may enter a new name, or leave it the same to overwrite the existing module."
- },
- "brightness_inconsistent_warning": {
- "message": "The brightnesses of two or more light sources saturate with inconsistent ratios. This may lead to wrong detector readings and color rendering. Please increase the ray density or reduce the brightnesses of the light sources."
- }
-}
\ No newline at end of file
diff --git a/locales/en/gallery.json b/locales/en/gallery.json
new file mode 100644
index 00000000..167fe87d
--- /dev/null
+++ b/locales/en/gallery.json
@@ -0,0 +1,487 @@
+{
+ "galleryPage": {
+ "title": "The Ray Optics Gallery",
+ "description": "This is a collection of simulations made using [the web app](/simulator), which can be used as interactive demos of optics. You are welcome to contribute new items. See [the contribution guide](/contributing/gallery) for more information. To report a mistake, please [open an issue on GitHub](/github/issues) or email [ray-optics@phydemo.app](/email).",
+ "categories": {
+ "title": "Categories",
+ "reflection": "Reflection",
+ "refraction": "Refraction",
+ "lens": "Lens",
+ "combinationOfLenses": "Combination of Lenses",
+ "grinOptics": "Gradient-index Optics",
+ "miscellaneous": "Miscellaneous"
+ },
+ "contributors_one": "Contributor: {{contributors}}",
+ "contributors_other": "Contributors: {{contributors}}",
+ "openInSimulator": "Open in Simulator"
+ },
+ "galleryData": {
+ "common": {
+ "warningthesequenceof": "Warning: The sequence of light appearing does not represent the actual speed of light - only the final image is meaningful."
+ },
+ "imagesFormedByTwoMirrors": {
+ "title": "Images from Two Mirrors",
+ "description": "This simulation shows the images formed by two mirrors. The green \"L\" is the object. If the angle between the two mirrors is \\(\\frac{360^\\circ}{n}\\), then \\(n-1\\) virtual images (the orange L's) will be formed. You can drag the endpoint of the mirror to change the angle between them."
+ },
+ "parabolicMirror": {
+ "title": "Parabolic Mirror",
+ "description": "This simulation demonstrates the focusing property of the parabolic mirror."
+ },
+ "hyperbolicMirror": {
+ "title": "Hyperbolic mirror",
+ "description": "This is a demonstration of the reflection property of the hyperbolic mirror: Light rays traveling from one focus towards the hyperbolic mirror, will reflect away from the other focus.\n\nThe two foci of the hyperbola are aplanatic points (see [Aplanatic points](/gallery/aplanatic-points)).",
+ "theorangeraysareimag": "The orange rays are imaginary extended rays from the reflected yellow rays.\nThese imaginary rays converge at the other focus point.",
+ "pointlightsourceaton": "Point light source at one focus point"
+ },
+ "retroreflectors": {
+ "title": "Retroreflectors",
+ "description": "This is a simulation of two types of retroreflectors:\n\n1. Corner retroreflector.\n2. Cat's eye retroreflector.",
+ "dragtorotatethebeam": "Drag to\nrotate the beam",
+ "catseyeretroreflecto": "Cat's eye retroreflector",
+ "cornerretroreflector": "Corner retroreflector"
+ },
+ "periscope": {
+ "title": "Periscope",
+ "description": "This is a simulation of a periscope made from two flat mirrors and some light blockers.",
+ "observerseyenottosca": "Observer's eye (not to scale)"
+ },
+ "newtonianTelescope": {
+ "title": "Newtonian Telescope",
+ "description": "This is a model of a Newtonian telescope with a Plössl ocular."
+ },
+ "penroseUnilluminableRoom": {
+ "title": "Penrose unilluminable room",
+ "description": "The Penrose unilluminable room is constructed from elliptic, circular, and linear mirrors. It has the interesting property that a point source (green) within the room will not shine the entire room, no matter where you put it. You can drag the green point to move the source.",
+ "nomatterwhereyouputt": "No matter where you put the point source, it will not shine the entire room.\nWarning: Due to numerical error, it may still shine after some time."
+ },
+ "opticalCavity": {
+ "title": "Two-mirror optical cavity",
+ "description": "This is a simulation of rays inside an optical cavity with two mirrors. Given the length of the cavity is \\(d\\), and the radius of curvature of its mirrors is \\(R_1\\) and \\(R_2\\) respectively (with the convention that \\(R>0\\) for a concave mirror), then the optical cavity is stable (meaning that for each ray that emanates from one of the mirrors towards the other mirror, a non-divergent trajectory is guaranteed for sufficiently high mirrors), if and only if \\(0\\leq (1-\\frac {d}{R_1})(1-\\frac {d}{R_2})\\leq 1\\). In this simulation we assume that the mirrors are ideal curved mirrors, meaning that \\(f=\\frac{R}{2}\\), rendering the previous stability condition to \\(0\\leq (1-\\frac {d}{2f_1})(1-\\frac {d}{2f_2})\\leq 1\\). [Here](/gallery/resonator) is a similar simulation with spherical mirrors, where the first stability condition holds in the paraxial approximation.",
+ "clickholdleftmouseto": "Click + hold left mouse\nto move the ray",
+ "dragtomovetheidealmi": "Drag to move\nthe ideal mirror",
+ "d400intheresonatorsb": "d = 400 in the resonators below",
+ "confocalresonator": "Confocal resonator",
+ "concentricresonator": "Concentric resonator",
+ "concaveconvexresonat": "Concave-convex resonator",
+ "planoconcaveresonato": "Plano-concave resonator"
+ },
+ "resonator": {
+ "title": "Plano-concave resonator",
+ "description": "This is a demonstration of a plano-concave resonator. If the distance between the mirrors is greater than the radius of curvature, the resonator is unstable. If the distance between the mirrors is less than or equal to the radius of curvature, a stable resonator mode is formed.",
+ "flatmirror": "Flat mirror",
+ "sphericalconcavemirr": "Spherical concave mirror",
+ "unstableresonator": "Unstable resonator",
+ "stableresonator": "Stable resonator"
+ },
+ "mazeSolution": {
+ "title": "Maze solution",
+ "description": "This is a simulation of a light ray originating inside a maze and reflected repeatedly by the walls. The larger and smaller red squares inside the maze (seen in the screenshot below) represent the origin and the initial direction of the light ray, respectively. For some initial orientations of the light ray, it exits the maze, and thus by retracing the path of the ray a solution to the maze can in principle be calculated.",
+ "controltherayorigina": "Control the ray origin and initial direction by\ndragging the top and bottom markers (respectively).",
+ "notethatthesimulatio": "Note that the simulation processing is finished only once\nthe processing message at the bottom left corner disappears.",
+ "mazeexit": "Maze exit"
+ },
+ "specularAndDiffuseReflection": {
+ "title": "Specular and Diffuse Reflections",
+ "description": "Identical beams shine on a smooth surface and a rough surface, illustrating the difference between specular and diffuse reflections.",
+ "specular": "Specular",
+ "diffuse": "Diffuse"
+ },
+ "chaffCountermeasure": {
+ "title": "Chaff countermeasure",
+ "description": "This is a qualitative simulation of the effect that the chaff countermeasure has on a radar (ignoring diffraction effects).",
+ "plane": "Plane",
+ "radar": "Radar",
+ "chaff": "Chaff",
+ "selectthechafftochan": "Select the chaff to change the number (N) and the length (L) of chaff pieces."
+ },
+ "causticsFromAReflectiveSphere": {
+ "title": "Caustics from a Reflective Sphere",
+ "description": "A reflective integrating sphere (not scattering) with an entrance hole. Can also be the reflections inside a liquid drop (like a raindrop). Beautiful patterns emerge where the caustics develop by moving the point source around.",
+ "movethepointsourcear": "Move the point source around\nto watch the caustics and nodes \nwithin the integrating sphere transform.\nChange size and position of the blockers, \nand the opening size of the sphere\nto see more effects."
+ },
+ "theMirascope": {
+ "title": "The Mirascope",
+ "description": "A **mirascope** is a fascinating optical illusion device that uses two opposing parabolic mirrors to create the illusion of a three-dimensional floating image. The device consists of:\n1. **Two Parabolic Mirrors** of the exact same size, with one mirror facing upward and the other facing downward, forming a clam-like structure. The mirrors are designed to focus light at a specific point. The top mirror has a hole at its vertex to allow the light to enter the device.\n2. **A Small Object**: Placed inside the mirascope, typically near the focal point of the top mirror that is very close to the vertex of the bottom mirror.\n\nWhen light from the object reflects between the mirrors, it is redirected in such a way that it appears as a lifelike, three-dimensional image floating above the surface of the mirascope. The illusion is so convincing that people often try to touch the image, only to find there's nothing there.\n\nMirascopes are popular in science demonstrations, toys, and novelty items to illustrate the principles of optics, reflection, and the behavior of light.",
+ "object1": "Object",
+ "realimage1": "Real image"
+ },
+ "reflect": {
+ "title": "Reflection and Refraction",
+ "description": "This simulation shows the reflection and refraction at a surface."
+ },
+ "internalReflection": {
+ "title": "Internal Reflection",
+ "description": "This simulation shows the refraction and internal reflection at a surface."
+ },
+ "prisms": {
+ "title": "Prisms",
+ "description": "This simulation demonstrates the right-angle prism, the Porro prism, the rhomboid prism, the Dove prism, and the pentaprism.",
+ "rhomboid": "rhomboid",
+ "rightangle": "right-angle",
+ "porro": "Porro",
+ "dove": "Dove",
+ "pentaprism": "pentaprism"
+ },
+ "beamDirectors": {
+ "title": "Beam Directors",
+ "description": "This is a simulation of a regular and a Fresnel biprism. A biprism can direct an incoming collimated beam into two directions, depending on the apex angle.",
+ "thisfresnelbiprismwa": "This fresnel biprism was made from the above biprism.\nYou can select the biprism and adjust the N_silce parameter.",
+ "fresnelbiprism": "Fresnel biprism",
+ "biprism": "Biprism"
+ },
+ "apparentDepth": {
+ "title": "Apparent Depth",
+ "description": "When you look at an object underwater from the air, the depth of the object appears to be smaller than its actual depth. This phenomenon is due to the reflection of light, and is demonstrated in this simulation. The apparent depth depends on the position of the observer, which can be demonstrated by dragging the blue circle.",
+ "observedimageorange": "Observed image (orange)",
+ "observer": "Observer",
+ "objectunderwatergree": "Object underwater (green)"
+ },
+ "bendedPencil": {
+ "title": "Bent Pencil",
+ "description": "This is a simulation of the image perceived with our eyes, when looking from above on a partially submerged pencil in a glass of water. The discontinuity of the refractive index between air and water causes the pencil to appear both broken and bent. However, in this simulation, the bending is more pronounced. You can check the [Broken Pencil](/gallery/broken-pencil) simulation where the breaking of the pencil is more pronounced.",
+ "bentpencilyellowimag": "bent pencil (yellow)\nimage on retina",
+ "dielectricmaterial": "dielectric material",
+ "originalpencilgreen": "original pencil (green)",
+ "observerseye": "observer's eye",
+ "ignoretheorangesquar": "Ignore the orange squares!"
+ },
+ "brokenPencil": {
+ "title": "Broken Pencil",
+ "description": "This is a simulation of the image perceived with our eyes, when looking from the side at a partially submerged pencil in a glass of water. The discontinuity of the refractive index between air and water causes the pencil to appear both broken and bent. However, in this simulation, the breaking is more pronounced. You can check the [Bent Pencil](/gallery/bended-pencil) simulation where the bending of the pencil is more pronounced.",
+ "brokenpencilyellowim": "broken pencil (yellow)\nimage on retina"
+ },
+ "chromaticDispersion": {
+ "title": "Chromatic dispersion",
+ "description": "This simulation demonstrates chromatic dispersion using a white-colored beam and a triangular prism. Here the white color is formed by mixing red, orange, yellow, green, cyan, blue, and violet colors.",
+ "dragheretoadjustbeam": "Drag here to\nadjust beam width",
+ "dragheretorotatethep": "Drag here to\nrotate the prism"
+ },
+ "rainbows": {
+ "title": "Rainbows",
+ "description": "This simulation demonstrates the formation of the primary rainbow, the secondary rainbow, and Alexandar's dark band. Here the spectrum of the sunlight is approximated by mixing red, orange, yellow, green, cyan, blue, and violet colors. The outgoing rays for the primary/secondary rainbow are due to one/two internal reflections within the raindrop (you can see this by setting Ray Density to a low number and dragging the raindrop). Note that these are not total internal reflections, so the intensities of the outgoing rays are much lower than the incoming rays. Since the [minimum deviation angles](/gallery/minimum-deviation-angle) depend on the wavelength, different colors accumulate at different angles. Hence the colors in the rainbows are produced. Away from the minimum angles, the rays do not accumulate, so all colors are weak and mixed together, producing the dim white (or \"gray\") color at the angles just outside the two rainbows. On the other hand, no rays go to the angle between the two rainbows, forming Alexandar's dark band.",
+ "thesearethecolorspro": "These are the colors produced from a single raindrop.\nThe final rainbows we see are due to an enormous number of raindrops in the sky,\neach of which gives a single color (at the corresponding angle) to the observer.",
+ "secondaryrainbow": "Secondary rainbow",
+ "alexandersdarkband": "Alexander's dark band",
+ "raindrop": "Raindrop",
+ "primaryrainbow": "Primary rainbow",
+ "sunlight": "Sunlight"
+ },
+ "minimumDeviationAngle": {
+ "title": "Minimum deviation angle",
+ "description": "The definition of the deviation angle of a ray hitting an optical element depends on the context - in the screenshot below you can see its definition for a triangular and a spherical prism. In the examples inside this simulation, the deviation angle as a function of the incidence angle of the ray entering the optical element, has a local minimum at a deviation angle which is called the \"minimum deviation angle\". This local minimum can explain optical phenomena such as [rainbows](/gallery/rainbows) and halos - due to this local minimum, the deviated rays accumulate at specific directions, creating \"optical caustics\" (as seen in example C inside the simulation) which we perceive as rainbows/halos.",
+ "inexamplesaandbbyrot": "In examples A and B, by rotating the prisms between points A1 to A2 and B1 to B2, thereby changing the\nincidence angle of the ray entering into the optical element, you can clearly observe that a minimum\ndeviation angle is achieved somewhere between the pair of points.\n(in example A the deviation angle is measured relative to a horizontal axis, whereas in example B\nit is measured relative to the vertical axis).\n\nNow zoom into example C (using the simulation zoom), and expand the two beams (red and purple, and\ntheir intersection looks pink. This is effectively the same as rotating the spherical prism in\nexample B, thereby changing the incidence angle of the entering ray) and observe that from point\nC1 to C2 the backward exiting rays accumulate down towards two distinct red and purple\nrays (\"optical caustics\") - the minimum deviation angle is achieved around point C2, and depends on\nthe light wavelength (color). Then, when expanding the two beams from point C2 to C3, the\nbackward exiting rays reverse their direction upward.",
+ "examplea": "Example - A",
+ "examplec": "Example - C",
+ "exampleb": "Example - B",
+ "dragtorotate": "Drag to rotate",
+ "dragtoadjustbeamwidt": "Drag to adjust beam widths",
+ "usethebuiltinzoomtob": "Use the built-in zoom to better interact with the simulation",
+ "deviationangle": "Deviation angle",
+ "incidenceangle": "Incidence angle"
+ },
+ "aplanaticPoints": {
+ "title": "Aplanatic points",
+ "description": "Aplanatic points of an optical system are special points on its optical axis, such that \"rays proceeding from one of them will all converge to, or seen to diverge from the other point\".\n\n- Ellipse: the two foci of the elliptical lens/mirror are aplanatic points, since light emitted from one focus will converge towards the other.\n- Sphere: a spherical lens has two aplanatic points, inside and outside the sphere - for more details see the simulation.\n- Hyperbola: the two foci of the [Hyperbolic mirror](/gallery/hyperbolic-mirror) simulation are also aplanatic points.\n\nGiven two points with horizontal coordinates \\(x_1\\) and \\(x_2\\), identical vertical coordinates, and given the refractive index outside and inside our optical element as \\(n_1\\) and \\(n_2\\) (respectively), for this two points to be aplanatic points, the boundary of our optical element must fulfill\\begin{equation}k_1 n_1 \\sqrt{ (x - x_1)^2 + y^2} + k_2 n_2 \\sqrt{ (x - x_2)^2 + y^2} = E\\end{equation}such that \\(k_i=1\\) or \\(-1\\) if the ray connecting \\(x_i\\) and the boundary of our optical element is real or imaginary, respectively, and \\(E\\) is a constant for which this equation has a non-trivial solution. This equation (which can be derived using Fermat's principle) is an equation of a Cartesian oval, of which the conic sections are special cases.",
+ "clickontheextendedra": "Click on the \"Extended rays\" button to verify that light emitted from the light source in the spherical lens (point A),\nwill diverge from another point on the optical axis outside the spherical lens (point B) without spherical aberration.\nPoints A and B are an example of aplanatic points of the sphere, for which (k1, k2, n1, n2, x1, x2, E)=(1, -1, 1.5, 1, 3 * 20, -4.5 * 20, 0) relative to the marked Y axis,\nwhere x1,x2 are the horizontal coordinates of points A,B respectively (each grid cell has dimensions of 20 by 20).\nIn a similar way, the foci of the ellipse (points C and D) are an example of aplanatic points of the ellipse, for which (k1, k2, n1, n2, E)=(1, 1, 1.5, 1.5, > 0)",
+ "sphericallens": "Spherical lens",
+ "ellipticallens": "Elliptical lens",
+ "yaxis": "Y axis"
+ },
+ "concaveLens": {
+ "title": "Concave Lens",
+ "description": "This simulation shows a concave lens diverging a beam."
+ },
+ "convexLens": {
+ "title": "Convex Lens",
+ "description": "This simulation shows a convex lens converging a beam."
+ },
+ "lensImages": {
+ "title": "Lens Images",
+ "description": "This simulation shows the images of a beam and point sources produced by ideal lenses."
+ },
+ "transverseAndLongitudinalMagnification": {
+ "title": "Transverse and longitudinal magnification",
+ "description": "This is a simulation of transverse and longitudinal magnification for an ideal lens with focal length \\(f\\). The transverse (also called linear) and the longitudinal magnification is \\(M_T=1-\\frac{u}{f}\\) and \\(M_L=\\frac{dv}{du}\\) respectively, where \\(u\\) and \\(v\\) is the distance of the object and the image from our ideal lens, respectively. Also, for an ideal lens \\(M_L=-(M_T)^2\\)",
+ "inthisexamplewehavey": "In this example we have y'_j - y'_k = M_T * (y_j - y_k), where j,k∈{0,1,2,3,4,5}.\nTherefore for example the tranverse magnification of the point object (x_0,y_0) is M_T = -3, and we can calculate - \n(x'_0 - x'_1)/(x_1 - x_0) ≈ -0.3699\n(x'_0 - x'_2)/(x_2 - x_0) ≈ -0.7297\n(x'_0 - x'_3)/(x_3 - x_0) ≈ -1.4211\n(x'_0 - x'_4)/(x_4 - x_0) ≈ -2.4545\n(x'_0 - x'_5)/(x_5 - x_0) = -5.4\n.\n.\n.\n(The ratio will converge to the longitudinal magnification: M_L = - (M_T)^2 = -9)",
+ "rightclickonarealobj": "Right click on a (real) object to see its coordinates.\nThe green squares are real point sources, while the yellow squares are image objects."
+ },
+ "vanishingPoint": {
+ "title": "Vanishing point",
+ "description": "Some optical systems map infinite parallel lines, to lines on the image plane which meet at a single point, making an illusion that the parallel lines meet \"at infinity\". This single point is called the vanishing point.\n\nFor an optical system comprising an ideal lens with focal length \\(f\\), located on the \\(XY\\) plane, such that its optical axis coincides with the \\(X\\)(horizontal) axis and the lens coincides with the \\(Y\\) axis, the vanishing point for a line with a slope \\(m\\), located at \\(x<0\\), is given by the \\((x,y)\\) coordinates \\((f,m f)\\) .",
+ "youcanverifythatapai": "You can verify that a pair of parallel lines with slope - m, converge by the ideal lens to the coordinates (f,m∙f),\nby clicking the \"Grid\" button and noticing that each grid cell has dimensions of 20 by 20.\nYou can also verify how changing the ideal lens's focal length - f, effects the converging points (vanishing points).",
+ "thesepairofparallell": "These pair of parallel lines converge to point B",
+ "thesepairofparallell1": "These pair of parallel lines converge to point A",
+ "notethatthesepairsof": "Note that these pairs of parallel lines are not actually infinite."
+ },
+ "monochromaticAberrations": {
+ "title": "Monochromatic aberrations",
+ "description": "This is a simulation of different monochromatic aberrations:\n\n1. Spherical aberration.\n2. Comma aberration.\n3. Defocus aberration.\n4. Field curvature aberration.",
+ "defocusaberration": "Defocus aberration",
+ "sphericalaberration": "Spherical aberration",
+ "screen": "Screen",
+ "fieldcurvatureaberra": "Field curvature aberration",
+ "commaaberration": "Comma aberration"
+ },
+ "chromaticAberration": {
+ "title": "Chromatic aberration",
+ "description": "This simulation shows the chromatic aberration of a spherical lens. Here the white color is formed by mixing red, orange, yellow, green, cyan, blue, and violet colors. The focal length of red light is the largest, and that of violet light is the smallest.",
+ "dragtoadjustbeamwidt1": "Drag to adjust beam width"
+ },
+ "hyperbolicLens": {
+ "title": "Hyperbolic lens",
+ "description": "This is a simulation and comparison between the hyperbolic and spherical lenses. Both lenses have identical focal lengths, but as opposed to the spherical lens, the hyperbolic lens can collimate a parallel beam of monochromatic light to a single point (neglecting the wave nature of light - i.e in the geometric optics approximation) without spherical aberrations.",
+ "thefocallengthofthis": "The focal length of this spherical lens (in the paraxial approximation) is:\nf=R/(n-1)=200/(1.5-1)=400",
+ "thefocallengthofthis1": "The focal length of this hyperbolic lens is:\nf = |C| ∙ sqrt(n^2 - 1) / (n - 1) = K ∙ sqrt(0.8) ∙ sqrt(1.5^2 - 1) / (1.5 - 1) = 400\nwhere the equation for this hyperbola is:\ny(x) = (a/K) - sqrt( ((x/K)^2 + (C/K)^2) / (n^2 - 1) )\n= 1.5 - sqrt( (0.8 + (x / 200)^2) / (1.5^2 - 1) )\nsuch that K is the conversion constant between the equation dimensions to the grid dimensions - for this hyperbolic lens K=200.\n(for example 0 0\\) and \\(\\alpha = \\arctan k\\) is a constant angle between the two tangents at the intersection point between the concentric logarithmic spiral and circle (as demonstrated in [this](https://en.wikipedia.org/wiki/Logarithmic_spiral#/media/File:Logspiral.gif) animation), is \\(n(r) ∝ \\frac{1}{r} \\) (this can be shown by writing the optical path in polar coordinates, and using Fermat's principle).",
+ "thecircularblockeris": "The circular blocker is in the center\nto avoid the refractive index singularity",
+ "dragtochangetheiniti": "Drag to change the\ninitial direction of the ray",
+ "youcanselectthegring": "You can select the GRIN glass and\nchange the numerical solver step size"
+ },
+ "luneburgLens": {
+ "title": "Luneburg lens",
+ "description": "This is a simulation of a Luneburg lens, which is a spherical dielectric with refractive index \\(n(r) = \\sqrt{n_0-(\\frac{r}{R})^2} \\), where \\(n_0=2\\) is the refractive index in the center of the lens, \\(R=100\\) is the radius of the lens, and \\(r\\) is the radial distance from the center of the lens.\n\nThe top dielectric is composed of \\(N=20\\) concentric spherical lenses with radius \\(R_i=5(N+1-i)\\) and refractive index \\(n_i = \\sqrt{n_0-(\\frac{R_i}{R})^2} \\), where \\(i=1,...,N\\). However, since this simulator calculates the effective refractive index of an optical element by multiplying the element's numerical refractive index with the numerical refractive indices of the optical elements which are embedded within it, the numerical refractive index of the \\(i\\)th concentric spherical lens is given by \\(n_{i}^\\text{numerical}=\\frac{n_i}{n_{i-1}}\\).\n\nThe bottom dielectric is a gradient-index material with the refractive index \\(n(r)\\).",
+ "approximatedmultilay1": "Approximated multilayer Luneburg lens (You can select and change N, the number of layers.)",
+ "classicalluneburglen": "Classical Luneburg lens (You can select and change the numerical solver step size.)"
+ },
+ "maxwellFisheyeLens": {
+ "title": "Maxwell fisheye lens",
+ "description": "This is a simulation of a Maxwell fish-eye lens, which is a spherical dielectric with refractive index \\(n(r) = \\frac{n_0}{1+(\\frac{r}{R})^2} \\), where \\(n_0=2\\) is the refractive index in the center of the lens, \\(R=100\\) is the radius of the lens, and \\(r\\) is the radial distance from the center of the lens.\n\nThe top dielectric is composed of \\(N=20\\) concentric spherical lenses with radius \\(R_i=5(N+1-i)\\) and refractive index \\(n_i = \\frac{n_0}{1+(\\frac{R_i}{R})^2} \\), where \\(i=1,...,N\\). However, since this simulator calculates the effective refractive index of an optical element by multiplying the element's numerical refractive index with the numerical refractive indices of the optical elements which are embedded within it, the numerical refractive index of the \\(i\\)th concentric spherical lens is given by \\(n_{i}^\\text{numerical}=\\frac{n_i}{n_{i-1}}\\).\n\nThe bottom dielectric is a gradient-index material with the refractive index \\(n(r)\\).",
+ "approximatedmultilay2": "Approximated multilayer Maxwell fisheye lens (You can select and change N, the number of layers.)",
+ "classicalmaxwellfish": "Classical Maxwell fisheye lens (You can select and change the numerical solver step size.)"
+ },
+ "branchedFlow": {
+ "title": "Branched flow",
+ "description": "When light travels through a medium whose refractive index has random spatial fluctuations (with correlation length much larger than the wavelength of the light), a tree-like pattern called branched flow will appear. This simulation shows this phenomenon using a refractive index function which is a sum of several cosine functions with random-like amplitudes, wave vectors, and phases."
+ },
+ "singleRayDemo": {
+ "title": "Single Ray demo",
+ "description": "This simulation demonstrates the reflection and refraction of a single ray."
+ },
+ "sphericalLensAndMirror": {
+ "title": "Spherical Lens and Mirror",
+ "description": "This simulation shows a continuous beam passing through a spherical lens and a spherical mirror."
+ },
+ "interrogationRoom": {
+ "title": "Interrogation room",
+ "description": "This is a simulation of a two-way mirror in an interrogation room. The observer in the dark room (ideally the dark room's interior is not emitting/reflecting light, as well as absorbing all the incoming light from the interrogation room) is able to see inside the interrogation room because the light created by the lamp in the interrogation room is scattered and received by the observer through the two-way mirror, whereas the suspect can only see inside the interrogation room as well as his/her and the lamp's reflections (since no light is received by the suspect from the dark room).",
+ "pressonallimagestose": "Press on \"All Images\" to see the location\nof the lamp's reflection, and the objects\nin the suspect's and observer's image plane",
+ "darkroom": "Dark room",
+ "twowaymirror": "Two-way mirror",
+ "lamp": "Lamp",
+ "interrogationroom": "Interrogation room",
+ "observerseyeris": "Observer's eyeris",
+ "suspectseyeris": "Suspect's eyeris",
+ "thelampobjectinthesu": "The lamp object in the suspect's image plane",
+ "thelampsreflectionin": "The lamp's reflection in the suspect's image plane",
+ "thelampsreflection": "The lamp's reflection",
+ "thelampobjectintheob": "The lamp object in the observer's image plane"
+ },
+ "cameraObscura": {
+ "title": "Camera obscura",
+ "description": "This is a simulation of a Camera obscura. The observer in the dark room sees an inverted image of the objects outside, projected on the wall in front of him/her (without the use of an extra lens).",
+ "observer2": "Observer",
+ "objectsoutside": "Objects outside",
+ "darkroom1": "Dark room"
+ },
+ "thePrincipleOfCameraImaging": {
+ "title": "The principle of camera imaging",
+ "description": "This template provides an interactive approach to learning the principles of camera imaging, covering essential topics such as focal length, aperture, sensor sensitivity, and background blur, making it useful for both students and enthusiasts.",
+ "camera": "Camera",
+ "cmos": "CMOS"
+ },
+ "nlSimulation": {
+ "title": "NL Binoculars",
+ "description": "This simulation shows a rough sketch of Swarovski NL binoculars."
+ },
+ "einsteinRingRefocusedToSingleImageViaEyepiece": {
+ "title": "Einstein Ring refocused to Single Image via Eyepiece",
+ "description": "This is a model of an eyepiece/lens that could be used on any scientific telescope which will reverse the \"halo\" and focus an Einstein ring back into its original form while scattering the light of any star or massive object used to create the ring."
+ },
+ "blackCatBecomesWhite": {
+ "title": "\"Black cat becomes white\" demo",
+ "description": "\"Black cat becomes white\" is a popular science demo in which some part of a figure disappears when put in water. It is made with the following steps:\n\n1. Draw a figure (e.g. a black cat) on a piece of paper.\n2. Put the paper in a plastic zip-lock bag.\n3. Draw part of the figure (e.g. the border of the cat) or some other figure on the plastic surface. When put in water, the figure drawn on the paper disappears, but not the part drawn on the plastic surface.\n\nThis simulation explains how it works.",
+ "whenthebagisunderwat": "When the bag is underwater, the light from the paper does not reach the eyes,\nso we only see the figure drawn on the plastic surface.",
+ "lightfromtheplastics": "Light from the plastic surface",
+ "lightfromthepaper": "Light from the paper",
+ "eyes": "Eyes",
+ "dragtomovethebagouto": "Drag to move the bag out of water"
+ },
+ "dichroicRbgSplitterAndCombiner": {
+ "title": "Dichroic RGB Splitter & Combiner",
+ "description": "This simulation demonstrates the splitting and combination of RGB beams using dichroic mirrors.",
+ "rgbcomponentsplitter": "RGB Component Splitter & Combiner",
+ "lightsource": "Light Source",
+ "dichroiccube": "Dichroic Cube",
+ "beamcombiner": "Beam Combiner"
+ },
+ "ganBasedLcdPixel": {
+ "title": "LCD Pixel",
+ "description": "This is a model of an LCD pixel. It simulates how new microled display layers function and how our eyes perceive the pixel.",
+ "pixelsaresosmallthel": "Pixels are so small the light\nappears to be mixed to our eyes",
+ "changetherateoftrans": "Change the Rate of Transmission\nTo Create Any RGB Value",
+ "blueledbacklight": "Blue LED Backlight",
+ "yellowphosphor": "Yellow Phosphor",
+ "liquidcrystal": "Liquid Crystal",
+ "lightfilters": "Light Filters",
+ "pixelasvisibletoview": "Pixel as Visible to Viewer",
+ "notpartoflcddisplay": "Not part of LCD display"
+ },
+ "concaveMirrorWearableDisplay": {
+ "title": "Concave Mirror Wearable Display",
+ "description": "A simple wearable display. A lot of designs use two mirrors and a positive lens, but this is a one-optical-element version. The scale is approximately 5:1mm.\n\nCC0: This work has been marked as dedicated to the public domain.",
+ "tft09display": "TFT 0.9\" display",
+ "concavemirror": "concave mirror",
+ "eye1": "eye",
+ "nose": "nose",
+ "pointsourcetomeasure": "point source to measure radius",
+ "t15readingglasses": "+1.5 reading glasses"
+ },
+ "reflectingMonochromator": {
+ "title": "Reflecting Monochromator",
+ "description": "This is a simulation of a reflecting monochromator, which uses a reflective diffraction grating and a slit at the focus to get narrow band wavelengths from composite light.",
+ "reflectingmonochroma": "Reflecting Monochromator",
+ "rotatediffractiongra": "Rotate Diffraction Grating \nto get narrow band \nwavelengths from \ncomposite light",
+ "exitslitmonochromati": "Exit Slit\n\nMonochromatic Light"
+ },
+ "solarEclipses": {
+ "title": "Solar Eclipses",
+ "description": "This simulation demonstrates the different types of solar eclipses. The top-right diagram depicts a solar eclipse where the Moon's shadow covers the Sun, resulting in a total eclipse at the center and a partial eclipse in surrounding areas. The bottom-right diagram illustrates an annular eclipse where the Moon is too far from Earth to completely cover the Sun, leaving a bright ring at the center (in this 2D simulator, the \"ring\" is demonstrated by sunlight coming only from the upper and the lower part of the sun) and also a partial eclipse in surrounding areas.",
+ "nottoscale": "(Not to scale)",
+ "sun": "Sun",
+ "moon": "Moon",
+ "partialeclipse": "Partial eclipse",
+ "annulareclipse": "Annular eclipse",
+ "earth": "Earth",
+ "totaleclipse": "Total eclipse"
+ },
+ "moduleExampleBasics": {
+ "title": "Module Example - Basics",
+ "thistextisinexamplem": "This text is in ExampleModule.",
+ "thistextisalsoinexam": "This text is also in ExampleModule.",
+ "thistextisnotinamodu": "This text is not in a module.",
+ "thistextisalsonotina": "This text is also not in a module."
+ },
+ "moduleExampleParameters": {
+ "title": "Module Example - Parameters",
+ "thismodulehastwopara": "This module has two parameters: n=`n` and theta=`theta`.\nYou can select and drag the sliders to adjust them.",
+ "thesizeofthistextosc": "The size of this text oscillates as a function of theta."
+ },
+ "moduleExampleControlPoints": {
+ "title": "Module Example - Control points",
+ "hereisthefirstdragga": "↙Here is the first (draggable) control point of the module",
+ "hereistheseconddragg": "↙Here is the second (draggable) control point of the module",
+ "hereisthemidpoint": "↙Here is the midpoint"
+ },
+ "moduleExampleArraysAndConditionals": {
+ "title": "Module Example - Arrays and conditionals",
+ "a1darrayii": "A 1D array: i=`i`",
+ "thistextisshownonlyw": "This text is shown only when n>5"
+ },
+ "moduleExampleCustomEquation": {
+ "title": "Module Example - Custom equation",
+ "amirrorofshapeycos2p": "A mirror of shape y=cos(2 pi x + `phi`)"
+ },
+ "moduleExampleShapeParametrization": {
+ "title": "Module Example - Shape parametrization",
+ "alensdefinedbydr1r2": "A lens defined by d, R_1, R_2",
+ "alensdefinedbydffdbf": "A lens defined by d, FFD, BFD"
+ }
+ }
+}
\ No newline at end of file
diff --git a/locales/en/main.json b/locales/en/main.json
new file mode 100644
index 00000000..3c899f69
--- /dev/null
+++ b/locales/en/main.json
@@ -0,0 +1,231 @@
+{
+ "meta": {
+ "languageName": "English",
+ "parentheses": "{{main}} ({{sub}})",
+ "colon": "{{name}}: {{value}}",
+ "list": "{{first}}, {{others}}"
+ },
+ "project": {
+ "name": "Ray Optics Simulation",
+ "shortName": "Ray Optics",
+ "description": "A free, open-source web app for creating and simulating 2D geometric optical scenes."
+ },
+ "pages": {
+ "simulator": "Simulator",
+ "home": "Home",
+ "gallery": "Gallery",
+ "modules": "Modules",
+ "about": "About",
+ "github": "GitHub"
+ },
+ "homePage": {
+ "description": "Create & simulate 2D geometric optical scenes interactively.\nTotally free and web-based. Source code is [available on GitHub](/github).",
+ "launchSimulator": "Launch Simulator"
+ },
+ "tools": {
+ "title": "Tools",
+ "categories": {
+ "lightSource": "Light Source",
+ "mirror": "Mirror",
+ "glass": "Glass",
+ "blocker": "Blocker",
+ "other": "Other"
+ },
+ "common": {
+ "clickInstruction": "Click to create.",
+ "lineInstruction": "Drag or click to create.",
+ "circleInstruction": "Drag or click to create, first the center, then the circumference."
+ },
+ "SingleRay": {
+ "title": "Single ray",
+ "description": "A single ray of light defined by two points.",
+ "instruction": "Drag or Click to create, first the source, then the direction."
+ },
+ "Beam": {
+ "title": "Beam",
+ "description": "A parallel or divergent beam of rays emerges from a line segment, with density controlled by the 'Ray density' slider."
+ },
+ "PointSource": {
+ "title": "Point source",
+ "description": "Rays emerge from a single point, with number controlled by the 'Ray density' slider."
+ },
+ "AngleSource": {
+ "instruction": "Drag or Click to create, first the source, then the direction.",
+ "description": "Point source with a given emission angle."
+ },
+ "Mirror": {
+ "title": "Segment",
+ "description": "Simulate the reflection of light on a mirror."
+ },
+ "otherMirror": {
+ "title": "Curved",
+ "description": "A mirror whose shape is curved. Can be circular, parabolic, or defined by a custom equation y = f(x)."
+ },
+ "ArcMirror": {
+ "title": "Circular Arc",
+ "description": "A mirror whose shape is part of a circle, which is defined by three points.",
+ "instruction": "Drag or click the two endpoints to create, then click a third point on the arc to define the curvature."
+ },
+ "ParabolicMirror": {
+ "title": "Parabolic",
+ "description": "A mirror whose shape is a parabola, which is defined by three points.",
+ "instruction": "Drag or click the two endpoints to create, then click the vertex."
+ },
+ "CustomMirror": {
+ "title": "Custom Equation",
+ "description": "A mirror whose shape is defined by a custom equation y = f(x), where (x,y) is in the transformed coordinates in which the two control points are (-1,0) and (1,0)."
+ },
+ "IdealMirror": {
+ "title": "Ideal curved mirror",
+ "description": "The idealized 'curved' mirror which obeys exactly the mirror equation (1/p + 1/q = 1/f). The focal length can be set directly."
+ },
+ "BeamSplitter": {
+ "title": "Beam Splitter",
+ "description": "A mirror that transmits a percentage of incoming light."
+ },
+ "PlaneGlass": {
+ "title": "Half-plane",
+ "description": "Simulate the refraction and reflection of light on a surface.",
+ "instruction": "Drag or click two points on the surface to create."
+ },
+ "otherGlass": {
+ "title": "Other shapes",
+ "description": "Glass with any shapes constructed from line segments and circular arcs, or shapes defined by a custom inequality f(x) < y < g(x)."
+ },
+ "CircleGlass": {
+ "title": "Circle",
+ "description": "Glass with a circle shape, defined by its center and a point on the surface."
+ },
+ "Glass": {
+ "title": "Polygon / Circular Arcs",
+ "description": "Glass with any shapes constructed from line segments and circular arcs.",
+ "instruction": "Click to create a segment, drag to create an arc, click on the starting point when finish drawing."
+ },
+ "CustomGlass": {
+ "title": "Custom Equation",
+ "description": "Glass with the shape defined by a custom inequality f(x) < y < g(x), where (x,y) is in the transformed coordinates in which the two control points are (-1,0) and (1,0)."
+ },
+ "IdealLens": {
+ "title": "Ideal Lens",
+ "description": "An ideal lens which obeys exactly the thin lens equation (1/p + 1/q = 1/f). The focal length can be set directly."
+ },
+ "SphericalLens": {
+ "title": "Spherical Lens",
+ "description": "A spherical lens, whose shape can be defined using various parameters."
+ },
+ "CircleGrinGlass": {
+ "title": "Gradient-index circle",
+ "description": "Glass with a custom refractive index function n(x,y) and a circular boundary."
+ },
+ "GrinGlass": {
+ "title": "Gradient-index polygon",
+ "description": "Glass with a custom refractive index function n(x,y) and a polygonal boundary.",
+ "instruction": "Click to create a segment, click on the starting point when finish drawing.",
+ "warning": "WARNING: Only simple polygons are supported, otherwise the behavior is unpredictable."
+ },
+ "otherGrinGlass": {
+ "title": "Gradient-index glass",
+ "description": "Material with a custom refractive index function n(x,y)."
+ },
+ "Blocker": {
+ "title": "Line Blocker",
+ "description": "A line-segment light blocker which absorbs the incident rays."
+ },
+ "CircleBlocker": {
+ "title": "Circle Blocker",
+ "description": "A circle light blocker which absorbs the incident rays."
+ },
+ "Aperture": {
+ "title": "Aperture",
+ "description": "A pair of light blockers which absorbs the incident rays. The size of the hole can be adjusted symmetrically.",
+ "instruction": "Drag or click the two endpoints to create."
+ },
+ "DiffractionGrating": {
+ "title": "Diffraction Grating",
+ "description": "A diffraction grating that splits light at an angle depending on wavelength.",
+ "warning": "Warning: The intensities of diffracted rays may not be accurate."
+ },
+ "Ruler": {
+ "title": "Ruler",
+ "description": "A ruler from a point for zero and another point."
+ },
+ "Protractor": {
+ "title": "Protractor",
+ "description": "A protractor defined from the center and another point for the zero direction. The scale is in degrees."
+ },
+ "Detector": {
+ "title": "Detector",
+ "description": "A tool for measuring the rate of energy flow (P), the rate of perpendicular momentum flow (F⊥), and the rate of parallel momentum flow (F∥) through a line segment. The units are arbitrary."
+ },
+ "TextLabel": {
+ "title": "Text",
+ "description": "A text label."
+ },
+ "LineArrow": {
+ "title": "Line / Arrow",
+ "description": "A line segment or arrow."
+ },
+ "Drawing": {
+ "title": "Drawing",
+ "description": "A freehand drawing tool.",
+ "instruction": "Drag to draw."
+ },
+ "moveView": {
+ "title": "Move view",
+ "description": "Drag to move the view. (Mouse right button drag has the same function.)"
+ },
+ "modules": {
+ "import": "Import Modules...",
+ "remove": "Remove module"
+ }
+ },
+ "view": {
+ "title": "View",
+ "rays": {
+ "title": "Rays",
+ "description": "Show the rays. When the 'Ray density' is high, they appear to be continuous."
+ },
+ "extended": {
+ "title": "Extended rays",
+ "description": "Show both the rays and its extension. Orange indicates backward extensions, and gray indicates forward ones.",
+ "simulateColorsNote": "When 'Simulate Colors' is on, they are shown in source colors and distinguished by dashing instead."
+ },
+ "images": {
+ "title": "All Images",
+ "description": "Show the position of all images. Yellow points indicate real images, orange indicates virtual images, and gray (none in this picture) indicates virtual objects. Note that some images cannot be detected if 'Ray density' is not high enough.",
+ "simulateColorsNote": "When 'Simulate Colors' is on, they are shown in source colors and distinguished by dot sizes instead."
+ },
+ "observer": {
+ "title": "Seen by Observer",
+ "description": "Simulate the rays and images seen from some position. The blue circle is the observer. Any rays crossing it are considered to be 'observed'. The observer does not know where the rays actually begin, but may think they begin at some point(s) if they intersect there. The rays are shown in blue, and the points in yellow (real) or orange (virtual).",
+ "simulateColorsNote": "When 'Simulate Colors' is on, they are shown in source colors instead.",
+ "instruction": "Drag the big blue dot to move the observer."
+ }
+ },
+ "simulateColors": {
+ "title": "Simulate Colors",
+ "description": "Simulate colors (wavelengths) of light sources, mixture of colors, color filtering of blockers and mirrors, and chromatic dispersion of glasses.",
+ "instruction": "You can set those parameters for those objects when selected. To simulate color spectra, overlap rays with different wavelengths.",
+ "warning": "The colors shown on the screen are only rough approximations, and can be very inaccurate when 'Ray density' is too high or too low."
+ },
+ "aboutPage": {
+ "description": "This project, including the gallery contents, is licensed under the [Apache License 2.0](/license), and is officially hosted on the [PhyDemo (phydemo.app)](/phydemo) website (formerly on ricktu288.github.io). The source code is [available on GitHub](/github), and you are [welcome to contribute](/contributing). If you have questions or suggestions, you can open [issues](/github/issues) or [discussions](/github/discussions) on GitHub, or email us at [ray-optics@phydemo.app](/email) if you do not use GitHub.",
+ "cite": "Cite this project",
+ "mainAuthors_one": "Main Author",
+ "mainAuthors_other": "Main Authors",
+ "contributors": "Contributors",
+ "contributorSorting": "GitHub contributors first; others sorted chronologically.",
+ "contributionCategories": {
+ "code": "code",
+ "uiDesign": "UI design",
+ "gallery": "gallery",
+ "module": "module",
+ "translations_one": "{{languages}} translation",
+ "translations_other": "{{languages}} translations"
+ }
+ },
+ "languageDropdown": {
+ "title": "Language: {{language}}",
+ "translatedFraction": "{{fraction}} translated"
+ }
+}
diff --git a/locales/en/modules.json b/locales/en/modules.json
new file mode 100644
index 00000000..10d895c7
--- /dev/null
+++ b/locales/en/modules.json
@@ -0,0 +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"
+ }
+ }
+}
\ No newline at end of file
diff --git a/locales/en/simulator.json b/locales/en/simulator.json
new file mode 100644
index 00000000..db5e5f77
--- /dev/null
+++ b/locales/en/simulator.json
@@ -0,0 +1,335 @@
+{
+ "welcome": {
+ "title": "Welcome to Ray Optics Simulation",
+ "instruction": "To add an optical component, select a tool and click the blank space.\nTo load an example, please [go to the Gallery page](/gallery).",
+ "loading": "Loading scene from URL... Please wait."
+ },
+ "common": {
+ "saveButton": "Save",
+ "cancelButton": "Cancel",
+ "defaultOption": "Default",
+ "closeButton": "Close"
+ },
+ "file": {
+ "title": "File",
+ "undo": {
+ "title": "Undo"
+ },
+ "redo": {
+ "title": "Redo"
+ },
+ "reset": {
+ "title": "Reset"
+ },
+ "save": {
+ "title": "Save"
+ },
+ "open": {
+ "title": "Open",
+ "description": "Open an existing file or background image. The background image will be shown from the coordinate origin. (Or drop the file)"
+ },
+ "export": {
+ "title": "Export as PNG/SVG"
+ },
+ "copyLink": {
+ "title": "Copy Shareable Link",
+ "description": "Copy and go to the direct URL for the current scene, which can be used for sharing (possibly via a URL shortener). Also see Settings -> Auto sync URL."
+ },
+ "viewGallery": {
+ "title": "View Gallery",
+ "description": "Go to the Gallery webpage to load an example."
+ }
+ },
+ "settings": {
+ "title": "Settings",
+ "more": "More",
+ "rayDensity": {
+ "title": "Ray Density",
+ "description": "Determines the number of rays to be emitted by beams and point sources. This also affects the accuracy of image detection and color rendering."
+ },
+ "layoutAids": {
+ "title": "Layout Aids",
+ "showGrid": "Grid",
+ "snapToGrid": "Snap to Grid",
+ "lockObjs": "Lock Objects"
+ },
+ "gridSize": {
+ "title": "Grid Size"
+ },
+ "observerSize": {
+ "title": "Observer Size"
+ },
+ "lengthScale": {
+ "title": "Length Scale",
+ "description": "If the default unit of length is too small or too large to model a physical system when interpreted as a common physical unit (e.g. millimeters), this factor can be used to scale the appearance (e.g. line widths) in the scene."
+ },
+ "zoom": {
+ "title": "Zoom"
+ },
+ "language": {
+ "title": "Language"
+ },
+ "autoSyncUrl": {
+ "title": "Auto sync URL",
+ "description": "When enabled, the URL will be updated automatically with the current scene, so you don't need to keep saving the scene manually. To set the title, use File -> Save -> Rename."
+ },
+ "showJsonEditor": {
+ "title": "Show JSON editor",
+ "description": "Show the code editor for the JSON representation of the scene, which is needed when creating a custom module (See Tools -> Other -> Import Modules -> Make custom modules)."
+ },
+ "showStatusBox": {
+ "title": "Show status box",
+ "description": "Show the status box, which includes the mouse coordinates, performance information, and the truncated brightness (the total brightness of the rays truncated in the infinite series of internal reflection)."
+ },
+ "showHelpPopups": {
+ "title": "Show help popups",
+ "description": "Defines whether to show help popups when hovering over buttons. (Reload the page to take effect.)"
+ },
+ "advancedHelp": "For advanced help, see the help icon in the lower-right corner."
+ },
+ "objBar": {
+ "showAdvanced": {
+ "title": "More options..."
+ },
+ "applyToAll": {
+ "title": "Apply to All"
+ },
+ "duplicate": {
+ "title": "Duplicate"
+ },
+ "delete": {
+ "title": "Delete"
+ },
+ "unselect": {
+ "title": "Unselect",
+ "description": "Unselect this object (Right-click on blank space has the same function.)"
+ }
+ },
+ "sceneObjs": {
+ "common": {
+ "lengthUnitInfo": "The unit of length used in this simulator (except for wavelengths) is an arbitrary unit, which can be interpreted as any physical unit (e.g. millimeters) as long as it is consistent throughout the simulation. If the unit appears too small or too large, please adjust Settings -> Length Scale.",
+ "brightness": "Brightness",
+ "brightnessInfo": {
+ "rayDensity": "Only effective if 'Ray Density' is high enough.",
+ "rayDensitySlider": "To control the numbers of rays emitted, please adjust the global 'Ray Density' slider instead."
+ },
+ "wavelength": "Wavelength",
+ "emisAngle": "Emission Angle",
+ "random": "Random",
+ "lambert": "Lambertian",
+ "focalLength": "Focal length",
+ "eqnInfo": {
+ "constants": "Supported constants",
+ "operators": "Supported operators",
+ "functions": "Supported functions"
+ },
+ "imageDetectionWarning": "This tool does not support image detection.",
+ "nonSimulateColorsWarning": "This tool only works when \"Simulate Color\" is on."
+ },
+ "Beam": {
+ "imageDetectionWarning": "Image detection may not work with divergent/random beams."
+ },
+ "AngleSource": {
+ "symmetric": "Symmetric"
+ },
+ "BaseFilter": {
+ "filter": "Filter",
+ "bandwidth": "Bandwidth",
+ "invert": "Invert"
+ },
+ "IdealMirror": {
+ "cartesianSign": "Cartesian Sign Convention"
+ },
+ "BeamSplitter": {
+ "transRatio": "Transmission Ratio"
+ },
+ "BaseGlass": {
+ "refIndex": "Refractive index",
+ "refIndexInfo": {
+ "relative": "Relative if inside another glass",
+ "effective": "If this object is to be simulated with (absolute) refractive index n₁, but is placed inside another glass with refractive index n₀, then you should set the refractive index to n₁/n₀ here. In more complicated cases that several glasses overlap together, the effective reflective index of the overlapping region equals the product of the reflective indices of individual ones."
+ },
+ "cauchyCoeff": "Cauchy coefficient"
+ },
+ "SphericalLens": {
+ "defBy": {
+ "radiiOfCurvature": "Radii of Curvature",
+ "focalDistances": "Focal Distances"
+ }
+ },
+ "BaseGrinGlass": {
+ "refIndexFnInfo": {
+ "constants": "Supported constants",
+ "operators": "Supported operators",
+ "functions": "Supported functions",
+ "lambda": "To simulate chromatic dispersion, use parameter {{lambda}} for the vacuum wavelength in nanometers.",
+ "diff": "Only supports differentiable functions.",
+ "origin": "The origin of n(x,y) is in the absolute coordinates and does not move with the object. You may double-click a control-point to inspect its absolute coordinates.",
+ "accuracy": "For a more accurate simulation, see \"More options...\""
+ },
+ "refIndexFnOrigin": "Origin of n(x,y)",
+ "stepSize": "Numerical solver step size",
+ "stepSizeInfo": "Step size of Euler's method for solving the eikonal ray equation - see 'step' function and documentation inside the 'BaseGrinGlass.js' file, for more information.",
+ "intersectTol": "Intersection tolerance",
+ "symbolicBodyMerging": "Symbolic body-merging",
+ "symbolicBodyMergingInfo": {
+ "all": "This toggle applies to all GRIN objects in the simulation.",
+ "impl": "This simulator has currently two implementations of light propagation between different mediums, for GRIN objects - numerical and symbolic (see 'multRefIndex' and 'devRefIndex' functions in 'BaseGrinGlass.js').",
+ "implNote": "The numerical implementation is faster but doesn't always work properly (depending on the specific case) in scenarios when used with more than one GRIN object, such that at least one of them has a refractive index function which is not defined in the entire plane, while the symbolic implementation is slower but robust to such problems."
+ }
+ },
+ "CircleGrinGlass": {
+ "epsInfo": {
+ "units": "Units - [length]^2.",
+ "functions": "This numerical tolerance is used in the functions 'isOutsideGlass', 'isInsideGlass' and 'isOnBoundary', inside the 'CircleGrinGlass.js' file."
+ }
+ },
+ "GrinGlass": {
+ "epsInfo": {
+ "units": "Units - [length].",
+ "functions": "This numerical tolerance is used in the functions 'isOnBoundary' and 'countIntersections', inside the 'GrinGlass.js' file."
+ }
+ },
+ "Aperature": {
+ "diameter": "Diameter"
+ },
+ "DiffractionGrating": {
+ "lineDensity": "Lines/{{lengthUnit}}",
+ "customBrightness": "Custom Brightness",
+ "customBrightnessInfo": "When on, the brightnesses of the diffracted rays are customized by an array of numbers corresponding to m = 0, 1, -1, 2, -2, .... The number is to be normalized to the brightness of the incident ray. The values not in the array are set to 0. For example, \"1, 0.5, 0.5\" means the m=0 ray has the same brightness as the incident ray, the m=1 and m=-1 rays have half the brightness, and all other rays are ignored.",
+ "slitRatio": "Slit width / line spacing",
+ "mirrored": "Mirrored"
+ },
+ "Ruler": {
+ "scaleInterval": "Scale interval"
+ },
+ "Detector": {
+ "info": {
+ "P": "P: The rate of energy flow (flux) in B/s (see below).",
+ "Fperp": "F⊥: The rate of perpendicular momentum flow in (B/s)/c.",
+ "Fpar": "F∥: The rate of parallel momentum flow in (B/s)/c.",
+ "irradiance": "The irradiance in the exported CSV is in (B/s)/L.",
+ "length": "L is the arbitrary unit of length used in this simulator.",
+ "B": "B is an arbitrary unit of radiant flux or luminous flux, corresponding to the unit of the \"Brightness\" option being B/L for non-Lambertian beams and 500B/360° for point sources.",
+ "s": "The dimensionless factor s is the \"Brightness Scale\" shown in Settings -> Show status box, which equals 1 when \"Ray Density\" is above some threshold and proportional to \"Ray Density\" otherwise.",
+ "truncation": "If some rays are truncated in the infinite series of internal reflection, the total truncation is shown as error estimates."
+ },
+ "irradMap": "Irradiance Map",
+ "binSize": "Bin Size",
+ "exportData": "Export data"
+ },
+ "TextLabel": {
+ "textHere": "Text Here",
+ "fontSize": "Font Size",
+ "font": "Font",
+ "fontStyle": "Style",
+ "fontStyles": {
+ "normal": "Normal",
+ "bold": "Bold",
+ "italic": "Italic",
+ "boldItalic": "Bold Italic",
+ "oblique": "Oblique",
+ "boldOblique": "Bold Oblique"
+ },
+ "alignment": "Alignment",
+ "alignments": {
+ "left": "Left",
+ "center": "Centre",
+ "right": "Right"
+ },
+ "smallCaps": "Small Caps",
+ "angle": "Angle"
+ },
+ "LineArrow": {
+ "arrow": "Forward arrow",
+ "backArrow": "Backward arrow"
+ },
+ "Drawing": {
+ "finishDrawing": "Finish Drawing"
+ },
+ "ModuleObj": {
+ "module": "Module",
+ "demodulize": "Demodulize"
+ },
+ "Handle": {
+ "handle": "Handle",
+ "transformation": "Transformation",
+ "transformations": {
+ "translation": "Translation",
+ "xTranslation": "X Translation",
+ "yTranslation": "Y Translation",
+ "rotation": "Rotation",
+ "scaling": "Scaling"
+ }
+ },
+ "CropBox": {
+ "title": "Export",
+ "cropBoxSize": "Crop Box Size",
+ "format": "Format",
+ "width": "Width",
+ "rayCountLimit": "Ray count limit",
+ "svgWarning": "Export to SVG: Color mixtures and relative refractive indices below 1 are not supported.",
+ "rayCountWarning": "The current number of rays in the scene is larger than the ray count limit. You may need to increase the ray count limit in the Crop Box options."
+ }
+ },
+ "saveModal": {
+ "title": "Save",
+ "description": {
+ "autoSync": "You may use Settings -> Auto sync URL instead of saving to a file.",
+ "rename": "Click \"Rename\" to change the title without saving to a file.",
+ "contribute": "You may consider [contributing a new item](/contributing/gallery) to the [Gallery](/gallery)."
+ },
+ "fileName": "Name",
+ "rename": "Rename"
+ },
+ "moduleModal": {
+ "title": "Import Modules",
+ "makeCustomModules": "Make custom modules",
+ "conflict": "A different module with the same name already exists in the current scene. You may enter a new name, or leave it the same to overwrite the existing module."
+ },
+ "languageModal": {
+ "title": "Language",
+ "translatedFraction": "translated",
+ "helpTranslate": "Help us translate this app"
+ },
+ "generalWarnings": {
+ "shareLinkTooLong": "The URL is too long that it may not work on some platforms. You may need to use \"Save\" and share the file instead.",
+ "autoSyncUrlTooLarge": "The scene is too large to sync with URL. Please save it manually.",
+ "identicalObjects": "There are two identical optical elements in the scene that overlap completely. This may cause unexpected behavior.",
+ "brightnessInconsistent": "The brightnesses of two or more light sources saturate with inconsistent ratios. This may lead to wrong detector readings and color rendering. Please increase the ray density or reduce the brightnesses of the light sources."
+ },
+ "statusBox": {
+ "rayCount": "Number of ray segments",
+ "totalTruncation": "Truncated brightness",
+ "brightnessScale": "Brightness Scale",
+ "timeElapsed": "Time elapsed",
+ "forceStopped": "Force stopped.",
+ "mouseCoordinates": "Mouse coordinates"
+ },
+ "footer": {
+ "processing": "Processing... Click here to stop.",
+ "helpPopup": {
+ "constrainedDragging": {
+ "title": "Constrained dragging",
+ "description": "When dragging an object, hold Shift to limit to horizontal/vertical; hold Ctrl to clone. When creating a line-shaped object or dragging its endpoints, hold Shift to lock the angle or snap to 0°, 45°, 90°; hold Ctrl to rotate/scale about its center."
+ },
+ "groupRotateScale": {
+ "title": "Group, rotate, and scale objects",
+ "description": "Hold Ctrl, click several control points (e.g. endpoints), then click empty space to group these points and create a handle. Drag the handle (or press arrow keys) to move the group; Shift+drag to limit to horizontal/vertical; Ctrl+drag to rotate the group, Ctrl+Shift+drag to scale the group. Drag the \"+\" to set rotation/scaling center. Click the handle and press Ctrl+D to duplicate the group; press Delete to ungroup."
+ },
+ "editCoordinates": {
+ "title": "Edit coordinates directly",
+ "description": "Double-click or right-click the control point (e.g. endpoint) of the object, edit the (x,y) coordinates, then press Enter."
+ },
+ "keyboardShortcuts": {
+ "title": "Keyboard shortcuts",
+ "description": "When an object is selected (by clicking it), press arrow keys to move the object; Ctrl+D to duplicate the object; Delete key to delete the object."
+ },
+ "contactUs": {
+ "title": "Contact Us",
+ "description": "The suggested way is to go to [Discussions](/github/discussions) or [Issues](/github/issues) on GitHub. If you do not use GitHub, you can also email us at [ray-optics@phydemo.app](/email).",
+ "contribute": "Direct contributions are also welcome (see [the contribution guide](/contributing))."
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/locales/es.json b/locales/es.json
deleted file mode 100644
index 8e9f730b..00000000
--- a/locales/es.json
+++ /dev/null
@@ -1,914 +0,0 @@
-{
- "appName": {
- "message": "Simulador - Simulación de trazado de rayos"
- },
- "appShortName": {
- "message": "Óptica de rayos"
- },
- "appDesc": {
- "message": "Una aplicación web gratuita y de código libre para crear y simular escenas 2D de óptica geométrica."
- },
- "homepage_desc": {
- "message": "Crear y simular escenas 2D de óptica geométrica de manera interactiva. Totalmente gratuito y basado en web. El código fuente está disponible en GitHub."
- },
- "launch_simulator": {
- "message": "Iniciar simulador"
- },
- "home": {
- "message": "Inicio"
- },
- "home_url": {
- "message": "https://phydemo.app/ray-optics/es/"
- },
- "gallery": {
- "message": "Galería"
- },
- "gallery_url": {
- "message": "https://phydemo.app/ray-optics/gallery/"
- },
- "welcome": {
- "message": "Bienvenido a la simulación de Óptica de rayos Para añadir un componente óptico, seleccione una herramienta y presione el espacio en blanco. Para cargar un ejemplo, por favor, diríjase a la página de la galería."
- },
- "loading_msg": {
- "incomplete": true,
- "message": "Welcome to Ray Optics Simulation Loading scene from URL... Please wait."
- },
- "toolbar_title": {
- "message": "Herramienta: "
- },
- "toolname_SingleRay": {
- "message": "Rayo único"
- },
- "toolname_AngleSource": {
- "message": "Fuente puntual"
- },
- "toolname_PointSource": {
- "message": "Fuente puntual"
- },
- "toolname_Beam": {
- "message": "Rayo"
- },
- "toolname_mirror_": {
- "message": "Espejo"
- },
- "toolname_Mirror": {
- "message": "Espejo"
- },
- "toolname_ArcMirror": {
- "message": "Espejo"
- },
- "toolname_ParabolicMirror": {
- "message": "Espejo"
- },
- "toolname_CustomMirror": {
- "message": "Espejo"
- },
- "toolname_IdealMirror": {
- "message": "Espejo curvo ideal"
- },
- "toolname_glass_": {
- "message": "Vidrio"
- },
- "toolname_blocker_": {
- "message": "Bloqueador"
- },
- "toolname_BeamSplitter": {
- "message": "Separador de haz"
- },
- "toolname_PlaneGlass": {
- "message": "Vidrio"
- },
- "toolname_CircleGlass": {
- "message": "Vidrio"
- },
- "toolname_CircleGrinGlass": {
- "message": "Círculo con gradiente de índice"
- },
- "toolname_Glass": {
- "message": "Arcos poligonales/ circulares"
- },
- "toolname_GrinGlass": {
- "message": "Polígono con gradiente de índice"
- },
- "toolname_IdealLens": {
- "message": "Lente ideal"
- },
- "toolname_SphericalLens": {
- "message": "Lente esférica"
- },
- "toolname_CustomGlass": {
- "message": "Vidrio"
- },
- "toolname_Blocker": {
- "message": "Bloqueador recto"
- },
- "toolname_Aperture": {
- "message": "Apertura"
- },
- "toolname_CircleBlocker": {
- "message": "Bloqueador circular"
- },
- "toolname_DiffractionGrating": {
- "incomplete": true,
- "message": "Diffraction GratingBeta"
- },
- "toolname_Ruler": {
- "message": "Regla"
- },
- "toolname_Protractor": {
- "message": "Transportador"
- },
- "tool_Detector": {
- "message": "Detector"
- },
- "toolname_Detector": {
- "message": "Detector"
- },
- "toolname_TextLabel": {
- "message": "Texto"
- },
- "toolname_LineArrow": {
- "message": "Línea"
- },
- "toolname_Drawing": {
- "message": "Dibujar"
- },
- "toolname_Handle": {
- "incomplete": true,
- "message": "Handle"
- },
- "toolname_CropBox": {
- "message": "Exportar"
- },
- "toolname_ModuleObj": {
- "incomplete": true,
- "message": "ModuleBeta"
- },
- "tool_more_": {
- "message": "Otros"
- },
- "toolname_": {
- "message": "Mover vista"
- },
- "modebar_title": {
- "message": "Ver:"
- },
- "modename_light": {
- "message": "Rayos"
- },
- "modename_extended_light": {
- "message": "Rayos extendidos"
- },
- "modename_images": {
- "message": "Todas las imágenes"
- },
- "modename_observer": {
- "message": "Visto por un observador"
- },
- "simulateColors": {
- "message": "Simular colores"
- },
- "File: ": {
- "message": "Archivo"
- },
- "Tools: ": {
- "message": "Herramientas"
- },
- "tool_SingleRay": {
- "message": "Rayo único"
- },
- "tool_Beam": {
- "message": "Haz"
- },
- "tool_PointSource": {
- "message": "Fuente puntual (360°)"
- },
- "tool_AngleSource": {
- "message": "Fuente puntual (<360°)"
- },
- "tool_PointSource_": {
- "message": "Fuente puntual"
- },
- "tool_lightSource_": {
- "message": "Fuente de luz"
- },
- "tool_mirror_": {
- "message": "Espejo"
- },
- "tool_Mirror": {
- "message": "Segmento"
- },
- "tool_ArcMirror": {
- "message": "Arco circular"
- },
- "tool_ParabolicMirror": {
- "message": "Parabólico"
- },
- "tool_CustomMirror": {
- "message": "Ecuación personalizada"
- },
- "tool_BeamSplitter": {
- "message": "Separador de haz"
- },
- "tool_IdealMirror": {
- "message": "Curvo ideal"
- },
- "tool_glass_": {
- "message": "Vidrio"
- },
- "tool_blocker_": {
- "message": "Bloqueador"
- },
- "tool_PlaneGlass": {
- "message": "Semi-plano"
- },
- "tool_CircleGlass": {
- "message": "Círculo"
- },
- "tool_CircleGrinGlass": {
- "message": "Círculo"
- },
- "tool_Glass": {
- "message": "Forma libre"
- },
- "tool_GrinGlass": {
- "message": "Forma libre"
- },
- "tool_IdealLens": {
- "message": "Lente ideal"
- },
- "tool_SphericalLens": {
- "message": "Lente esférica"
- },
- "tool_CustomGlass": {
- "message": "Ecuación personalizada"
- },
- "tool_Blocker": {
- "message": "Bloqueador recto"
- },
- "tool_Aperture": {
- "message": "Apertura"
- },
- "tool_CircleBlocker": {
- "message": "Bloqueador circular"
- },
- "tool_DiffractionGrating": {
- "incomplete": true,
- "message": "Diffraction GratingBeta"
- },
- "tool_Ruler": {
- "message": "Regla"
- },
- "tool_Protractor": {
- "message": "Transportador"
- },
- "tool_TextLabel": {
- "message": "Texto"
- },
- "tool_LineArrow": {
- "message": "Línea / Flecha"
- },
- "tool_Drawing": {
- "message": "Dibujar"
- },
- "tool_": {
- "message": "Mover vista"
- },
- "View: ": {
- "message": "Vista"
- },
- "Settings: ": {
- "message": "Ajustes"
- },
- "moresettings": {
- "message": "Más"
- },
- "mode_rays": {
- "message": "Rayos"
- },
- "mode_extended": {
- "message": "Rayos extendidos"
- },
- "mode_images": {
- "message": "Todas las imágenes"
- },
- "mode_observer": {
- "message": "Visto por el observador"
- },
- "zoom": {
- "message": "Zoom"
- },
- "help": {
- "message": "Ayuda"
- },
- "rayDensity": {
- "message": "Densidad de rayos"
- },
- "raydensity": {
- "message": "Densidad de rayos:"
- },
- "undo": {
- "message": "Deshacer"
- },
- "redo": {
- "message": "Rehacer"
- },
- "reset": {
- "message": "Restablecer"
- },
- "save": {
- "message": "Guardar"
- },
- "rename": {
- "incomplete": true,
- "message": "Rename"
- },
- "get_link": {
- "message": "Copiar enlace compartible"
- },
- "export_svg": {
- "message": "Exportar como PNG/SVG"
- },
- "view_gallery": {
- "message": "Ver galería"
- },
- "save_name": {
- "message": "Nombre"
- },
- "save_cancel": {
- "message": "Cancelar"
- },
- "save_description": {
- "incomplete": true,
- "message": "
You may use Settings -> Auto sync URL instead of saving to a file.
Click \"Rename\" to change the title without saving to a file.
"
- },
- "open": {
- "message": "Abrir"
- },
- "layoutaids": {
- "message": "Ayuda con el diseño"
- },
- "lockObjs": {
- "message": "Bloquear objetos"
- },
- "showGrid": {
- "message": "Cuadrícula"
- },
- "snapToGrid": {
- "message": "Ajustar a la cuadrícula"
- },
- "snaptogrid": {
- "message": "Ajustar a la cuadrícula"
- },
- "length_unit_popover": {
- "incomplete": true,
- "message": "The unit of length used in this simulator (except for wavelengths) is an arbitrary unit, which can be interpreted as any physical unit (e.g. millimeters) as long as it is consistent throughout the simulation. If the unit appears too small or too large, please adjust Settings -> Length Scale."
- },
- "lengthScale": {
- "incomplete": true,
- "message": "Length ScaleBeta"
- },
- "lengthScale_popover": {
- "incomplete": true,
- "message": "If the default unit of length is too small or too large to model a physical system when interpreted as a common physical unit (e.g. millimeters), this factor can be used to scale the appearance (e.g. line widths) in the scene."
- },
- "brightness": {
- "message": "Brillo"
- },
- "wavelength": {
- "message": "Longitud de onda (nm)"
- },
- "dichroic": {
- "message": "Dicroico"
- },
- "filter": {
- "message": "Filtro"
- },
- "bandwidth": {
- "message": "Ancho de banda (nm)"
- },
- "invert": {
- "message": "Invertir"
- },
- "emisAngle": {
- "message": "Angulo de emisión (°)"
- },
- "mirrored": {
- "incomplete": true,
- "message": "Mirrored"
- },
- "lineDensity": {
- "incomplete": true,
- "message": "Lines/mm"
- },
- "slitRatio": {
- "incomplete": true,
- "message": "Slit width / line spacing"
- },
- "customBrightness": {
- "incomplete": true,
- "message": "Custom Brightness"
- },
- "customBrightness_note_popover": {
- "incomplete": true,
- "message": "When on, the brightnesses of the diffracted rays are customized by an array of numbers corresponding to m = 0, 1, -1, 2, -2, .... The number is to be normalized to the brightness of the incident ray. The values not in the array are set to 0. For example, \"1, 0.5, 0.5\" means the m=0 ray has the same brightness as the incident ray, the m=1 and m=-1 rays have half the brightness, and all other rays are ignored."
- },
- "symmetric": {
- "message": "Simétrico"
- },
- "eqn_note": {
- "incomplete": true,
- "message": "
Supported constants: pi e
Supported operators: + - * / ^
Supported functions: sqrt sin cos tan sec csc cot sinh cosh tanh log exp arcsin arccos arctan arcsinh arccosh arctanh floor round ceil trunc sgn max min abs
Supported functions: sqrt sin cos tan sec csc cot sinh cosh tanh log arcsin arccos arctan
To simulate chromatic dispersion, use parameter lambda for the vacuum wavelength in nanometers.Beta
Only supports differentiable functions.
The origin of n(x,y) is in the absolute coordinates and does not move with the object. You may double-click a control-point to inspect its absolute coordinates.
For a more accurate simulation, see \"More options...\"
Esta opción se aplica a todos los objetos GRIN de la simulación.
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 'CircleGrinGlass.js').
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.
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.
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 'grin_ciclelens.js' para más información.
Esta tolerancia numérica se usa en las funciones 'isOnBoundary' y 'countIntersections', dentro del archivo 'GrinGlass.js'.
"
- },
- "cauchyCoeff": {
- "message": "Coeficiente de Cauchy"
- },
- "transRatio": {
- "message": "Cociente de transmisión"
- },
- "applytoall": {
- "message": "Aplicar a todos"
- },
- "duplicate": {
- "message": "Duplicar"
- },
- "delete": {
- "message": "Borrar"
- },
- "unselect": {
- "message": "Deseleccionar"
- },
- "unselect_popover": {
- "message": "Deseleccionar este objecto (click derecho en un espacio en blanco tiene la misma función.)"
- },
- "showadvanced": {
- "message": "Más opciones..."
- },
- "processing": {
- "message": "Procesando... Click aquí para detener."
- },
- "contribute": {
- "message": "Contribuir"
- },
- "github": {
- "message": "GitHub"
- },
- "about": {
- "message": "Acerca de"
- },
- "about_url": {
- "message": "https://phydemo.app/ray-optics/about"
- },
- "translate": {
- "message": "Ayúdenos a traducir esta aplicación"
- },
- "translated": {
- "message": "traducida"
- },
- "undo_popover": {
- "message": "Deshacer última acción. (Ctrl+Z)"
- },
- "redo_popover": {
- "message": "Rehacer última acción. (Ctrl+Y)"
- },
- "reset_popover": {
- "message": "Restablecer todos los cambios."
- },
- "save_popover": {
- "message": "Guardar la escena actual como un archivo."
- },
- "open_popover": {
- "message": "Abrir un archivo existente o una imagen de fondo. La imagen de fondo se mostrará desde el origen de coordenadas. (O arrastre el archivo)."
- },
- "get_link_popover": {
- "incomplete": true,
- "message": "Copy and go to the direct URL for the current scene, which can be used for sharing (possibly via a URL shortener). Also see Settings -> Auto sync URL."
- },
- "get_link_warning": {
- "message": "La URL es demasiado larga y posiblemente no funcione en algunas plataformas. Posiblemente deba usar \"Guardar\" y compartir el archivo."
- },
- "export_svg_warning": {
- "message": "Exportar a SVG. Las mezclas de color y indices de refracción relativos por debajo de 1 no están soportados."
- },
- "export_ray_count_warning": {
- "incomplete": true,
- "message": "The current number of rays in the scene is larger than the ray count limit. You may need to increase the ray count limit in the Crop Box options."
- },
- "view_gallery_popover": {
- "message": "Ir a la Galería para cargar un ejemplo."
- },
- "tool_SingleRay_popover": {
- "message": "Un único rayo de luz definido mediante dos puntos. (Arrastre o clique para crear. El primer punto es la fuente, emitiendo en dirección al segundo punto.)"
- },
- "tool_Beam_popover": {
- "message": "Un haz de rayos paralelo o divergente emerge de un segmento de recta, con una densidad controlada por el deslizante 'Densidad de rayos' (Arrastre o clique para crear.)"
- },
- "tool_PointSource_popover": {
- "message": "Los rayos emergen de un único punto, con un número controlado por el deslizante 'Densidad de rayos'. (Clique para crear)."
- },
- "tool_AngleSource_popover": {
- "message": "Fuente puntual con un ángulo de emisión dado."
- },
- "tool_Mirror_popover": {
- "message": "Simular la reflexión de la luz en un espejo. (Arrastre o clique para crear)."
- },
- "tool_ArcMirror_popover": {
- "message": "Un espejo cuya forma es parte de un círculo, el cual está definido por tres puntos. (Arrastre o clique para crear. Los dos primeros puntos definen el espacio entre los bordes del arco. El último define el tamaño del arco.)"
- },
- "tool_ParabolicMirror_popover": {
- "message": "Un espejo cuya forma es una parábola, la cual está definida pr tres puntos. (Arrastre o clique para crear.)"
- },
- "tool_CustomMirror_popover": {
- "message": "Un espejo cuya forma está definida por una ecuación de la forma y = f(x), donde (x,y) está en las coordenadas transformadas donde los dos puntos de control son (-1,0) y (1,0). (Arrastre o clique para crear.)"
- },
- "tool_BeamSplitter_popover": {
- "message": "Un espejo que transmite un porcentaje de la luz incidente. (Arrastre o clique para crear.)"
- },
- "tool_IdealMirror_popover": {
- "message": "Un espejo 'curvo' ideal que obedece exactamente la ecuación del espejo (1/p + 1/q = 1/f). La longitud focal puede establecerse directamente. (Arrastre o clique para crear.)"
- },
- "tool_PlaneGlass_popover": {
- "message": "Simular la refracción y la reflexión de luz sobre una superficie. (Arrastre o clique para crear.)"
- },
- "tool_CircleGlass_popover": {
- "message": "Vidrio con una forma circular, definida mediante su centro y un punto sobre la superficie. (Arrastre o clique para crear.)"
- },
- "tool_CircleGrinGlass_popover": {
- "message": "Vidrio con una función de índice refractivo n(x,y) y un borde circular. (Arrastre o clique para crear.)"
- },
- "tool_Glass_popover": {
- "message": "Vidrio con cualquier forma construida mediante segmentos de línea o arco. (Clique para crear un segmento, arrastre para crear un arco, clique en el punto de inicio cuando haya finalizado el dibujo.)"
- },
- "tool_GrinGlass_popover": {
- "message": "Vidrio con una función de índice de refracción n(x,y) y un borde poligonal. ATENCIÓN: Sólo se soportan polígonos simples, de otro modo el comportamiento es impredecible. (Clique para crear un segmento, clique en el punto de inicio cuando haya finalizado el dibujo.)"
- },
- "tool_IdealLens_popover": {
- "message": "Una lente ideal que obedece exactamente la ecuación de las lentes delgadas (1/p + 1/q = 1/f). La longitud focal se puede establecer directamente. (Arrastre o clique para crear.)"
- },
- "tool_SphericalLens_popover": {
- "message": "Una lente esférica. (Click para crear.)"
- },
- "tool_CustomGlass_popover": {
- "message": "Vidrio con una forma definida por una desigualdad f(x) < y < g(x), donde (x,y) está en las coordenadas transformadas donde los dos puntos de control son (-1,0) y (1,0). (Arrastre o clique para crear.)"
- },
- "tool_Blocker_popover": {
- "message": "Un bloqueador de luz recto que absorbe los rayos incidentes. (Arrastre o clique para crear.)"
- },
- "tool_Aperture_popover": {
- "message": "Un par de bloqueadores de luz que absorben los rayos incidentes. El tamaño del agujero puede ajustarse simétricamente. (Arrastre o clique los dos puntos extremales para crear.)"
- },
- "tool_CircleBlocker_popover": {
- "message": "Un bloqueador de luz circular que absorbe los rayos incidentes. (Arrastre o clique para crear.)"
- },
- "tool_DiffractionGrating_popover": {
- "incomplete": true,
- "message": "A diffraction grating that splits light at an angle depending on wavelength. Warning: The intensities of diffracted rays may not be accurate. (Drag or click to create.)"
- },
- "tool_Ruler_popover": {
- "message": "Una regla desde un punto cero hasta otro punto. (Arrastre o clique para crear.)"
- },
- "tool_Protractor_popover": {
- "message": "Un transportador definido desde el centro y otro punto para la dirección cero. La escala está en grados. (Arrastre o clique para crear.)"
- },
- "tool_Detector_popover": {
- "message": "Una herramienta para medir el flujo de energía (P), el momento perpendicular de flujo (F⊥), y el momento paralelo de flujo (F∥) a través de un segmento de recta. (Arrastre o clique para crear el segmento de recta.) Las unidades son arbitrarias."
- },
- "tool_Detector_info_popover": {
- "incomplete": true,
- "message": "
P: The rate of energy flow (flux) in B/s (see below).
F⊥: The rate of perpendicular momentum flow in (B/s)/c.
F∥: The rate of parallel momentum flow in (B/s)/c.
The irradiance in the exported CSV is in (B/s)/L.
L is the arbitrary unit of length used in this simulator.
B is an arbitrary unit of radiant flux or luminous flux, corresponding to the unit of the \"Brightness\" option being B/L for non-Lambertian beams and 500B/360° for point sources.
The dimensionless factor s is the \"Brightness Scale\" shown in Settings -> Show status box, which equals 1 when \"Ray Density\" is above some threshold and proportional to \"Ray Density\" otherwise.
If some rays are truncated in the infinite series of internal reflection, the total truncation is shown as error estimates.
"
- },
- "tool_TextLabel_popover": {
- "message": "Un cuadro de texto."
- },
- "tool_LineArrow_popover": {
- "message": "Un segmento de recta o flecha. (Arrastre o clique para crear.)"
- },
- "tool_Drawing_popover": {
- "message": "Una herramienta para dibujar a mano alzada. (Arrastre para dibujar.)"
- },
- "tool__popover": {
- "message": "Arrastre para mover la vista. (El botón derecho del ratón tiene la misma función.)"
- },
- "mode_rays_popover": {
- "message": "Mostrar los rayos. Cuando la 'Densidad de rayos' es elevada, estos parecen continuos."
- },
- "mode_extended_popover": {
- "message": "Mostrar los rayos y su extensión. El color naranja indica extensiones hacia atrás, y el gris indica hacia delante. Cuando 'Simular colores' está seleccionado, estos se muestran en los colores de la fuente y se distinguen por un trazo discontinuo."
- },
- "mode_images_popover": {
- "message": "Mostrar la posición de todas las imágenes. Los puntos amarillos indican imágenes reales, naranjas indican imágenes virtuales, y grises (ninguno en esta figura) indican objetos virtuales. Cabe notar que algunas imágenes no se pueden detectar si 'Densidad de rayos' no es suficientemente elevada. Cuando 'Simular colores' está seleccionado estos se muestran en los colores de la fuente y se distinguen por el tamaño del punto."
- },
- "mode_observer_popover": {
- "message": "Simular los rayos y las imágenes vistos desde una posición. El circulo azul es el observador. Cualquier rayo que lo cruce se considera 'observado'. El observador no sabe donde inician los rayos, pero puede pensar que tienen inicio en algún(os) punto(s) si se intersectan ahí. Los rayos se muestran en azul, y los puntos en amarillo (reales) o naranja (virtuales). (Arrastre el punto azul grande para mover al observador.) Cuando 'Simular colores' está seleccionado, se muestran en los colores de la fuente."
- },
- "simulateColors_popover": {
- "message": "Simular colores (longitudes de onda), mezclas de colores, filtros de color de bloqueadores y espejos y dispersión cromática de vidrios. Puede ajustar los parámetros de estos objetos cuando los seleccione. Para simular el espectro de colores, sobreponga rayos con diferentes longitudes de onda. Los colores mostrados en pantalla son solo aproximaciones burdas y puede ser muy impreciso cuando 'Densidad de rayos' es demasiado alta o demasiado baja."
- },
- "rayDensity_popover": {
- "message": "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."
- },
- "showGrid_popover": {
- "message": "Define la visibilidad de la cuadrícula de fondo."
- },
- "grid_popover": {
- "message": "Define si ajustar a la cuadrícula."
- },
- "lockObjs_popover": {
- "message": "Define si los objetos pueden ser movidos o no."
- },
- "zoom_popover": {
- "message": "Zoom de la vista con porcentaje."
- },
- "help_popover": {
- "incomplete": true,
- "message": "Constrained dragging
When dragging an object, hold Shift to limit to horizontal/vertical; hold Ctrl to clone. When creating a line-shaped object or dragging its endpoints, hold Shift to lock the angle or snap to 0°, 45°, 90°; hold Ctrl to rotate/scale about its center.
Group, rotate, and scale objects
Hold Ctrl, click several control points (e.g. endpoints), then click empty space to group these points and create a handle. Drag the handle (or press arrow keys) to move the group; Shift+drag to limit to horizontal/vertical; Ctrl+drag to rotate, Ctrl+Shift+drag to scale. Drag the \"+\" to set rotation/scaling center. Click the handle and press Ctrl+D to duplicate the group; press Delete to ungroup.
Edit coordinates directly
Double-click or right-click the control point (e.g. endpoint) of the object, edit the (x,y) coordinates, then press Enter.
Keyboard shortcuts
When an object is selected (by clicking it), press arrow keys to move; Ctrl+D to duplicate; Delete key to delete.
"
- },
- "show_help_popups": {
- "message": "Mostrar ventanas de ayuda"
- },
- "show_help_popups_popover": {
- "message": "Definir si mostrar ventanas de ayuda al pasar sobre los botones (Volver a cargar las páginas para que tome efecto.)"
- },
- "show_json_editor": {
- "incomplete": true,
- "message": "Show JSON editorBeta"
- },
- "show_json_editor_popover": {
- "incomplete": true,
- "message": "Show the code editor for the JSON representation of the scene, which is needed when creating a custom module (See Tools -> Other -> Import Modules -> Make custom modules)."
- },
- "show_status": {
- "message": "Mostrar diálogo de estado"
- },
- "show_status_popover": {
- "incomplete": true,
- "message": "Show the status box, which includes the mouse coordinates, performance information, and the truncated brightness (the total brightness of the rays truncated in the infinite series of internal reflection)."
- },
- "auto_sync_url": {
- "incomplete": true,
- "message": "Auto sync URL"
- },
- "auto_sync_url_popover": {
- "incomplete": true,
- "message": "When enabled, the URL will be updated automatically with the current scene, so you don't need to keep saving the scene manually. To set the title, use File -> Save -> Rename."
- },
- "auto_sync_url_warning": {
- "incomplete": true,
- "message": "The scene is too large to sync with URL. Please save it manually."
- },
- "gridSize": {
- "message": "Tamaño de la cuadrícula"
- },
- "observer_size": {
- "message": "Tamaño del observador"
- },
- "language": {
- "message": "Idioma"
- },
- "close": {
- "message": "Cerrar"
- },
- "advanced_help": {
- "message": "Para ayuda avanzada, vea el icono de ayuda en la esquina inferior derecha."
- },
- "ray_count": {
- "message": "Número de segmentos de rayo: "
- },
- "total_truncation": {
- "message": "Brillo truncado: "
- },
- "brightness_scale": {
- "incomplete": true,
- "message": "Brightness Scale: "
- },
- "time_elapsed": {
- "message": "Tiempo transcurrido (ms): "
- },
- "force_stopped": {
- "message": "Fuerza detenida."
- },
- "mouse_coordinates": {
- "incomplete": true,
- "message": "Mouse coordinates: "
- },
- "modules_tutorial": {
- "incomplete": true,
- "message": "Make custom modules"
- },
- "modules_tutorial_url": {
- "incomplete": true,
- "message": "https://phydemo.app/ray-optics/modules/tutorial"
- },
- "identical_optical_objects_warning": {
- "incomplete": true,
- "message": "There are two identical optical elements in the scene that overlap completely. This may cause unexpected behavior."
- },
- "import_modules": {
- "incomplete": true,
- "message": "Import Modules..."
- },
- "import_modules_title": {
- "incomplete": true,
- "message": "Import Modules"
- },
- "modules_url": {
- "incomplete": true,
- "message": "../modules/modules.html"
- },
- "remove_module": {
- "incomplete": true,
- "message": "Remove module"
- },
- "module_conflict": {
- "incomplete": true,
- "message": "A different module with the same name already exists in the current scene. You may enter a new name, or leave it the same to overwrite the existing module."
- },
- "brightness_inconsistent_warning": {
- "incomplete": true,
- "message": "The brightnesses of two or more light sources saturate with inconsistent ratios. This may lead to wrong detector readings and color rendering. Please increase the ray density or reduce the brightnesses of the light sources."
- }
-}
\ No newline at end of file
diff --git a/locales/es/main.json b/locales/es/main.json
new file mode 100644
index 00000000..b4dd4e74
--- /dev/null
+++ b/locales/es/main.json
@@ -0,0 +1,204 @@
+{
+ "meta": {
+ "languageName": "Español",
+ "parentheses": "{{main}} ({{sub}})",
+ "colon": "{{name}}: {{value}}",
+ "list": "{{first}}, {{others}}"
+ },
+ "project": {
+ "name": "Simulación de trazado de rayos",
+ "shortName": "Óptica de rayos",
+ "description": "Una aplicación web gratuita y de código libre para crear y simular escenas 2D de óptica geométrica."
+ },
+ "pages": {
+ "simulator": "Simulador",
+ "home": "Inicio",
+ "gallery": "Galería",
+ "about": "Acerca de",
+ "github": "GitHub"
+ },
+ "homePage": {
+ "description": "Crear y simular escenas 2D de óptica geométrica de manera interactiva.\nTotalmente gratuito y basado en web. El código fuente está [disponible en GitHub](/github).",
+ "launchSimulator": "Iniciar simulador"
+ },
+ "tools": {
+ "title": "Herramientas",
+ "categories": {
+ "lightSource": "Fuente de luz",
+ "mirror": "Espejo",
+ "glass": "Vidrio",
+ "blocker": "Bloqueador",
+ "other": "Otros"
+ },
+ "common": {
+ "clickInstruction": "Clique para crear.",
+ "lineInstruction": "Arrastre o clique para crear.",
+ "circleInstruction": "Arrastre o clique para crear."
+ },
+ "SingleRay": {
+ "title": "Rayo único",
+ "description": "Un único rayo de luz definido mediante dos puntos.",
+ "instruction": "Arrastre o clique para crear. El primer punto es la fuente, emitiendo en dirección al segundo punto."
+ },
+ "Beam": {
+ "title": "Haz",
+ "description": "Un haz de rayos paralelo o divergente emerge de un segmento de recta, con una densidad controlada por el deslizante 'Densidad de rayos'"
+ },
+ "PointSource": {
+ "title": "Fuente puntual",
+ "description": "Los rayos emergen de un único punto, con un número controlado por el deslizante 'Densidad de rayos'."
+ },
+ "AngleSource": {
+ "instruction": "Arrastre o clique para crear. El primer punto es la fuente, emitiendo en dirección al segundo punto.",
+ "description": "Fuente puntual con un ángulo de emisión dado."
+ },
+ "Mirror": {
+ "title": "Segmento",
+ "description": "Simular la reflexión de la luz en un espejo."
+ },
+ "otherMirror": {
+ "title": "Curvado",
+ "description": "Un espejo cuya forma es curva. Puede ser circular, parabólico o definido mediante una ecuación de la forma y = f(x)."
+ },
+ "ArcMirror": {
+ "title": "Arco circular",
+ "description": "Un espejo cuya forma es parte de un círculo, el cual está definido por tres puntos.",
+ "instruction": "Arrastre o clique para crear. Los dos primeros puntos definen el espacio entre los bordes del arco. El último define el tamaño del arco."
+ },
+ "ParabolicMirror": {
+ "title": "Parabólico",
+ "description": "Un espejo cuya forma es una parábola, la cual está definida pr tres puntos.",
+ "instruction": "Arrastre o clique para crear."
+ },
+ "CustomMirror": {
+ "title": "Ecuación personalizada",
+ "description": "Un espejo cuya forma está definida por una ecuación de la forma y = f(x), donde (x,y) está en las coordenadas transformadas donde los dos puntos de control son (-1,0) y (1,0)."
+ },
+ "IdealMirror": {
+ "title": "Curvo ideal",
+ "description": "Un espejo 'curvo' ideal que obedece exactamente la ecuación del espejo (1/p + 1/q = 1/f). La longitud focal puede establecerse directamente."
+ },
+ "BeamSplitter": {
+ "title": "Separador de haz",
+ "description": "Un espejo que transmite un porcentaje de la luz incidente."
+ },
+ "PlaneGlass": {
+ "title": "Semi-plano",
+ "description": "Simular la refracción y la reflexión de luz sobre una superficie.",
+ "instruction": "Arrastre o clique para crear."
+ },
+ "otherGlass": {
+ "title": "Otras formas",
+ "description": "Vidrio con otras formas construidas a partir de segmentos de lineas y arcos, o formas definidas mediante una desigualdad de la forma f(x) < y < g(x)."
+ },
+ "CircleGlass": {
+ "title": "Círculo",
+ "description": "Vidrio con una forma circular, definida mediante su centro y un punto sobre la superficie."
+ },
+ "Glass": {
+ "title": "Forma libre",
+ "description": "Vidrio con cualquier forma construida mediante segmentos de línea o arco.",
+ "instruction": "Clique para crear un segmento, arrastre para crear un arco, clique en el punto de inicio cuando haya finalizado el dibujo."
+ },
+ "CustomGlass": {
+ "title": "Ecuación personalizada",
+ "description": "Vidrio con una forma definida por una desigualdad f(x) < y < g(x), donde (x,y) está en las coordenadas transformadas donde los dos puntos de control son (-1,0) y (1,0)."
+ },
+ "IdealLens": {
+ "title": "Lente ideal",
+ "description": "Una lente ideal que obedece exactamente la ecuación de las lentes delgadas (1/p + 1/q = 1/f). La longitud focal se puede establecer directamente."
+ },
+ "SphericalLens": {
+ "title": "Lente esférica",
+ "description": "Una lente esférica."
+ },
+ "CircleGrinGlass": {
+ "title": "Círculo",
+ "description": "Vidrio con una función de índice refractivo n(x,y) y un borde circular."
+ },
+ "GrinGlass": {
+ "title": "Forma libre",
+ "description": "Vidrio con una función de índice de refracción n(x,y) y un borde poligonal.",
+ "instruction": "Clique para crear un segmento, clique en el punto de inicio cuando haya finalizado el dibujo.",
+ "warning": "ATENCIÓN: Sólo se soportan polígonos simples, de otro modo el comportamiento es impredecible."
+ },
+ "otherGrinGlass": {
+ "title": "Polígono con gradiente de índice"
+ },
+ "Blocker": {
+ "title": "Bloqueador recto",
+ "description": "Un bloqueador de luz recto que absorbe los rayos incidentes."
+ },
+ "CircleBlocker": {
+ "title": "Bloqueador circular",
+ "description": "Un bloqueador de luz circular que absorbe los rayos incidentes."
+ },
+ "Aperture": {
+ "title": "Apertura",
+ "description": "Un par de bloqueadores de luz que absorben los rayos incidentes. El tamaño del agujero puede ajustarse simétricamente.",
+ "instruction": "Arrastre o clique los dos puntos extremales para crear."
+ },
+ "Ruler": {
+ "title": "Regla",
+ "description": "Una regla desde un punto cero hasta otro punto."
+ },
+ "Protractor": {
+ "title": "Transportador",
+ "description": "Un transportador definido desde el centro y otro punto para la dirección cero. La escala está en grados."
+ },
+ "Detector": {
+ "title": "Detector",
+ "description": "Una herramienta para medir el flujo de energía (P), el momento perpendicular de flujo (F⊥), y el momento paralelo de flujo (F∥) a través de un segmento de recta. Las unidades son arbitrarias."
+ },
+ "TextLabel": {
+ "title": "Texto",
+ "description": "Un cuadro de texto."
+ },
+ "LineArrow": {
+ "title": "Línea / Flecha",
+ "description": "Un segmento de recta o flecha."
+ },
+ "Drawing": {
+ "title": "Dibujar",
+ "description": "Una herramienta para dibujar a mano alzada.",
+ "instruction": "Arrastre para dibujar."
+ },
+ "moveView": {
+ "title": "Mover vista",
+ "description": "Arrastre para mover la vista. (El botón derecho del ratón tiene la misma función.)"
+ }
+ },
+ "view": {
+ "title": "Vista",
+ "rays": {
+ "title": "Rayos",
+ "description": "Mostrar los rayos. Cuando la 'Densidad de rayos' es elevada, estos parecen continuos."
+ },
+ "extended": {
+ "title": "Rayos extendidos",
+ "description": "Mostrar los rayos y su extensión. El color naranja indica extensiones hacia atrás, y el gris indica hacia delante.",
+ "simulateColorsNote": "Cuando 'Simular colores' está seleccionado, estos se muestran en los colores de la fuente y se distinguen por un trazo discontinuo."
+ },
+ "images": {
+ "title": "Todas las imágenes",
+ "description": "Mostrar la posición de todas las imágenes. Los puntos amarillos indican imágenes reales, naranjas indican imágenes virtuales, y grises (ninguno en esta figura) indican objetos virtuales. Cabe notar que algunas imágenes no se pueden detectar si 'Densidad de rayos' no es suficientemente elevada.",
+ "simulateColorsNote": "Cuando 'Simular colores' está seleccionado estos se muestran en los colores de la fuente y se distinguen por el tamaño del punto."
+ },
+ "observer": {
+ "title": "Visto por el observador",
+ "description": "Simular los rayos y las imágenes vistos desde una posición. El circulo azul es el observador. Cualquier rayo que lo cruce se considera 'observado'. El observador no sabe donde inician los rayos, pero puede pensar que tienen inicio en algún(os) punto(s) si se intersectan ahí. Los rayos se muestran en azul, y los puntos en amarillo (reales) o naranja (virtuales).",
+ "simulateColorsNote": "Cuando 'Simular colores' está seleccionado, se muestran en los colores de la fuente.",
+ "instruction": "Arrastre el punto azul grande para mover al observador."
+ }
+ },
+ "simulateColors": {
+ "title": "Simular colores",
+ "description": "Simular colores (longitudes de onda), mezclas de colores, filtros de color de bloqueadores y espejos y dispersión cromática de vidrios.",
+ "instruction": "Puede ajustar los parámetros de estos objetos cuando los seleccione. Para simular el espectro de colores, sobreponga rayos con diferentes longitudes de onda.",
+ "warning": "Los colores mostrados en pantalla son solo aproximaciones burdas y puede ser muy impreciso cuando 'Densidad de rayos' es demasiado alta o demasiado baja."
+ },
+ "languageDropdown": {
+ "title": "Idioma: {{language}}",
+ "translatedFraction": "{{fraction}} traducida"
+ }
+}
\ No newline at end of file
diff --git a/locales/es/simulator.json b/locales/es/simulator.json
new file mode 100644
index 00000000..1b6cde37
--- /dev/null
+++ b/locales/es/simulator.json
@@ -0,0 +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"
+ },
+ "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."
+ }
+}
\ No newline at end of file
diff --git a/locales/fr.json b/locales/fr.json
deleted file mode 100644
index 7549ca91..00000000
--- a/locales/fr.json
+++ /dev/null
@@ -1,1044 +0,0 @@
-{
- "appName": {
- "message": "Simulation de rayon optique"
- },
- "appShortName": {
- "message": "Rayon optique"
- },
- "appDesc": {
- "incomplete": true,
- "message": "A free, open-source web app for creating and simulating 2D geometric optical scenes."
- },
- "homepage_desc": {
- "incomplete": true,
- "message": "Create & simulate 2D geometric optical scenes interactively. Totally free and web-based. Source code is available on GitHub."
- },
- "launch_simulator": {
- "incomplete": true,
- "message": "Launch Simulator"
- },
- "home": {
- "incomplete": true,
- "message": "Home"
- },
- "home_url": {
- "message": "https://phydemo.app/ray-optics/fr/"
- },
- "gallery": {
- "incomplete": true,
- "message": "Gallery"
- },
- "gallery_url": {
- "incomplete": true,
- "message": "https://phydemo.app/ray-optics/gallery/"
- },
- "welcome": {
- "incomplete": true,
- "message": "Welcome to Ray Optics Simulation To add an optical component, select a tool and click the blank space. To load an example, please go to the Gallery page."
- },
- "loading_msg": {
- "incomplete": true,
- "message": "Welcome to Ray Optics Simulation Loading scene from URL... Please wait."
- },
- "toolbar_title": {
- "message": "Outils: "
- },
- "toolname_SingleRay": {
- "message": "Rayon"
- },
- "toolname_AngleSource": {
- "message": "Source de lumière"
- },
- "toolname_PointSource": {
- "message": "Source de lumière"
- },
- "toolname_Beam": {
- "message": "Faisceau"
- },
- "toolname_mirror_": {
- "message": "Miroir"
- },
- "toolname_Mirror": {
- "message": "Miroir"
- },
- "toolname_ArcMirror": {
- "message": "Miroir"
- },
- "toolname_ParabolicMirror": {
- "message": "Miroir"
- },
- "toolname_CustomMirror": {
- "incomplete": true,
- "message": "Mirror"
- },
- "toolname_IdealMirror": {
- "message": "Miroir parfaitement courbé"
- },
- "toolname_glass_": {
- "message": "Verre"
- },
- "toolname_blocker_": {
- "incomplete": true,
- "message": "Blocker"
- },
- "toolname_BeamSplitter": {
- "incomplete": true,
- "message": "Beam Splitter"
- },
- "toolname_PlaneGlass": {
- "message": "Verre"
- },
- "toolname_CircleGlass": {
- "message": "Verre"
- },
- "toolname_CircleGrinGlass": {
- "incomplete": true,
- "message": "Gradient-index glass"
- },
- "toolname_Glass": {
- "message": "Verre"
- },
- "toolname_GrinGlass": {
- "incomplete": true,
- "message": "Gradient-index glass"
- },
- "toolname_IdealLens": {
- "message": "Lentille idéale"
- },
- "toolname_SphericalLens": {
- "incomplete": true,
- "message": "Spherical lens"
- },
- "toolname_CustomGlass": {
- "incomplete": true,
- "message": "Glass"
- },
- "toolname_Blocker": {
- "incomplete": true,
- "message": "Line Blocker"
- },
- "toolname_Aperture": {
- "incomplete": true,
- "message": "Aperture"
- },
- "toolname_CircleBlocker": {
- "incomplete": true,
- "message": "Circle Blocker"
- },
- "toolname_DiffractionGrating": {
- "incomplete": true,
- "message": "Diffraction GratingBeta"
- },
- "toolname_Ruler": {
- "message": "Règle"
- },
- "toolname_Protractor": {
- "message": "Rapporteur"
- },
- "tool_Detector": {
- "incomplete": true,
- "message": "Detector"
- },
- "toolname_Detector": {
- "incomplete": true,
- "message": "Detector"
- },
- "toolname_TextLabel": {
- "message": "Texte"
- },
- "toolname_LineArrow": {
- "incomplete": true,
- "message": "Line"
- },
- "toolname_Drawing": {
- "incomplete": true,
- "message": "Drawing"
- },
- "toolname_Handle": {
- "incomplete": true,
- "message": "Handle"
- },
- "toolname_CropBox": {
- "incomplete": true,
- "message": "Export"
- },
- "toolname_ModuleObj": {
- "incomplete": true,
- "message": "ModuleBeta"
- },
- "tool_more_": {
- "message": "Autre"
- },
- "toolname_": {
- "message": "Bouger la vue"
- },
- "modebar_title": {
- "message": "Vue:"
- },
- "modename_light": {
- "message": "Rayons"
- },
- "modename_extended_light": {
- "message": "Rayons étendus"
- },
- "modename_images": {
- "message": "Toutes les images"
- },
- "modename_observer": {
- "message": "Vu par un observateur"
- },
- "simulateColors": {
- "incomplete": true,
- "message": "Simulate Colors"
- },
- "File: ": {
- "message": "Fichier"
- },
- "Tools: ": {
- "message": "Outils"
- },
- "tool_SingleRay": {
- "message": "Rayon"
- },
- "tool_Beam": {
- "message": "Faisceau"
- },
- "tool_PointSource": {
- "message": "Source de lumière (360°)"
- },
- "tool_AngleSource": {
- "message": "Source de lumière (<360°)"
- },
- "tool_PointSource_": {
- "message": "Source de lumière"
- },
- "tool_lightSource_": {
- "message": "Source de lumière"
- },
- "tool_mirror_": {
- "message": "Miroirs"
- },
- "tool_Mirror": {
- "message": "Segment"
- },
- "tool_ArcMirror": {
- "message": "Arc circulaire"
- },
- "tool_ParabolicMirror": {
- "incomplete": true,
- "message": "Parabolic"
- },
- "tool_CustomMirror": {
- "incomplete": true,
- "message": "Custom Equation"
- },
- "tool_BeamSplitter": {
- "incomplete": true,
- "message": "Beam Splitter"
- },
- "tool_IdealMirror": {
- "message": "Courbure idéale"
- },
- "tool_glass_": {
- "message": "Verres"
- },
- "tool_blocker_": {
- "message": "Diaphragme"
- },
- "tool_PlaneGlass": {
- "message": "Demi-plan"
- },
- "tool_CircleGlass": {
- "message": "Cercle"
- },
- "tool_CircleGrinGlass": {
- "incomplete": true,
- "message": "Gradient-index circle"
- },
- "tool_Glass": {
- "incomplete": true,
- "message": "Polygon / Circular Arcs"
- },
- "tool_GrinGlass": {
- "incomplete": true,
- "message": "Gradient-index polygon"
- },
- "tool_IdealLens": {
- "message": "Lentille idéale"
- },
- "tool_SphericalLens": {
- "incomplete": true,
- "message": "Spherical Lens"
- },
- "tool_CustomGlass": {
- "incomplete": true,
- "message": "Custom Equation"
- },
- "tool_Blocker": {
- "incomplete": true,
- "message": "Line Blocker"
- },
- "tool_Aperture": {
- "incomplete": true,
- "message": "Aperture"
- },
- "tool_CircleBlocker": {
- "incomplete": true,
- "message": "Circle Blocker"
- },
- "tool_DiffractionGrating": {
- "incomplete": true,
- "message": "Diffraction GratingBeta"
- },
- "tool_Ruler": {
- "message": "Règle"
- },
- "tool_Protractor": {
- "message": "Rapporteur"
- },
- "tool_TextLabel": {
- "message": "Texte"
- },
- "tool_LineArrow": {
- "incomplete": true,
- "message": "Line / Arrow"
- },
- "tool_Drawing": {
- "incomplete": true,
- "message": "Drawing"
- },
- "tool_": {
- "message": "Bouger la vue"
- },
- "View: ": {
- "message": "Vue"
- },
- "Settings: ": {
- "message": "Paramètres"
- },
- "moresettings": {
- "incomplete": true,
- "message": "More"
- },
- "mode_rays": {
- "message": "Rayons"
- },
- "mode_extended": {
- "message": "Rayons étendus"
- },
- "mode_images": {
- "message": "Toutes les images"
- },
- "mode_observer": {
- "message": "Vu par un observateur"
- },
- "zoom": {
- "message": "Zoom"
- },
- "help": {
- "message": "Aide"
- },
- "rayDensity": {
- "message": "Densité de rayon"
- },
- "raydensity": {
- "message": "Densité de rayon:"
- },
- "undo": {
- "message": "Annuler"
- },
- "redo": {
- "message": "Rétablir"
- },
- "reset": {
- "message": "Recommencer"
- },
- "save": {
- "message": "Sauvegarder"
- },
- "rename": {
- "incomplete": true,
- "message": "Rename"
- },
- "get_link": {
- "incomplete": true,
- "message": "Copy Shareable Link"
- },
- "export_svg": {
- "incomplete": true,
- "message": "Export as PNG/SVG"
- },
- "view_gallery": {
- "incomplete": true,
- "message": "View Gallery"
- },
- "save_name": {
- "message": "Nom"
- },
- "save_cancel": {
- "message": "Annuler"
- },
- "save_description": {
- "incomplete": true,
- "message": "
You may use Settings -> Auto sync URL instead of saving to a file.
Click \"Rename\" to change the title without saving to a file.
"
- },
- "open": {
- "message": "Ouvrir"
- },
- "layoutaids": {
- "incomplete": true,
- "message": "Layout Aids"
- },
- "lockObjs": {
- "message": "Verrouiller les objets"
- },
- "showGrid": {
- "message": "Grille"
- },
- "snapToGrid": {
- "message": "Attacher à la grille"
- },
- "snaptogrid": {
- "message": "Attacher à la grille"
- },
- "length_unit_popover": {
- "incomplete": true,
- "message": "The unit of length used in this simulator (except for wavelengths) is an arbitrary unit, which can be interpreted as any physical unit (e.g. millimeters) as long as it is consistent throughout the simulation. If the unit appears too small or too large, please adjust Settings -> Length Scale."
- },
- "lengthScale": {
- "incomplete": true,
- "message": "Length ScaleBeta"
- },
- "lengthScale_popover": {
- "incomplete": true,
- "message": "If the default unit of length is too small or too large to model a physical system when interpreted as a common physical unit (e.g. millimeters), this factor can be used to scale the appearance (e.g. line widths) in the scene."
- },
- "brightness": {
- "message": "Luminosité"
- },
- "wavelength": {
- "message": "Longueur d'onde (nm)"
- },
- "dichroic": {
- "message": "Dichroïque"
- },
- "filter": {
- "message": "Filtre"
- },
- "bandwidth": {
- "message": "Bande Passante (nm)"
- },
- "invert": {
- "message": "Renverser"
- },
- "emisAngle": {
- "incomplete": true,
- "message": "Emission Angle (°)"
- },
- "mirrored": {
- "incomplete": true,
- "message": "Mirrored"
- },
- "lineDensity": {
- "incomplete": true,
- "message": "Lines/mm"
- },
- "slitRatio": {
- "incomplete": true,
- "message": "Slit width / line spacing"
- },
- "customBrightness": {
- "incomplete": true,
- "message": "Custom Brightness"
- },
- "customBrightness_note_popover": {
- "incomplete": true,
- "message": "When on, the brightnesses of the diffracted rays are customized by an array of numbers corresponding to m = 0, 1, -1, 2, -2, .... The number is to be normalized to the brightness of the incident ray. The values not in the array are set to 0. For example, \"1, 0.5, 0.5\" means the m=0 ray has the same brightness as the incident ray, the m=1 and m=-1 rays have half the brightness, and all other rays are ignored."
- },
- "symmetric": {
- "incomplete": true,
- "message": "Symmetric"
- },
- "eqn_note": {
- "incomplete": true,
- "message": "
Supported constants: pi e
Supported operators: + - * / ^
Supported functions: sqrt sin cos tan sec csc cot sinh cosh tanh log exp arcsin arccos arctan arcsinh arccosh arctanh floor round ceil trunc sgn max min abs
Supported functions: sqrt sin cos tan sec csc cot sinh cosh tanh log arcsin arccos arctan
To simulate chromatic dispersion, use parameter lambda for the vacuum wavelength in nanometers.Beta
Only supports differentiable functions.
The origin of n(x,y) is in the absolute coordinates and does not move with the object. You may double-click a control-point to inspect its absolute coordinates.
For a more accurate simulation, see \"More options...\"
This toggle applies to all GRIN objects in the simulation.
This simulator has currently two implementations of light propagation between different mediums, for GRIN objects - numerical and symbolic (see 'multRefIndex' and 'devRefIndex' functions in 'CircleGrinGlass.js').
The numerical implementation is faster but doesn't always work properly (depending on the specific case) in scenarios when used with more than one GRIN object, such that at least one of them has a refractive index function which is not defined in the entire plane, while the symbolic implementation is slower but robust to such problems.
If this object is to be simulated with (absolute) refractive index n₁, but is placed inside another glass with refractive index n₀, then you should set the refractive index to n₁/n₀ here. In more complicated cases that several glasses overlap together, the effective reflective index of the overlapping region equals the product of the reflective indices of individual ones.
Step size of Euler's method for solving the eikonal ray equation - see 'step' function and documentation inside the 'CircleGrinGlass.js' file, for more information.
This numerical tolerance is used in the functions 'isOnBoundary' and 'countIntersections', inside the 'GrinGlass.js' file.
"
- },
- "cauchyCoeff": {
- "incomplete": true,
- "message": "Cauchy coefficient"
- },
- "transRatio": {
- "incomplete": true,
- "message": "Transmission Ratio"
- },
- "applytoall": {
- "message": "Appliquer à tous"
- },
- "duplicate": {
- "message": "Dupliquer"
- },
- "delete": {
- "message": "Supprimer"
- },
- "unselect": {
- "incomplete": true,
- "message": "Unselect"
- },
- "unselect_popover": {
- "incomplete": true,
- "message": "Unselect this object (Right-click on blank space has the same function.)"
- },
- "showadvanced": {
- "incomplete": true,
- "message": "More options..."
- },
- "processing": {
- "message": "En cours de traitement... Cliquez ici pour arrêter"
- },
- "contribute": {
- "incomplete": true,
- "message": "Contribute"
- },
- "github": {
- "incomplete": true,
- "message": "GitHub"
- },
- "about": {
- "incomplete": true,
- "message": "About"
- },
- "about_url": {
- "message": "https://phydemo.app/ray-optics/about"
- },
- "translate": {
- "incomplete": true,
- "message": "Help us translate this app"
- },
- "translated": {
- "incomplete": true,
- "message": "translated"
- },
- "undo_popover": {
- "message": "Annuler la dernière action. (Ctrl+Z)"
- },
- "redo_popover": {
- "message": "Rétablir la dernière action. (Ctrl+Y)"
- },
- "reset_popover": {
- "message": "Ecraser tous les changements."
- },
- "save_popover": {
- "message": "Sauvegarder le fichier actuel."
- },
- "open_popover": {
- "incomplete": true,
- "message": "Open an existing file or background image. The background image will be shown from the coordinate origin. (Or drop the file)"
- },
- "get_link_popover": {
- "incomplete": true,
- "message": "Copy and go to the direct URL for the current scene, which can be used for sharing (possibly via a URL shortener). Also see Settings -> Auto sync URL."
- },
- "get_link_warning": {
- "incomplete": true,
- "message": "The URL is too long that it may not work on some platforms. You may need to use \"Save\" and share the file instead."
- },
- "export_svg_warning": {
- "incomplete": true,
- "message": "Export to SVG: Color mixtures and relative refractive indices below 1 are not supported."
- },
- "export_ray_count_warning": {
- "incomplete": true,
- "message": "The current number of rays in the scene is larger than the ray count limit. You may need to increase the ray count limit in the Crop Box options."
- },
- "view_gallery_popover": {
- "incomplete": true,
- "message": "Go to the Gallery webpage to load an example."
- },
- "tool_SingleRay_popover": {
- "message": "Un rayon de lumière unique définit par deux points. (Glisser ou cliquer pour le créer. Le premier point est la source, tirant vers le deuxième point.)"
- },
- "tool_Beam_popover": {
- "incomplete": true,
- "message": "A parallel or divergent beam of rays emerges from a line segment, with density controlled by the 'Ray density' slider. (Drag or click to create.)"
- },
- "tool_PointSource_popover": {
- "message": "Rayons émergeant d'un point unique, avec un nombre de rayons controlé par le curseur 'Densité de rayons'. (Cliquer pour le créer.)"
- },
- "tool_AngleSource_popover": {
- "incomplete": true,
- "message": "Point source with a given emission angle."
- },
- "tool_Mirror_popover": {
- "message": "Simule la reflexion de la lumière sur un miroir. (Glisser ou cliquer pour le créer.)"
- },
- "tool_ArcMirror_popover": {
- "message": "Un miroir dont la forme est un arc circulaire, qui est définit par trois points. (Glisser ou cliquer pour le créer. Les deux premiers points définissent l'espace entre les bords de l'arc, le dernier point définit la taille de l'arc.)"
- },
- "tool_ParabolicMirror_popover": {
- "incomplete": true,
- "message": "A mirror whose shape is a parabola, which is defined by three points. (Drag or click to create.)"
- },
- "tool_CustomMirror_popover": {
- "incomplete": true,
- "message": "A mirror whose shape is defined by a custom equation y = f(x), where (x,y) is in the transformed coordinates in which the two control points are (-1,0) and (1,0). (Drag or click to create.)"
- },
- "tool_BeamSplitter_popover": {
- "incomplete": true,
- "message": "A mirror that transmits a percentage of incoming light. (Drag or click to create.)"
- },
- "tool_IdealMirror_popover": {
- "message": "Un miroir 'courbé' qui obéit exactement à l'équation (1/p + 1/q = 1/f). La distance focale peut être défini directement. (Glisser ou cliquer pour le créer.)"
- },
- "tool_PlaneGlass_popover": {
- "message": "Simule la réfraction et la reflexion de la lumière sur une surface. (Glisser ou cliquer pour le créer.)"
- },
- "tool_CircleGlass_popover": {
- "message": "Verre avec une forme circulaire, définie par son centre et un point sur sa surface. (Glisser ou cliquer pour le créer.)"
- },
- "tool_CircleGrinGlass_popover": {
- "incomplete": true,
- "message": "Glass with a custom refractive index function n(x,y) and a circular boundary. (Drag or click to create.)"
- },
- "tool_Glass_popover": {
- "message": "Verre avec une forme quelconque construite avec des segments et des arcs circulaires. (Cliquer pour crée un segment, glisser pour crée un arc, cliquer sur le point de depart pour finir de dessiner.)"
- },
- "tool_GrinGlass_popover": {
- "incomplete": true,
- "message": "Glass with a custom refractive index function n(x,y) and a polygonal boundary. WARNING: Only simple polygons are supported, otherwise the behavior is unpredictable. (Click to create a segment, click on the starting point when finish drawing.)"
- },
- "tool_IdealLens_popover": {
- "message": "Une lentille obéissant exactement à l'équation de lentille (1/p' + 1/p = 1/f'). La distance focale peut être défini directement. (Glisser ou cliquer pour le créer.)"
- },
- "tool_SphericalLens_popover": {
- "incomplete": true,
- "message": "A spherical lens. (Click to create.)"
- },
- "tool_CustomGlass_popover": {
- "incomplete": true,
- "message": "Glass with the shape defined by a custom inequality f(x) < y < g(x), where (x,y) is in the transformed coordinates in which the two control points are (-1,0) and (1,0). (Drag or click to create.)"
- },
- "tool_Blocker_popover": {
- "message": "Un segment absorbant les rayons incidents. (Glisser ou cliquer pour le créer.)"
- },
- "tool_Aperture_popover": {
- "incomplete": true,
- "message": "A pair of light blockers which absorbs the incident rays. The size of the hole can be adjusted symmetrically. (Drag or click the two endpoints to create.)"
- },
- "tool_CircleBlocker_popover": {
- "incomplete": true,
- "message": "A circle light blocker which absorbs the incident rays. (Drag or click to create.)"
- },
- "tool_DiffractionGrating_popover": {
- "incomplete": true,
- "message": "A diffraction grating that splits light at an angle depending on wavelength. Warning: The intensities of diffracted rays may not be accurate. (Drag or click to create.)"
- },
- "tool_Ruler_popover": {
- "message": "Une règle de zéro à un autre point. (Glisser ou cliquer pour le créer.)"
- },
- "tool_Protractor_popover": {
- "message": "Un rapporteur défini par le centre et un autre point pour la direction zero. L'echelle est en degrès. (Glisser ou cliquer pour le créer.)"
- },
- "tool_Detector_popover": {
- "incomplete": true,
- "message": "A tool for measuring the rate of energy flow (P), the rate of perpendicular momentum flow (F⊥), and the rate of parallel momentum flow (F∥) through a line segment. (Drag or click to create the line segment.) The units are arbitrary."
- },
- "tool_Detector_info_popover": {
- "incomplete": true,
- "message": "
P: The rate of energy flow (flux) in B/s (see below).
F⊥: The rate of perpendicular momentum flow in (B/s)/c.
F∥: The rate of parallel momentum flow in (B/s)/c.
The irradiance in the exported CSV is in (B/s)/L.
L is the arbitrary unit of length used in this simulator.
B is an arbitrary unit of radiant flux or luminous flux, corresponding to the unit of the \"Brightness\" option being B/L for non-Lambertian beams and 500B/360° for point sources.
The dimensionless factor s is the \"Brightness Scale\" shown in Settings -> Show status box, which equals 1 when \"Ray Density\" is above some threshold and proportional to \"Ray Density\" otherwise.
If some rays are truncated in the infinite series of internal reflection, the total truncation is shown as error estimates.
"
- },
- "tool_TextLabel_popover": {
- "message": "Une légende, pour un objet quelconque."
- },
- "tool_LineArrow_popover": {
- "incomplete": true,
- "message": "A line segment or arrow. (Drag or click to create.)"
- },
- "tool_Drawing_popover": {
- "incomplete": true,
- "message": "A freehand drawing tool. (Drag to draw.)"
- },
- "tool__popover": {
- "message": "Glisser pour bouger la vue. (Le clic droit à la même fonction.)"
- },
- "mode_rays_popover": {
- "message": "Montre les rayons. Quand la 'Densité de rayons' est élevée, elles paraissent continues."
- },
- "mode_extended_popover": {
- "incomplete": true,
- "message": "Show both the rays and its extension. Orange indicates backward extensions, and gray indicates forward ones. When 'Simulate Colors' is on, they are shown in source colors and distinguished by dashing instead."
- },
- "mode_images_popover": {
- "incomplete": true,
- "message": "Show the position of all images. Yellow points indicate real images, orange indicates virtual images, and gray (none in this picture) indicates virtual objects. Note that some images cannot be detected if 'Ray density' is not high enough. When 'Simulate Colors' is on, they are shown in source colors and distinguished by dot sizes instead."
- },
- "mode_observer_popover": {
- "incomplete": true,
- "message": "Simulate the rays and images seen from some position. The blue circle is the observer. Any rays crossing it are considered to be 'observed'. The observer does not know where the rays actually begin, but may think they begin at some point(s) if they intersect there. The rays are shown in blue, and the points in yellow (real) or orange (virtual). (Drag the big blue dot to move the observer.) When 'Simulate Colors' is on, they are shown in source colors instead."
- },
- "simulateColors_popover": {
- "incomplete": true,
- "message": "Simulate colors (wavelengths) of light sources, mixture of colors, color filtering of blockers and mirrors, and chromatic dispersion of glasses. You can set those parameters for those objects when selected. To simulate color spectra, overlap rays with different wavelengths. The colors shown on the screen are only rough approximations, and can be very inaccurate when 'Ray density' is too high or too low."
- },
- "rayDensity_popover": {
- "incomplete": true,
- "message": "Determines the number of rays to be emitted by beams and point sources. This also affects the accuracy of image detection and color rendering."
- },
- "showGrid_popover": {
- "message": "Défini la visibilité de l'arrière-plan de la grille."
- },
- "grid_popover": {
- "message": "Défini si l'on s'accorche à la grille."
- },
- "lockObjs_popover": {
- "message": "Défini si l'objet peut être bougé ou non."
- },
- "zoom_popover": {
- "message": "Zoom sur la vue avec un pourcentage."
- },
- "help_popover": {
- "incomplete": true,
- "message": "Constrained dragging
When dragging an object, hold Shift to limit to horizontal/vertical; hold Ctrl to clone. When creating a line-shaped object or dragging its endpoints, hold Shift to lock the angle or snap to 0°, 45°, 90°; hold Ctrl to rotate/scale about its center.
Group, rotate, and scale objects
Hold Ctrl, click several control points (e.g. endpoints), then click empty space to group these points and create a handle. Drag the handle (or press arrow keys) to move the group; Shift+drag to limit to horizontal/vertical; Ctrl+drag to rotate, Ctrl+Shift+drag to scale. Drag the \"+\" to set rotation/scaling center. Click the handle and press Ctrl+D to duplicate the group; press Delete to ungroup.
Edit coordinates directly
Double-click or right-click the control point (e.g. endpoint) of the object, edit the (x,y) coordinates, then press Enter.
Keyboard shortcuts
When an object is selected (by clicking it), press arrow keys to move; Ctrl+D to duplicate; Delete key to delete.
"
- },
- "open": {
- "message": "開く"
- },
- "layoutaids": {
- "incomplete": true,
- "message": "Layout Aids"
- },
- "lockObjs": {
- "message": "オブジェクトを固定"
- },
- "showGrid": {
- "message": "グリッド"
- },
- "snapToGrid": {
- "message": "グリッドにスナップ"
- },
- "snaptogrid": {
- "message": "グリッドにスナップ"
- },
- "length_unit_popover": {
- "incomplete": true,
- "message": "The unit of length used in this simulator (except for wavelengths) is an arbitrary unit, which can be interpreted as any physical unit (e.g. millimeters) as long as it is consistent throughout the simulation. If the unit appears too small or too large, please adjust Settings -> Length Scale."
- },
- "lengthScale": {
- "incomplete": true,
- "message": "Length ScaleBeta"
- },
- "lengthScale_popover": {
- "incomplete": true,
- "message": "If the default unit of length is too small or too large to model a physical system when interpreted as a common physical unit (e.g. millimeters), this factor can be used to scale the appearance (e.g. line widths) in the scene."
- },
- "brightness": {
- "message": "明るさ"
- },
- "wavelength": {
- "message": "波長 (nm)"
- },
- "dichroic": {
- "message": "ダイクロイック"
- },
- "filter": {
- "message": "フィルタ"
- },
- "bandwidth": {
- "message": "帯域幅 (nm)"
- },
- "invert": {
- "message": "反転"
- },
- "emisAngle": {
- "message": "放射角度 (°)"
- },
- "mirrored": {
- "incomplete": true,
- "message": "Mirrored"
- },
- "lineDensity": {
- "incomplete": true,
- "message": "Lines/mm"
- },
- "slitRatio": {
- "incomplete": true,
- "message": "Slit width / line spacing"
- },
- "customBrightness": {
- "incomplete": true,
- "message": "Custom Brightness"
- },
- "customBrightness_note_popover": {
- "incomplete": true,
- "message": "When on, the brightnesses of the diffracted rays are customized by an array of numbers corresponding to m = 0, 1, -1, 2, -2, .... The number is to be normalized to the brightness of the incident ray. The values not in the array are set to 0. For example, \"1, 0.5, 0.5\" means the m=0 ray has the same brightness as the incident ray, the m=1 and m=-1 rays have half the brightness, and all other rays are ignored."
- },
- "symmetric": {
- "message": "対称"
- },
- "eqn_note": {
- "incomplete": true,
- "message": "
Supported constants: pi e
Supported operators: + - * / ^
Supported functions: sqrt sin cos tan sec csc cot sinh cosh tanh log exp arcsin arccos arctan arcsinh arccosh arctanh floor round ceil trunc sgn max min abs
Supported functions: sqrt sin cos tan sec csc cot sinh cosh tanh log arcsin arccos arctan
To simulate chromatic dispersion, use parameter lambda for the vacuum wavelength in nanometers.Beta
Only supports differentiable functions.
The origin of n(x,y) is in the absolute coordinates and does not move with the object. You may double-click a control-point to inspect its absolute coordinates.
For a more accurate simulation, see \"More options...\"
This toggle applies to all GRIN objects in the simulation.
This simulator has currently two implementations of light propagation between different mediums, for GRIN objects - numerical and symbolic (see 'multRefIndex' and 'devRefIndex' functions in 'CircleGrinGlass.js').
The numerical implementation is faster but doesn't always work properly (depending on the specific case) in scenarios when used with more than one GRIN object, such that at least one of them has a refractive index function which is not defined in the entire plane, while the symbolic implementation is slower but robust to such problems.
Step size of Euler's method for solving the eikonal ray equation - see 'step' function and documentation inside the 'CircleGrinGlass.js' file, for more information.
This numerical tolerance is used in the functions 'isOnBoundary' and 'countIntersections', inside the 'GrinGlass.js' file.
"
- },
- "cauchyCoeff": {
- "incomplete": true,
- "message": "Cauchy coefficient"
- },
- "transRatio": {
- "message": "透過率"
- },
- "applytoall": {
- "message": "すべてに適用"
- },
- "duplicate": {
- "message": "複製"
- },
- "delete": {
- "message": "消去"
- },
- "unselect": {
- "incomplete": true,
- "message": "Unselect"
- },
- "unselect_popover": {
- "incomplete": true,
- "message": "Unselect this object (Right-click on blank space has the same function.)"
- },
- "showadvanced": {
- "incomplete": true,
- "message": "More options..."
- },
- "processing": {
- "message": "処理中...停止するにはここをクリックしてください."
- },
- "contribute": {
- "message": "貢献する"
- },
- "github": {
- "message": "GitHub"
- },
- "about": {
- "message": "このソフトウェアについて"
- },
- "about_url": {
- "message": "https://phydemo.app/ray-optics/about"
- },
- "translate": {
- "message": "このアプリの翻訳にご協力ください"
- },
- "translated": {
- "message": "翻訳済み"
- },
- "undo_popover": {
- "message": "最後の操作を元に戻します。 (Ctrl+Z)"
- },
- "redo_popover": {
- "message": "最後の操作をやり直します。 (Ctrl+Y)"
- },
- "reset_popover": {
- "message": "すべての変更をリセットします。"
- },
- "save_popover": {
- "message": "現在のシーンをファイルとして保存します。"
- },
- "open_popover": {
- "message": "既存のファイルまたは背景画像を開きます。 背景画像は座標原点から表示されます。 (またはファイルをドロップします)"
- },
- "get_link_popover": {
- "incomplete": true,
- "message": "Copy and go to the direct URL for the current scene, which can be used for sharing (possibly via a URL shortener). Also see Settings -> Auto sync URL."
- },
- "get_link_warning": {
- "message": "URL が長すぎるため、一部のプラットフォームでは機能しない可能性があります。 代わりに「保存」を使用してファイルを共有する必要がある場合があります。"
- },
- "export_svg_warning": {
- "message": "SVG にエクスポートします。 色の混合と 1 未満の相対屈折率はサポートされていません."
- },
- "export_ray_count_warning": {
- "incomplete": true,
- "message": "The current number of rays in the scene is larger than the ray count limit. You may need to increase the ray count limit in the Crop Box options."
- },
- "view_gallery_popover": {
- "message": "ギャラリー Web ページに移動してサンプルをロードします。"
- },
- "tool_SingleRay_popover": {
- "message": "2 つの点によって定義される単一光線。 (ドラッグまたはクリックして作成します。最初のポイントがソースとなり、2 番目のポイントで発射方向を決めます。)"
- },
- "tool_Beam_popover": {
- "incomplete": true,
- "message": "A parallel or divergent beam of rays emerges from a line segment, with density controlled by the 'Ray density' slider. (Drag or click to create.)"
- },
- "tool_PointSource_popover": {
- "message": "光線は 1 つの点から出現し、その数は「光線密度」スライダーで調整できます。 (クリックして作成します。)"
- },
- "tool_AngleSource_popover": {
- "message": "指定された放射角度を持つ点光源。"
- },
- "tool_Mirror_popover": {
- "message": "鏡での光の反射をシミュレートします。 (ドラッグまたはクリックして作成します。)"
- },
- "tool_ArcMirror_popover": {
- "message": "3 つの点で定義される円の一部の形状を持つ鏡。 (ドラッグまたはクリックして作成します。最初の 2 点は円弧のエッジ間のギャップを定義し、最後の点は円弧のサイズを定義します。)"
- },
- "tool_ParabolicMirror_popover": {
- "message": "3 つの点で定義される放物線の形状を持つ鏡。 (ドラッグまたはクリックして作成します。)"
- },
- "tool_CustomMirror_popover": {
- "message": "カスタム方程式 y = f(x) によって形状が定義されるミラー。ここで (x,y) は、2 つの制御点が (-1,0) と (1,0) である変換された座標にあります。 (ドラッグまたはクリックして作成します。)"
- },
- "tool_BeamSplitter_popover": {
- "message": "入ってくる光の一定の割合を透過するミラー。 (ドラッグまたはクリックして作成します。)"
- },
- "tool_IdealMirror_popover": {
- "message": "ミラー方程式 (1/p + 1/q = 1/f) に正確に従う理想的な「曲面」ミラー。 焦点距離を直接設定できます。 (ドラッグまたはクリックして作成します。)"
- },
- "tool_PlaneGlass_popover": {
- "message": "表面上の光の屈折と反射をシミュレートします。 (ドラッグまたはクリックして作成します。)"
- },
- "tool_CircleGlass_popover": {
- "message": "中心と表面上の点によって定義される円形のガラス。 (ドラッグまたはクリックして作成します。)"
- },
- "tool_CircleGrinGlass_popover": {
- "incomplete": true,
- "message": "Glass with a custom refractive index function n(x,y) and a circular boundary. (Drag or click to create.)"
- },
- "tool_Glass_popover": {
- "message": "線分と円弧から構成される任意の形状のガラス。 (クリックしてセグメントを作成し、ドラッグして円弧を作成し、描画が終了したら開始点をクリックします。)"
- },
- "tool_GrinGlass_popover": {
- "incomplete": true,
- "message": "Glass with a custom refractive index function n(x,y) and a polygonal boundary. WARNING: Only simple polygons are supported, otherwise the behavior is unpredictable. (Click to create a segment, click on the starting point when finish drawing.)"
- },
- "tool_IdealLens_popover": {
- "message": "薄いレンズの方程式 (1/p + 1/q = 1/f) に正確に従う理想的なレンズ。 焦点距離を直接設定できます。 (ドラッグまたはクリックして作成します。)"
- },
- "tool_SphericalLens_popover": {
- "message": "球面レンズ (クリックして作成します。)"
- },
- "tool_CustomGlass_popover": {
- "message": "カスタム不等式f(x) < y < g(x)で定義される形状を持つガラスで、(x,y)は2つの制御点が(-1,0)と(1,0)である変換後の座標であるもの。(ドラッグまたはクリックで作成)"
- },
- "tool_Blocker_popover": {
- "message": "入射光線を吸収する線分型の遮光板です。(ドラッグまたはクリックで作成)"
- },
- "tool_Aperture_popover": {
- "incomplete": true,
- "message": "A pair of light blockers which absorbs the incident rays. The size of the hole can be adjusted symmetrically. (Drag or click the two endpoints to create.)"
- },
- "tool_CircleBlocker_popover": {
- "message": "入射光線を吸収する円形の遮光板です。(ドラッグまたはクリックで作成)"
- },
- "tool_DiffractionGrating_popover": {
- "incomplete": true,
- "message": "A diffraction grating that splits light at an angle depending on wavelength. Warning: The intensities of diffracted rays may not be accurate. (Drag or click to create.)"
- },
- "tool_Ruler_popover": {
- "message": "ゼロと別の点の点からの定規。 (ドラッグまたはクリックして作成します。)"
- },
- "tool_Protractor_popover": {
- "message": "中心とゼロ方向の別の点から定義された分度器。 スケールは度単位です。 (ドラッグまたはクリックして作成します。)"
- },
- "tool_Detector_popover": {
- "message": "線分を通るエネルギー流の速度 (P)、垂直運動量流の速度 (F⊥)、および平行運動量流の速度 (F∥) を測定するためのツールです。 (ドラッグまたはクリックで線分を作成します。)単位は任意です。"
- },
- "tool_Detector_info_popover": {
- "incomplete": true,
- "message": "
P: The rate of energy flow (flux) in B/s (see below).
F⊥: The rate of perpendicular momentum flow in (B/s)/c.
F∥: The rate of parallel momentum flow in (B/s)/c.
The irradiance in the exported CSV is in (B/s)/L.
L is the arbitrary unit of length used in this simulator.
B is an arbitrary unit of radiant flux or luminous flux, corresponding to the unit of the \"Brightness\" option being B/L for non-Lambertian beams and 500B/360° for point sources.
The dimensionless factor s is the \"Brightness Scale\" shown in Settings -> Show status box, which equals 1 when \"Ray Density\" is above some threshold and proportional to \"Ray Density\" otherwise.
If some rays are truncated in the infinite series of internal reflection, the total truncation is shown as error estimates.
"
- },
- "tool_TextLabel_popover": {
- "message": "テキストラベル."
- },
- "tool_LineArrow_popover": {
- "incomplete": true,
- "message": "A line segment or arrow. (Drag or click to create.)"
- },
- "tool_Drawing_popover": {
- "incomplete": true,
- "message": "A freehand drawing tool. (Drag to draw.)"
- },
- "tool__popover": {
- "message": "ドラッグでビューを移動します。(マウスの右ボタンでドラッグしても同じ機能です)。"
- },
- "mode_rays_popover": {
- "message": "光線を表示します。光線密度が高いと、連続しているように見えます。"
- },
- "mode_extended_popover": {
- "message": "光線とその延長線の両方を表示します。 オレンジは後方拡張を示し、グレーは前方拡張を示します。 「カラーのシミュレート」がオンの場合、それらはソース カラーで表示され、代わりにダッシュで区別されます。"
- },
- "mode_images_popover": {
- "message": "すべての画像の位置を表示します。 黄色の点は実像を示し、オレンジ色は虚像を示し、灰色 (この図には何もありません) は仮想オブジェクトを示します。 「レイ密度」が十分に高くない場合、一部のイメージは検出できないことに注意してください。 「カラーのシミュレート」がオンの場合、イメージはソース カラーで表示され、代わりにドット サイズによって区別されます。"
- },
- "mode_observer_popover": {
- "message": "ある位置から見た光線と画像をシミュレートします。 青い丸が観察者です。 それを横切る光線はすべて「観測された」とみなされます。 観察者は、光線が実際にどこから始まるのかを知りませんが、光線が交差する場合、ある点で光線が始まると考えるかもしれません。 光線は青、点は黄色 (現実) またはオレンジ (仮想) で表示されます。 (大きな青い点をドラッグして観察者を移動します。) 「カラーのシミュレート」がオンの場合、代わりにソース カラーで表示されます。"
- },
- "simulateColors_popover": {
- "incomplete": true,
- "message": "Simulate colors (wavelengths) of light sources, mixture of colors, color filtering of blockers and mirrors, and chromatic dispersion of glasses. You can set those parameters for those objects when selected. To simulate color spectra, overlap rays with different wavelengths. The colors shown on the screen are only rough approximations, and can be very inaccurate when 'Ray density' is too high or too low."
- },
- "rayDensity_popover": {
- "incomplete": true,
- "message": "Determines the number of rays to be emitted by beams and point sources. This also affects the accuracy of image detection and color rendering."
- },
- "showGrid_popover": {
- "message": "背景グリッドの可視性を切り替えます。"
- },
- "grid_popover": {
- "message": "グリッドにスナップするかどうかを切り替えます。"
- },
- "lockObjs_popover": {
- "message": "オブジェクトを移動できるかどうかを切り替えます。"
- },
- "zoom_popover": {
- "message": "パーセンテージでビューをズームします。"
- },
- "help_popover": {
- "incomplete": true,
- "message": "Constrained dragging
When dragging an object, hold Shift to limit to horizontal/vertical; hold Ctrl to clone. When creating a line-shaped object or dragging its endpoints, hold Shift to lock the angle or snap to 0°, 45°, 90°; hold Ctrl to rotate/scale about its center.
Group, rotate, and scale objects
Hold Ctrl, click several control points (e.g. endpoints), then click empty space to group these points and create a handle. Drag the handle (or press arrow keys) to move the group; Shift+drag to limit to horizontal/vertical; Ctrl+drag to rotate, Ctrl+Shift+drag to scale. Drag the \"+\" to set rotation/scaling center. Click the handle and press Ctrl+D to duplicate the group; press Delete to ungroup.
Edit coordinates directly
Double-click or right-click the control point (e.g. endpoint) of the object, edit the (x,y) coordinates, then press Enter.
Keyboard shortcuts
When an object is selected (by clicking it), press arrow keys to move; Ctrl+D to duplicate; Delete key to delete.
"
- },
- "open": {
- "message": "열기"
- },
- "layoutaids": {
- "message": "레이아웃 도구"
- },
- "lockObjs": {
- "message": "사물 고정"
- },
- "showGrid": {
- "message": "격자"
- },
- "snapToGrid": {
- "message": "격자선에 물리기"
- },
- "snaptogrid": {
- "message": "격자선에 물리기"
- },
- "length_unit_popover": {
- "incomplete": true,
- "message": "The unit of length used in this simulator (except for wavelengths) is an arbitrary unit, which can be interpreted as any physical unit (e.g. millimeters) as long as it is consistent throughout the simulation. If the unit appears too small or too large, please adjust Settings -> Length Scale."
- },
- "lengthScale": {
- "incomplete": true,
- "message": "Length ScaleBeta"
- },
- "lengthScale_popover": {
- "incomplete": true,
- "message": "If the default unit of length is too small or too large to model a physical system when interpreted as a common physical unit (e.g. millimeters), this factor can be used to scale the appearance (e.g. line widths) in the scene."
- },
- "brightness": {
- "message": "밝기"
- },
- "wavelength": {
- "message": "파장 (nm)"
- },
- "dichroic": {
- "message": "이색 (Dichroic)"
- },
- "filter": {
- "message": "필터"
- },
- "bandwidth": {
- "message": "대역폭 (Bandwidth) (nm)"
- },
- "invert": {
- "message": "반전"
- },
- "emisAngle": {
- "message": "방출 각 (°)"
- },
- "mirrored": {
- "incomplete": true,
- "message": "Mirrored"
- },
- "lineDensity": {
- "incomplete": true,
- "message": "Lines/mm"
- },
- "slitRatio": {
- "incomplete": true,
- "message": "Slit width / line spacing"
- },
- "customBrightness": {
- "incomplete": true,
- "message": "Custom Brightness"
- },
- "customBrightness_note_popover": {
- "incomplete": true,
- "message": "When on, the brightnesses of the diffracted rays are customized by an array of numbers corresponding to m = 0, 1, -1, 2, -2, .... The number is to be normalized to the brightness of the incident ray. The values not in the array are set to 0. For example, \"1, 0.5, 0.5\" means the m=0 ray has the same brightness as the incident ray, the m=1 and m=-1 rays have half the brightness, and all other rays are ignored."
- },
- "symmetric": {
- "message": "대칭"
- },
- "eqn_note": {
- "incomplete": true,
- "message": "
Supported constants: pi e
Supported operators: + - * / ^
Supported functions: sqrt sin cos tan sec csc cot sinh cosh tanh log exp arcsin arccos arctan arcsinh arccosh arctanh floor round ceil trunc sgn max min abs
Supported functions: sqrt sin cos tan sec csc cot sinh cosh tanh log arcsin arccos arctan
To simulate chromatic dispersion, use parameter lambda for the vacuum wavelength in nanometers.Beta
Only supports differentiable functions.
The origin of n(x,y) is in the absolute coordinates and does not move with the object. You may double-click a control-point to inspect its absolute coordinates.
For a more accurate simulation, see \"More options...\"
This toggle applies to all GRIN objects in the simulation.
This simulator has currently two implementations of light propagation between different mediums, for GRIN objects - numerical and symbolic (see 'multRefIndex' and 'devRefIndex' functions in 'CircleGrinGlass.js').
The numerical implementation is faster but doesn't always work properly (depending on the specific case) in scenarios when used with more than one GRIN object, such that at least one of them has a refractive index function which is not defined in the entire plane, while the symbolic implementation is slower but robust to such problems.
이 객체가 (절대) 굴절률 n₁으로 시뮬레이션되어야 하는데 굴절률이 n₀인 다른 매질 내부에 있다면 상대 굴절률인 n₁/n₀ 를 입력해야합니다. 여러 장의 매질이 겹쳐진 복잡한 경우에는 겹친 영역의 실질적인 굴절률 (effective refractive index)은 매질 각각의 굴절률의 곱과 같습니다.
Step size of Euler's method for solving the eikonal ray equation - see 'step' function and documentation inside the 'CircleGrinGlass.js' file, for more information.
This numerical tolerance is used in the functions 'isOnBoundary' and 'countIntersections', inside the 'GrinGlass.js' file.
"
- },
- "cauchyCoeff": {
- "message": "코시 계수 (Cauchy coefficient)"
- },
- "transRatio": {
- "message": "전송률"
- },
- "applytoall": {
- "message": "전체에 적용"
- },
- "duplicate": {
- "message": "복제"
- },
- "delete": {
- "message": "삭제"
- },
- "unselect": {
- "message": "선택 해제"
- },
- "unselect_popover": {
- "message": "이 물체의 선택을 해제합니다. (또는 빈 영역에 우클릭합니다.)"
- },
- "showadvanced": {
- "message": "추가 옵션"
- },
- "processing": {
- "message": "작업중... 중단하려면 클릭."
- },
- "contribute": {
- "message": "기여하기"
- },
- "github": {
- "message": "GitHub"
- },
- "about": {
- "message": "이 앱에 대하여"
- },
- "about_url": {
- "message": "https://phydemo.app/ray-optics/about"
- },
- "translate": {
- "message": "이 앱의 번역 참여"
- },
- "translated": {
- "message": "번역 됨"
- },
- "undo_popover": {
- "message": "마지막 작업 취소. (Ctrl+Z)"
- },
- "redo_popover": {
- "message": "마지막 작업 재실행. (Ctrl+Y)"
- },
- "reset_popover": {
- "message": "모든 작업 초기화."
- },
- "save_popover": {
- "message": "현재 결과를 파일로 저장."
- },
- "open_popover": {
- "message": "기존 파일이나 배경 이미지 열기. 배경 이미지는 좌표 원점을 기준으로 표시됩니다. (또는 파일을 올려놓으십시오.)"
- },
- "get_link_popover": {
- "incomplete": true,
- "message": "Copy and go to the direct URL for the current scene, which can be used for sharing (possibly via a URL shortener). Also see Settings -> Auto sync URL."
- },
- "get_link_warning": {
- "message": "URL이 너무 길어서 일부 플랫폼에서 작동하지 않을 수 있습니다. 이 경우 \"저장\"을 사용해 파일을 공유하십시오."
- },
- "export_svg_warning": {
- "message": "SVG로 추출하기. 색상 혼합 및 1 미만의 상대 굴절율은 지원되지 않습니다."
- },
- "export_ray_count_warning": {
- "incomplete": true,
- "message": "The current number of rays in the scene is larger than the ray count limit. You may need to increase the ray count limit in the Crop Box options."
- },
- "view_gallery_popover": {
- "message": "예제를 불러오기 위해 갤러리로 이동."
- },
- "tool_SingleRay_popover": {
- "message": "두 점으로 정의된 단일 광선. (드래그 또는 클릭하여 생성. 첫 번째 지점에서 두 번째 지점을 향하는 방향.)"
- },
- "tool_Beam_popover": {
- "message": "선분으로 나타나는 평행 또는 발산하는 광선 빔. 밀도 조절은 '광선 밀도' 슬라이더를 통해 조절. (드래그 또는 클릭하여 생성.)"
- },
- "tool_PointSource_popover": {
- "message": "점 광원에서 발생하는 광선. 밀도 조절은 '광선 밀도' 슬라이더를 통해 조절. (드래그 또는 클릭하여 생성.)"
- },
- "tool_AngleSource_popover": {
- "message": "주어진 각도 범위에서 방출하는 점 광원."
- },
- "tool_Mirror_popover": {
- "message": "거울에서의 반사 시뮬레이션 (드래그 또는 클릭하여 생성)"
- },
- "tool_ArcMirror_popover": {
- "message": "구면 거울. (세 개의 점으로 정의된 원) (드래그 또는 클릭하여 생성. 첫 두 점은 호의 가장자리 사이 간격을 정의하고, 마지막 점은 호의 크기를 정의합니다.)"
- },
- "tool_ParabolicMirror_popover": {
- "message": "포물면 거울. (세 개의 점으로 정의된 포물선) (드래그 또는 클릭하여 생성.)"
- },
- "tool_CustomMirror_popover": {
- "message": "사용자 정의 수식 y=f(x) 에 의해 정의된 거울. (x, y)는 두 제어점이 각각 (-1, 0)과 (1, 0)이 되도록 변환된 좌표입니다. (드래그 또는 클릭하여 생성.)"
- },
- "tool_BeamSplitter_popover": {
- "message": "입사광의 일부를 투과시키는 거울. (드래그 또는 클릭하여 생성.)"
- },
- "tool_IdealMirror_popover": {
- "message": "거울 방정식 (1/p + 1/q = 1/f) 를 따르는 이상적인 곡면 거울. 초점 거리를 설정할 수 있습니다. (드래그 또는 클릭하여 생성.)"
- },
- "tool_PlaneGlass_popover": {
- "message": "표면에서의 굴절 및 반사 시뮬레이션. (드래그 또는 클릭하여 생성.)"
- },
- "tool_CircleGlass_popover": {
- "message": "구면 유리. (중심과 표면의 한 점으로 정의된 원) (드래그 또는 클릭하여 생성.)"
- },
- "tool_CircleGrinGlass_popover": {
- "incomplete": true,
- "message": "Glass with a custom refractive index function n(x,y) and a circular boundary. (Drag or click to create.)"
- },
- "tool_Glass_popover": {
- "message": "선분과 원호로 구성된 다양한 형태의 유리 (선분을 생성하려면 클릭, 호를 만들려면 드래그, 그리기가 끝나면 시작점을 클릭.)"
- },
- "tool_GrinGlass_popover": {
- "incomplete": true,
- "message": "Glass with a custom refractive index function n(x,y) and a polygonal boundary. WARNING: Only simple polygons are supported, otherwise the behavior is unpredictable. (Click to create a segment, click on the starting point when finish drawing.)"
- },
- "tool_IdealLens_popover": {
- "message": "얇은 렌즈 방정식 (1/p + 1/q = 1/f) 를 따르는 이상적인 렌즈. 초점 거리를 설정할 수 있습니다. (드래그 또는 클릭하여 생성.)"
- },
- "tool_SphericalLens_popover": {
- "message": "구면 렌즈. (클릭하여 생성.)"
- },
- "tool_CustomGlass_popover": {
- "message": "사용자 정의 수식 f(x) < y < g(x) 에 의해 정의된 유리. (x, y)는 두 제어점이 각각 (-1, 0)과 (1, 0)이 되도록 변환된 좌표입니다. (드래그 또는 클릭하여 생성.)"
- },
- "tool_Blocker_popover": {
- "message": "입사 광선을 흡수하는 선형 차단기입니다. (드래그 또는 클릭하여 생성.)"
- },
- "tool_Aperture_popover": {
- "incomplete": true,
- "message": "A pair of light blockers which absorbs the incident rays. The size of the hole can be adjusted symmetrically. (Drag or click the two endpoints to create.)"
- },
- "tool_CircleBlocker_popover": {
- "message": "입사 광선을 흡수하는 원형 차단기입니다. (드래그 또는 클릭하여 생성.)"
- },
- "tool_DiffractionGrating_popover": {
- "incomplete": true,
- "message": "A diffraction grating that splits light at an angle depending on wavelength. Warning: The intensities of diffracted rays may not be accurate. (Drag or click to create.)"
- },
- "tool_Ruler_popover": {
- "message": "눈금자입니다. (시작점이 0) (드래그 또는 클릭하여 생성.)"
- },
- "tool_Protractor_popover": {
- "message": "도 단위의 각도기입니다. (시작점이 중심) (드래그 또는 클릭하여 생성.)"
- },
- "tool_Detector_popover": {
- "message": "선분을 통해 전달되는 에너지 흐름 (P), 수직 방향 momentum flow (F⊥), 평행 방향 memontum flow (F∥) 을 측정하는 도구입니다. 단위는 임의값 (A.U.) 입니다.."
- },
- "tool_Detector_info_popover": {
- "incomplete": true,
- "message": "
P: The rate of energy flow (flux) in B/s (see below).
F⊥: The rate of perpendicular momentum flow in (B/s)/c.
F∥: The rate of parallel momentum flow in (B/s)/c.
The irradiance in the exported CSV is in (B/s)/L.
L is the arbitrary unit of length used in this simulator.
B is an arbitrary unit of radiant flux or luminous flux, corresponding to the unit of the \"Brightness\" option being B/L for non-Lambertian beams and 500B/360° for point sources.
The dimensionless factor s is the \"Brightness Scale\" shown in Settings -> Show status box, which equals 1 when \"Ray Density\" is above some threshold and proportional to \"Ray Density\" otherwise.
If some rays are truncated in the infinite series of internal reflection, the total truncation is shown as error estimates.
"
- },
- "tool_TextLabel_popover": {
- "message": "텍스트 추가"
- },
- "tool_LineArrow_popover": {
- "incomplete": true,
- "message": "A line segment or arrow. (Drag or click to create.)"
- },
- "tool_Drawing_popover": {
- "incomplete": true,
- "message": "A freehand drawing tool. (Drag to draw.)"
- },
- "tool__popover": {
- "message": "화면을 이동하려면 드래그하십시오. (이 버튼을 누르지 않고, 마우스 우클릭 드래그를 사용해도 됩니다.)"
- },
- "mode_rays_popover": {
- "message": "광선을 나타냅니다. 광선 밀도가 높으면 연속적인 것 처럼 나타납니다."
- },
- "mode_extended_popover": {
- "message": "광선과 연장선을 모두 표시합니다. 회색은 진행 방향을, 주황색은 진행 방향의 반대 방향을 나타냅니다. '색상 (파장) 시뮬레이션'이 켜져 있으면 원본 색상으로 표시되고 점선으로 나타냅니다."
- },
- "mode_images_popover": {
- "message": "모든 상의 위치를 표시합니다. 노란색 점은 실상, 주황색 점은 허상, 회색 (예시 그림에는 없음) 점은 가상 객체를 나타냅니다. '광선 밀도'가 충분히 높지 않으면 일부 이미지를 감지할 수 없습니다. '색상 (파장) 시뮬레이션'이 켜져 있으면 원본 색상으로 표시되고 점 크기로 구분합니다."
- },
- "mode_observer_popover": {
- "message": "특정 위치에서 보는 광선과 상을 시뮬레이션합니다. 파란색 원은 관찰자이며 이것을 지나는 광선은 '관찰된 것'으로 간주됩니다. '관찰된 광선'으로부터 관찰자는 광선이 어디에선가 시작되었다고 생각할 수는 있지만, 실제로 어느 위치에서 시작된 광선인지는 알 수 없습니다. 광선들은 파란색으로, 실상과 허상은 각각 노란색과 주황색 점으로 나타납니다. (관찰자의 위치를 옮기려면 큰 파란 점을 드래그하십시오.) '색상 (파장) 시뮬레이션'이 켜져 있으면 원본 색상으로 표시됩니다."
- },
- "simulateColors_popover": {
- "message": "광원의 색상 (파장), 색상 혼합, 차단기와 거울에 의한 파장 필터링, 매질의 색 분산을 시뮬레이션합니다. 개체를 선택할 때 이러한 변수를 설정할 수 있습니다. 색상 스펙트럼을 시뮬레이션 하려면 여러 파장의 광선을 겹치십시오. 화면에 표시되는 색상은 대략적인 근사이며, 광선 밀도가 너무 높거나 낮을 시 매우 부정확할 수 있습니다. "
- },
- "rayDensity_popover": {
- "message": "빔이나 점광원으로부터 발생하는 광선의 개수를 결정합니다. 상 검출과 색 표현에도 영향을 미칩니다."
- },
- "showGrid_popover": {
- "message": "배경 격자의 가시성을 결정합니다. "
- },
- "grid_popover": {
- "message": "객체를 위치시킬 때 격자선에 물릴지 결정합니다."
- },
- "lockObjs_popover": {
- "message": "객체의 이동 가능 여부를 결정합니다."
- },
- "zoom_popover": {
- "message": "화면 확대 비율을 퍼센트로 결정합니다."
- },
- "help_popover": {
- "incomplete": true,
- "message": "Constrained dragging
When dragging an object, hold Shift to limit to horizontal/vertical; hold Ctrl to clone. When creating a line-shaped object or dragging its endpoints, hold Shift to lock the angle or snap to 0°, 45°, 90°; hold Ctrl to rotate/scale about its center.
Group, rotate, and scale objects
Hold Ctrl, click several control points (e.g. endpoints), then click empty space to group these points and create a handle. Drag the handle (or press arrow keys) to move the group; Shift+drag to limit to horizontal/vertical; Ctrl+drag to rotate, Ctrl+Shift+drag to scale. Drag the \"+\" to set rotation/scaling center. Click the handle and press Ctrl+D to duplicate the group; press Delete to ungroup.
Edit coordinates directly
Double-click or right-click the control point (e.g. endpoint) of the object, edit the (x,y) coordinates, then press Enter.
Keyboard shortcuts
When an object is selected (by clicking it), press arrow keys to move; Ctrl+D to duplicate; Delete key to delete.
"
- },
- "open": {
- "incomplete": true,
- "message": "Open"
- },
- "layoutaids": {
- "incomplete": true,
- "message": "Layout Aids"
- },
- "lockObjs": {
- "incomplete": true,
- "message": "Lock Objects"
- },
- "showGrid": {
- "incomplete": true,
- "message": "Grid"
- },
- "snapToGrid": {
- "incomplete": true,
- "message": "Snap to Grid"
- },
- "snaptogrid": {
- "incomplete": true,
- "message": "Snap to Grid"
- },
- "length_unit_popover": {
- "incomplete": true,
- "message": "The unit of length used in this simulator (except for wavelengths) is an arbitrary unit, which can be interpreted as any physical unit (e.g. millimeters) as long as it is consistent throughout the simulation. If the unit appears too small or too large, please adjust Settings -> Length Scale."
- },
- "lengthScale": {
- "incomplete": true,
- "message": "Length ScaleBeta"
- },
- "lengthScale_popover": {
- "incomplete": true,
- "message": "If the default unit of length is too small or too large to model a physical system when interpreted as a common physical unit (e.g. millimeters), this factor can be used to scale the appearance (e.g. line widths) in the scene."
- },
- "brightness": {
- "message": "Helderheid"
- },
- "wavelength": {
- "message": "Golflengte (nm)"
- },
- "dichroic": {
- "message": "Dichroïde"
- },
- "filter": {
- "message": "Filter"
- },
- "bandwidth": {
- "message": "Bandbreedte (nm)"
- },
- "invert": {
- "message": "Omkeren"
- },
- "emisAngle": {
- "incomplete": true,
- "message": "Emission Angle (°)"
- },
- "mirrored": {
- "incomplete": true,
- "message": "Mirrored"
- },
- "lineDensity": {
- "incomplete": true,
- "message": "Lines/mm"
- },
- "slitRatio": {
- "incomplete": true,
- "message": "Slit width / line spacing"
- },
- "customBrightness": {
- "incomplete": true,
- "message": "Custom Brightness"
- },
- "customBrightness_note_popover": {
- "incomplete": true,
- "message": "When on, the brightnesses of the diffracted rays are customized by an array of numbers corresponding to m = 0, 1, -1, 2, -2, .... The number is to be normalized to the brightness of the incident ray. The values not in the array are set to 0. For example, \"1, 0.5, 0.5\" means the m=0 ray has the same brightness as the incident ray, the m=1 and m=-1 rays have half the brightness, and all other rays are ignored."
- },
- "symmetric": {
- "incomplete": true,
- "message": "Symmetric"
- },
- "eqn_note": {
- "incomplete": true,
- "message": "
Supported constants: pi e
Supported operators: + - * / ^
Supported functions: sqrt sin cos tan sec csc cot sinh cosh tanh log exp arcsin arccos arctan arcsinh arccosh arctanh floor round ceil trunc sgn max min abs
Supported functions: sqrt sin cos tan sec csc cot sinh cosh tanh log arcsin arccos arctan
To simulate chromatic dispersion, use parameter lambda for the vacuum wavelength in nanometers.Beta
Only supports differentiable functions.
The origin of n(x,y) is in the absolute coordinates and does not move with the object. You may double-click a control-point to inspect its absolute coordinates.
For a more accurate simulation, see \"More options...\"
This toggle applies to all GRIN objects in the simulation.
This simulator has currently two implementations of light propagation between different mediums, for GRIN objects - numerical and symbolic (see 'multRefIndex' and 'devRefIndex' functions in 'CircleGrinGlass.js').
The numerical implementation is faster but doesn't always work properly (depending on the specific case) in scenarios when used with more than one GRIN object, such that at least one of them has a refractive index function which is not defined in the entire plane, while the symbolic implementation is slower but robust to such problems.
If this object is to be simulated with (absolute) refractive index n₁, but is placed inside another glass with refractive index n₀, then you should set the refractive index to n₁/n₀ here. In more complicated cases that several glasses overlap together, the effective reflective index of the overlapping region equals the product of the reflective indices of individual ones.
Step size of Euler's method for solving the eikonal ray equation - see 'step' function and documentation inside the 'CircleGrinGlass.js' file, for more information.
This numerical tolerance is used in the functions 'isOnBoundary' and 'countIntersections', inside the 'GrinGlass.js' file.
"
- },
- "cauchyCoeff": {
- "incomplete": true,
- "message": "Cauchy coefficient"
- },
- "transRatio": {
- "incomplete": true,
- "message": "Transmission Ratio"
- },
- "applytoall": {
- "message": "Overal toepassen"
- },
- "duplicate": {
- "message": "Dupliceer"
- },
- "delete": {
- "message": "Verwijder"
- },
- "unselect": {
- "incomplete": true,
- "message": "Unselect"
- },
- "unselect_popover": {
- "incomplete": true,
- "message": "Unselect this object (Right-click on blank space has the same function.)"
- },
- "showadvanced": {
- "incomplete": true,
- "message": "More options..."
- },
- "processing": {
- "message": "Rekenen... Klik hier om te stoppen."
- },
- "contribute": {
- "incomplete": true,
- "message": "Contribute"
- },
- "github": {
- "incomplete": true,
- "message": "GitHub"
- },
- "about": {
- "incomplete": true,
- "message": "About"
- },
- "about_url": {
- "message": "https://phydemo.app/ray-optics/about"
- },
- "translate": {
- "incomplete": true,
- "message": "Help us translate this app"
- },
- "translated": {
- "incomplete": true,
- "message": "translated"
- },
- "undo_popover": {
- "message": "Laatste actie ongedaan maken. (Ctrl+Z)"
- },
- "redo_popover": {
- "message": "Laatste actie opnieuw. (Ctrl+Y)"
- },
- "reset_popover": {
- "message": "Alle wijzigingen ongedaan maken."
- },
- "save_popover": {
- "message": "Huidig bestand opslaan."
- },
- "open_popover": {
- "incomplete": true,
- "message": "Open an existing file or background image. The background image will be shown from the coordinate origin. (Or drop the file)"
- },
- "get_link_popover": {
- "incomplete": true,
- "message": "Copy and go to the direct URL for the current scene, which can be used for sharing (possibly via a URL shortener). Also see Settings -> Auto sync URL."
- },
- "get_link_warning": {
- "incomplete": true,
- "message": "The URL is too long that it may not work on some platforms. You may need to use \"Save\" and share the file instead."
- },
- "export_svg_warning": {
- "incomplete": true,
- "message": "Export to SVG: Color mixtures and relative refractive indices below 1 are not supported."
- },
- "export_ray_count_warning": {
- "incomplete": true,
- "message": "The current number of rays in the scene is larger than the ray count limit. You may need to increase the ray count limit in the Crop Box options."
- },
- "view_gallery_popover": {
- "incomplete": true,
- "message": "Go to the Gallery webpage to load an example."
- },
- "tool_SingleRay_popover": {
- "message": "Één straal door twee punten. (Sleep of klik om te maken. Eerste punt is de bron. Tweede punt geeft de richting.)"
- },
- "tool_Beam_popover": {
- "incomplete": true,
- "message": "A parallel or divergent beam of rays emerges from a line segment, with density controlled by the 'Ray density' slider. (Drag or click to create.)"
- },
- "tool_PointSource_popover": {
- "message": "Lichtstralen vanuit één punt, het aantal stralen wordt ingesteld met 'Straaldichtheid'. (Klik om te maken.)"
- },
- "tool_AngleSource_popover": {
- "incomplete": true,
- "message": "Point source with a given emission angle."
- },
- "tool_Mirror_popover": {
- "message": "Simuleert de reflectie van licht op een spiegel. (Sleep of klik om te maken.)"
- },
- "tool_ArcMirror_popover": {
- "message": "Een spiegel in de vorm van een cirkelboog, door drie punten vastgelegd. De eerste twee punten leggen de afstand tussen de randen vast, het laatste punt de grootte.)"
- },
- "tool_ParabolicMirror_popover": {
- "incomplete": true,
- "message": "A mirror whose shape is a parabola, which is defined by three points. (Drag or click to create.)"
- },
- "tool_CustomMirror_popover": {
- "incomplete": true,
- "message": "A mirror whose shape is defined by a custom equation y = f(x), where (x,y) is in the transformed coordinates in which the two control points are (-1,0) and (1,0). (Drag or click to create.)"
- },
- "tool_BeamSplitter_popover": {
- "incomplete": true,
- "message": "A mirror that transmits a percentage of incoming light. (Drag or click to create.)"
- },
- "tool_IdealMirror_popover": {
- "message": "Een ideale 'gebogen' spiegel die precies de spiegel formule volgt (1/p + 1/q = 1/f). De brandpuntsafstand kan worden ingevoerd. (Sleep of klik om te maken.)"
- },
- "tool_PlaneGlass_popover": {
- "message": "Simuleert de refractie en reflectie van licht op/door een oppervlak. (Sleep of klik om te maken.)"
- },
- "tool_CircleGlass_popover": {
- "message": "Glasschijf, gedefinieerd door middelpunt en een punt op de rand. (Sleep of klik om te maken.)"
- },
- "tool_CircleGrinGlass_popover": {
- "incomplete": true,
- "message": "Glass with a custom refractive index function n(x,y) and a circular boundary. (Drag or click to create.)"
- },
- "tool_Glass_popover": {
- "message": "Glas in willekeurige vorm uit lijnstukken en cirkelbogen. (Klik om een lijnstuk te maken, sleep om een cirkelboog te maken, klik op startpunt om tekenen te sluiten.)"
- },
- "tool_GrinGlass_popover": {
- "incomplete": true,
- "message": "Glass with a custom refractive index function n(x,y) and a polygonal boundary. WARNING: Only simple polygons are supported, otherwise the behavior is unpredictable. (Click to create a segment, click on the starting point when finish drawing.)"
- },
- "tool_IdealLens_popover": {
- "message": "Een ideale lens die de lenzenformule volgt (1/v + 1/b = 1/f). De brandpuntafstand kan worden ingevoerd. (Sleep of klik om te maken.)"
- },
- "tool_SphericalLens_popover": {
- "incomplete": true,
- "message": "A spherical lens. (Click to create.)"
- },
- "tool_CustomGlass_popover": {
- "incomplete": true,
- "message": "Glass with the shape defined by a custom inequality f(x) < y < g(x), where (x,y) is in the transformed coordinates in which the two control points are (-1,0) and (1,0). (Drag or click to create.)"
- },
- "tool_Blocker_popover": {
- "message": "Een lichtblokkerend lijnstuk (scherm). (Sleep of klik om te maken.)"
- },
- "tool_Aperture_popover": {
- "incomplete": true,
- "message": "A pair of light blockers which absorbs the incident rays. The size of the hole can be adjusted symmetrically. (Drag or click the two endpoints to create.)"
- },
- "tool_CircleBlocker_popover": {
- "incomplete": true,
- "message": "A circle light blocker which absorbs the incident rays. (Drag or click to create.)"
- },
- "tool_DiffractionGrating_popover": {
- "incomplete": true,
- "message": "A diffraction grating that splits light at an angle depending on wavelength. Warning: The intensities of diffracted rays may not be accurate. (Drag or click to create.)"
- },
- "tool_Ruler_popover": {
- "message": "Een lineaal van 0 tot een willekeurige afstand. (Sleep of klik om te maken.)"
- },
- "tool_Protractor_popover": {
- "message": "Een gradenboog van middelpunt tot een ander punt (hoek 0). De schaal is in graden. (Sleep of klik om te maken.)"
- },
- "tool_Detector_popover": {
- "incomplete": true,
- "message": "A tool for measuring the rate of energy flow (P), the rate of perpendicular momentum flow (F⊥), and the rate of parallel momentum flow (F∥) through a line segment. (Drag or click to create the line segment.) The units are arbitrary."
- },
- "tool_Detector_info_popover": {
- "incomplete": true,
- "message": "
P: The rate of energy flow (flux) in B/s (see below).
F⊥: The rate of perpendicular momentum flow in (B/s)/c.
F∥: The rate of parallel momentum flow in (B/s)/c.
The irradiance in the exported CSV is in (B/s)/L.
L is the arbitrary unit of length used in this simulator.
B is an arbitrary unit of radiant flux or luminous flux, corresponding to the unit of the \"Brightness\" option being B/L for non-Lambertian beams and 500B/360° for point sources.
The dimensionless factor s is the \"Brightness Scale\" shown in Settings -> Show status box, which equals 1 when \"Ray Density\" is above some threshold and proportional to \"Ray Density\" otherwise.
If some rays are truncated in the infinite series of internal reflection, the total truncation is shown as error estimates.
"
- },
- "tool_TextLabel_popover": {
- "incomplete": true,
- "message": "A text label."
- },
- "tool_LineArrow_popover": {
- "incomplete": true,
- "message": "A line segment or arrow. (Drag or click to create.)"
- },
- "tool_Drawing_popover": {
- "incomplete": true,
- "message": "A freehand drawing tool. (Drag to draw.)"
- },
- "tool__popover": {
- "message": "Sleep om beeld te verplaatsen. (Rechtermuisknop sleep heeft dezelfde functie.)"
- },
- "mode_rays_popover": {
- "message": "Toont de stralen. Als de 'Straaldichtheid' groot is lijkt het continu."
- },
- "mode_extended_popover": {
- "incomplete": true,
- "message": "Show both the rays and its extension. Orange indicates backward extensions, and gray indicates forward ones. When 'Simulate Colors' is on, they are shown in source colors and distinguished by dashing instead."
- },
- "mode_images_popover": {
- "incomplete": true,
- "message": "Show the position of all images. Yellow points indicate real images, orange indicates virtual images, and gray (none in this picture) indicates virtual objects. Note that some images cannot be detected if 'Ray density' is not high enough. When 'Simulate Colors' is on, they are shown in source colors and distinguished by dot sizes instead."
- },
- "mode_observer_popover": {
- "incomplete": true,
- "message": "Simulate the rays and images seen from some position. The blue circle is the observer. Any rays crossing it are considered to be 'observed'. The observer does not know where the rays actually begin, but may think they begin at some point(s) if they intersect there. The rays are shown in blue, and the points in yellow (real) or orange (virtual). (Drag the big blue dot to move the observer.) When 'Simulate Colors' is on, they are shown in source colors instead."
- },
- "simulateColors_popover": {
- "incomplete": true,
- "message": "Simulate colors (wavelengths) of light sources, mixture of colors, color filtering of blockers and mirrors, and chromatic dispersion of glasses. You can set those parameters for those objects when selected. To simulate color spectra, overlap rays with different wavelengths. The colors shown on the screen are only rough approximations, and can be very inaccurate when 'Ray density' is too high or too low."
- },
- "rayDensity_popover": {
- "incomplete": true,
- "message": "Determines the number of rays to be emitted by beams and point sources. This also affects the accuracy of image detection and color rendering."
- },
- "showGrid_popover": {
- "message": "Toont of verbergt het achtergrondraster."
- },
- "grid_popover": {
- "message": "Zet verplaatsen op raster aan of uit."
- },
- "lockObjs_popover": {
- "message": "(De)Blokkeert de verplaatsing van objecten."
- },
- "zoom_popover": {
- "message": "Beeld in/uitzoomen met een percentage."
- },
- "help_popover": {
- "incomplete": true,
- "message": "Constrained dragging
When dragging an object, hold Shift to limit to horizontal/vertical; hold Ctrl to clone. When creating a line-shaped object or dragging its endpoints, hold Shift to lock the angle or snap to 0°, 45°, 90°; hold Ctrl to rotate/scale about its center.
Group, rotate, and scale objects
Hold Ctrl, click several control points (e.g. endpoints), then click empty space to group these points and create a handle. Drag the handle (or press arrow keys) to move the group; Shift+drag to limit to horizontal/vertical; Ctrl+drag to rotate, Ctrl+Shift+drag to scale. Drag the \"+\" to set rotation/scaling center. Click the handle and press Ctrl+D to duplicate the group; press Delete to ungroup.
Edit coordinates directly
Double-click or right-click the control point (e.g. endpoint) of the object, edit the (x,y) coordinates, then press Enter.
Keyboard shortcuts
When an object is selected (by clicking it), press arrow keys to move; Ctrl+D to duplicate; Delete key to delete.
"
- },
- "open": {
- "message": "Otwórz"
- },
- "layoutaids": {
- "message": "Opcje układu"
- },
- "lockObjs": {
- "message": "Zablokuj obiekty"
- },
- "showGrid": {
- "message": "Siatka"
- },
- "snapToGrid": {
- "message": "Przyciągaj do siatki"
- },
- "snaptogrid": {
- "message": "Przyciągaj do siatki"
- },
- "length_unit_popover": {
- "incomplete": true,
- "message": "The unit of length used in this simulator (except for wavelengths) is an arbitrary unit, which can be interpreted as any physical unit (e.g. millimeters) as long as it is consistent throughout the simulation. If the unit appears too small or too large, please adjust Settings -> Length Scale."
- },
- "lengthScale": {
- "incomplete": true,
- "message": "Length ScaleBeta"
- },
- "lengthScale_popover": {
- "incomplete": true,
- "message": "If the default unit of length is too small or too large to model a physical system when interpreted as a common physical unit (e.g. millimeters), this factor can be used to scale the appearance (e.g. line widths) in the scene."
- },
- "brightness": {
- "message": "Jasność"
- },
- "wavelength": {
- "message": "Długość fali (nm)"
- },
- "dichroic": {
- "message": "Dichroiczne"
- },
- "filter": {
- "message": "Filtr"
- },
- "bandwidth": {
- "message": "Szerokość pasma (nm)"
- },
- "invert": {
- "message": "Odwróć"
- },
- "emisAngle": {
- "message": "Kąt emisji (°)"
- },
- "mirrored": {
- "incomplete": true,
- "message": "Mirrored"
- },
- "lineDensity": {
- "incomplete": true,
- "message": "Lines/mm"
- },
- "slitRatio": {
- "incomplete": true,
- "message": "Slit width / line spacing"
- },
- "customBrightness": {
- "incomplete": true,
- "message": "Custom Brightness"
- },
- "customBrightness_note_popover": {
- "incomplete": true,
- "message": "When on, the brightnesses of the diffracted rays are customized by an array of numbers corresponding to m = 0, 1, -1, 2, -2, .... The number is to be normalized to the brightness of the incident ray. The values not in the array are set to 0. For example, \"1, 0.5, 0.5\" means the m=0 ray has the same brightness as the incident ray, the m=1 and m=-1 rays have half the brightness, and all other rays are ignored."
- },
- "symmetric": {
- "message": "Symetryczna"
- },
- "eqn_note": {
- "incomplete": true,
- "message": "
Supported constants: pi e
Supported operators: + - * / ^
Supported functions: sqrt sin cos tan sec csc cot sinh cosh tanh log exp arcsin arccos arctan arcsinh arccosh arctanh floor round ceil trunc sgn max min abs
Supported functions: sqrt sin cos tan sec csc cot sinh cosh tanh log arcsin arccos arctan
To simulate chromatic dispersion, use parameter lambda for the vacuum wavelength in nanometers.Beta
Only supports differentiable functions.
The origin of n(x,y) is in the absolute coordinates and does not move with the object. You may double-click a control-point to inspect its absolute coordinates.
For a more accurate simulation, see \"More options...\"
Ten przełącznik dotyczy wszystkich obiektów GRIN w symulacji.
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 'CircleGrinGlass.js').
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.
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ł.
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 'CircleGrinGlass.js'.
Ta tolerancja numeryczna jest używana w funkcjach 'isOnBoundary' i 'countIntersections' w pliku 'GrinGlass.js'.
"
- },
- "cauchyCoeff": {
- "message": "Współczynnik Cauchy'ego"
- },
- "transRatio": {
- "message": "Współczynnik transmisji"
- },
- "applytoall": {
- "message": "Zastosuj do wszystkich"
- },
- "duplicate": {
- "message": "Powiel"
- },
- "delete": {
- "message": "Usuń"
- },
- "unselect": {
- "message": "Odznacz"
- },
- "unselect_popover": {
- "message": "Usuń zaznaczenie tego obiektu (kliknięcie prawym przyciskiem myszy pustego miejsca ma tę samą funkcję)."
- },
- "showadvanced": {
- "message": "Więcej opcji..."
- },
- "processing": {
- "message": "Przetwarzanie... Kliknij tutaj, aby zatrzymać."
- },
- "contribute": {
- "message": "Wnieś wkład"
- },
- "github": {
- "message": "GitHub"
- },
- "about": {
- "message": "O aplikacji"
- },
- "about_url": {
- "message": "https://phydemo.app/ray-optics/about"
- },
- "translate": {
- "message": "Pomóż nam przetłumaczyć tę aplikację"
- },
- "translated": {
- "message": "przetłumaczone"
- },
- "undo_popover": {
- "message": "Cofnij ostatnią czynność. (Ctrl+Z)"
- },
- "redo_popover": {
- "message": "Ponów ostatnią czynność. (Ctrl+Y)"
- },
- "reset_popover": {
- "message": "Zresetuj wszystkie zmiany."
- },
- "save_popover": {
- "message": "Zapisz bieżącą scenę jako plik."
- },
- "open_popover": {
- "message": "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)"
- },
- "get_link_popover": {
- "incomplete": true,
- "message": "Copy and go to the direct URL for the current scene, which can be used for sharing (possibly via a URL shortener). Also see Settings -> Auto sync URL."
- },
- "get_link_warning": {
- "message": "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."
- },
- "export_svg_warning": {
- "message": "Eksportuj do SVG. Mieszanki kolorów i względne współczynniki załamania światła poniżej 1 nie są obsługiwane."
- },
- "export_ray_count_warning": {
- "incomplete": true,
- "message": "The current number of rays in the scene is larger than the ray count limit. You may need to increase the ray count limit in the Crop Box options."
- },
- "view_gallery_popover": {
- "message": "Przejdź do strony Galerii, aby załadować przykład."
- },
- "tool_SingleRay_popover": {
- "message": "Pojedynczy promień światła określony przez dwa punkty. (Przeciągnij lub kliknij, aby utworzyć. Pierwszy punkt to źródło, wysyłające promień w kierunku drugiego punktu.)"
- },
- "tool_Beam_popover": {
- "message": "Z odcinka wyłania się równoległa lub rozbieżna wiązka promieni o gęstości kontrolowanej przez suwak 'Gęstość promieni'. (Przeciągnij lub kliknij, aby utworzyć.)"
- },
- "tool_PointSource_popover": {
- "message": "Promienie wychodzące z jednego punktu. Ich liczba regulowana jest za pomocą suwaka 'Gęstość promieni'. (Kliknij, aby utworzyć.)"
- },
- "tool_AngleSource_popover": {
- "message": "Źródło punktowe o zadanym kącie emisji."
- },
- "tool_Mirror_popover": {
- "message": "Symuluje odbicie światła w zwierciadle płaskim. (Przeciągnij lub kliknij, aby utworzyć.)"
- },
- "tool_ArcMirror_popover": {
- "message": "Zwierciadło, którego powierzchnia w przekroju jest fragmentem okręgu, określonym za pomocą trzech punktów. (Przeciągnij lub kliknij, aby utworzyć. Pierwsze 2 punkty określają odstęp między końcami łuku, ostatni punkt określa promień krzywizny.)"
- },
- "tool_ParabolicMirror_popover": {
- "message": "Zwierciadło, którego powierzchnia w przekroju jest fragmentem paraboli, określonej za pomocą trzech punktów. (Przeciągnij lub kliknij, aby utworzyć.)"
- },
- "tool_CustomMirror_popover": {
- "message": "Zwierciadło, którego kształt jest określony przez niestandardowe równanie y = f(x), gdzie (x,y) jest w przekształconych współrzędnych, w których dwoma punktami kontrolnymi są (-1,0) i (1,0). (Przeciągnij lub kliknij, aby utworzyć.)"
- },
- "tool_BeamSplitter_popover": {
- "message": "Zwierciadło odbijające pewien procent padającego światła. (Przeciągnij lub kliknij, aby utworzyć.)"
- },
- "tool_IdealMirror_popover": {
- "message": "Idealnie 'zakrzywione' zwierciadło, dokładnie spełniające równanie (1/x + 1/y = 1/f). Ogniskową można ustawić bezpośrednio. (Przeciągnij lub kliknij, aby utworzyć.)"
- },
- "tool_PlaneGlass_popover": {
- "message": "Symuluje załamanie i odbicie światła na granicy ośrodków. (Przeciągnij lub kliknij, aby utworzyć.)"
- },
- "tool_CircleGlass_popover": {
- "message": "Szkło o przekroju kołowym, określonym przez środek i punkt na brzegu. (Przeciągnij lub kliknij, aby utworzyć.)"
- },
- "tool_CircleGrinGlass_popover": {
- "message": "Szkło z konfigurowaną funkcją współczynnika załamania n(x,y) i kołową krawędzią. (Przeciągnij lub kliknij, aby utworzyć)."
- },
- "tool_Glass_popover": {
- "message": "Szkło o dowolnych kształtach, mających przekroje ograniczone odcinkami i fragmentami okręgów. (Kliknij, aby utworzyć odcinek; przeciągnij, aby utworzyć łuk; kliknij punkt początkowy, żeby zakończyć rysowanie.)"
- },
- "tool_GrinGlass_popover": {
- "message": "Szkło z konfigurowaną funkcją współczynnika załamania n(x,y) i wielokątną krawędzią. OSTRZEŻENIE: Obsługiwane są tylko proste wielokąty, w przeciwnym razie zachowanie jest nieprzewidywalne. (Kliknij, aby utworzyć odcinek, kliknij punkt początkowy po zakończeniu rysowania.)"
- },
- "tool_IdealLens_popover": {
- "message": "Idealna soczewka, która spełnia dokładnie równanie (1/x + 1/y = 1/f). Ogniskową można ustawić bezpośrednio. (Przeciągnij lub kliknij, aby utworzyć.)"
- },
- "tool_SphericalLens_popover": {
- "message": "Soczewka sferyczna. (Przeciągnij lub kliknij, aby utworzyć.)"
- },
- "tool_CustomGlass_popover": {
- "message": "Szkło o kształcie zdefiniowanym przez niestandardową nierówność f(x) < y < g(x), gdzie (x,y) jest w przekształconych współrzędnych, w których dwoma punktami kontrolnymi są (-1,0) i (1,0). (Przeciągnij lub kliknij, aby utworzyć.)"
- },
- "tool_Blocker_popover": {
- "message": "Przeszkoda - odcinek - pochłaniająca padające promienie. (Przeciągnij lub kliknij, aby utworzyć.)"
- },
- "tool_Aperture_popover": {
- "message": "Para blokerów światła, które pochłaniają padające promienie. Rozmiar otworu można regulować symetrycznie. (Przeciągnij lub kliknij dwa punkty końcowe, aby utworzyć)."
- },
- "tool_CircleBlocker_popover": {
- "message": "Przeszkoda - okrąg - pochłaniająca padające promienie. (Przeciągnij lub kliknij, aby utworzyć.)"
- },
- "tool_DiffractionGrating_popover": {
- "incomplete": true,
- "message": "A diffraction grating that splits light at an angle depending on wavelength. Warning: The intensities of diffracted rays may not be accurate. (Drag or click to create.)"
- },
- "tool_Ruler_popover": {
- "message": "Linijka odmierzająca odległość od punktu zero (pierwsze kliknięcie) do innego punktu (drugie kliknięcie). (Przeciągnij lub kliknij, aby utworzyć.)"
- },
- "tool_Protractor_popover": {
- "message": "Kątomierz określony przez środek (wierzchołek kąta - pierwsze kliknięcie) i inny punkt dla kierunku zerowego (drugie kliknięcie). Skala jest w stopniach. (Przeciągnij lub kliknij, aby utworzyć.)"
- },
- "tool_Detector_popover": {
- "message": "Narzędzie do pomiaru szybkości przepływu energii (P), szybkości prostopadłego przepływu pędu (F⊥), i szybkości równoległego przepływu pędu (F∥) przez odcinek. (Przeciągnij lub kliknij, aby utworzyć odcinek). Jednostki są umowne."
- },
- "tool_Detector_info_popover": {
- "incomplete": true,
- "message": "
P: The rate of energy flow (flux) in B/s (see below).
F⊥: The rate of perpendicular momentum flow in (B/s)/c.
F∥: The rate of parallel momentum flow in (B/s)/c.
The irradiance in the exported CSV is in (B/s)/L.
L is the arbitrary unit of length used in this simulator.
B is an arbitrary unit of radiant flux or luminous flux, corresponding to the unit of the \"Brightness\" option being B/L for non-Lambertian beams and 500B/360° for point sources.
The dimensionless factor s is the \"Brightness Scale\" shown in Settings -> Show status box, which equals 1 when \"Ray Density\" is above some threshold and proportional to \"Ray Density\" otherwise.
If some rays are truncated in the infinite series of internal reflection, the total truncation is shown as error estimates.
"
- },
- "tool_TextLabel_popover": {
- "message": "Etykieta tekstowa."
- },
- "tool_LineArrow_popover": {
- "message": "Odcinek lub strzałka. (Przeciągnij lub kliknij, aby utworzyć.)"
- },
- "tool_Drawing_popover": {
- "message": "Narzędzie do rysowania odręcznego. (Przeciągnij, aby narysować.)"
- },
- "tool__popover": {
- "message": "Przeciągnij, aby przesunąć widok. (Przeciąganie prawym przyciskiem myszy ma tę samą funkcję)."
- },
- "mode_rays_popover": {
- "message": "Pokaż promienie. Gdy 'Gęstość promieni' jest duża, wiązka pojawia się jako ciągła."
- },
- "mode_extended_popover": {
- "message": "Pokaż zarówno promienie, jak i ich przedłużenia. Kolor pomarańczowy wskazuje przedłużenia do tyłu, a szary do przodu. Gdy opcja „Symuluj kolory” jest włączona, są one wyświetlane w kolorach źródłowych i zamiast tego wyróżniane linią przerywaną."
- },
- "mode_images_popover": {
- "message": "Pokaż położenie wszystkich obrazów. Żółte punkty oznaczają obrazy rzeczywiste, pomarańczowe obrazy pozorne, a szare (brak na tym zdjęciu) obiekty wirtualne. Zwróć uwagę, że niektórych obrazów nie można wykryć, jeśli 'Gęstość promieni' nie jest wystarczająco wysoka. Gdy opcja „Symuluj kolory” jest włączona, są one wyświetlane w kolorach źródłowych i zamiast tego rozróżniane na podstawie wielkości kropek."
- },
- "mode_observer_popover": {
- "message": "Symuluje promienie i obrazy widziane z określonego miejsca. Obserwatora symbolizuje niebieskie kółko. Wszelkie przecinające je promienie uważa się za 'obserwowane'. Obserwator nie wie, gdzie faktycznie zaczynają się promienie, ale będzie mu się wydawało, że zaczynają się w pewnym punkcie (punktach), jeśli się tam przecinają. Promienie są pokazane na niebiesko, a punkty na żółto (rzeczywiste) lub pomarańczowo (pozorne). (Przeciągnij dużą niebieską kropkę, aby przesunąć obserwatora.) Gdy opcja „Symuluj kolory” jest włączona, zamiast tego są one wyświetlane w kolorach źródłowych."
- },
- "simulateColors_popover": {
- "message": "Symulacja kolorów (długości fal) źródeł światła, mieszania kolorów, filtrowania kolorów przez filtry blokujące i lustra oraz dyspersji chromatycznej szkieł. Po wybraniu można ustawić te parametry dla tych obiektów. Aby symulować widma kolorów, należy nałożyć na siebie promienie o różnych długościach fal. Kolory wyświetlane na ekranie są jedynie przybliżone i mogą być bardzo niedokładne, gdy 'Gęstość promieni' jest zbyt wysoka lub zbyt niska."
- },
- "rayDensity_popover": {
- "message": "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."
- },
- "showGrid_popover": {
- "message": "Określa widoczność siatki tła."
- },
- "grid_popover": {
- "message": "Określa, czy przyciągać do węzłów siatki."
- },
- "lockObjs_popover": {
- "message": "Określa, czy obiekty mogą być przenoszone, czy nie."
- },
- "zoom_popover": {
- "message": "Wielkość widoku w procentach."
- },
- "help_popover": {
- "incomplete": true,
- "message": "Constrained dragging
When dragging an object, hold Shift to limit to horizontal/vertical; hold Ctrl to clone. When creating a line-shaped object or dragging its endpoints, hold Shift to lock the angle or snap to 0°, 45°, 90°; hold Ctrl to rotate/scale about its center.
Group, rotate, and scale objects
Hold Ctrl, click several control points (e.g. endpoints), then click empty space to group these points and create a handle. Drag the handle (or press arrow keys) to move the group; Shift+drag to limit to horizontal/vertical; Ctrl+drag to rotate, Ctrl+Shift+drag to scale. Drag the \"+\" to set rotation/scaling center. Click the handle and press Ctrl+D to duplicate the group; press Delete to ungroup.
Edit coordinates directly
Double-click or right-click the control point (e.g. endpoint) of the object, edit the (x,y) coordinates, then press Enter.
Keyboard shortcuts
When an object is selected (by clicking it), press arrow keys to move; Ctrl+D to duplicate; Delete key to delete.
"
- },
- "show_help_popups": {
- "message": "Pokaż okienka pomocy"
- },
- "show_help_popups_popover": {
- "message": "Określa, czy wyświetlać wyskakujące okienka pomocy po najechaniu kursorem na przyciski. (Załaduj ponownie stronę, aby zastosować.)"
- },
- "show_json_editor": {
- "incomplete": true,
- "message": "Show JSON editorBeta"
- },
- "show_json_editor_popover": {
- "incomplete": true,
- "message": "Show the code editor for the JSON representation of the scene, which is needed when creating a custom module (See Tools -> Other -> Import Modules -> Make custom modules)."
- },
- "show_status": {
- "incomplete": true,
- "message": "Show status box"
- },
- "show_status_popover": {
- "incomplete": true,
- "message": "Show the status box, which includes the mouse coordinates, performance information, and the truncated brightness (the total brightness of the rays truncated in the infinite series of internal reflection)."
- },
- "auto_sync_url": {
- "incomplete": true,
- "message": "Auto sync URL"
- },
- "auto_sync_url_popover": {
- "incomplete": true,
- "message": "When enabled, the URL will be updated automatically with the current scene, so you don't need to keep saving the scene manually. To set the title, use File -> Save -> Rename."
- },
- "auto_sync_url_warning": {
- "incomplete": true,
- "message": "The scene is too large to sync with URL. Please save it manually."
- },
- "gridSize": {
- "incomplete": true,
- "message": "Grid Size"
- },
- "observer_size": {
- "incomplete": true,
- "message": "Observer Size"
- },
- "language": {
- "message": "Język"
- },
- "close": {
- "message": "Zamknij"
- },
- "advanced_help": {
- "message": "Aby uzyskać zaawansowaną pomoc, zobacz ikonę pomocy w prawym dolnym rogu."
- },
- "ray_count": {
- "incomplete": true,
- "message": "Number of ray segments: "
- },
- "total_truncation": {
- "incomplete": true,
- "message": "Truncated brightness: "
- },
- "brightness_scale": {
- "incomplete": true,
- "message": "Brightness Scale: "
- },
- "time_elapsed": {
- "incomplete": true,
- "message": "Time elapsed (ms): "
- },
- "force_stopped": {
- "incomplete": true,
- "message": "Force stopped."
- },
- "mouse_coordinates": {
- "incomplete": true,
- "message": "Mouse coordinates: "
- },
- "modules_tutorial": {
- "incomplete": true,
- "message": "Make custom modules"
- },
- "modules_tutorial_url": {
- "incomplete": true,
- "message": "https://phydemo.app/ray-optics/modules/tutorial"
- },
- "identical_optical_objects_warning": {
- "incomplete": true,
- "message": "There are two identical optical elements in the scene that overlap completely. This may cause unexpected behavior."
- },
- "import_modules": {
- "incomplete": true,
- "message": "Import Modules..."
- },
- "import_modules_title": {
- "incomplete": true,
- "message": "Import Modules"
- },
- "modules_url": {
- "incomplete": true,
- "message": "../modules/modules.html"
- },
- "remove_module": {
- "incomplete": true,
- "message": "Remove module"
- },
- "module_conflict": {
- "incomplete": true,
- "message": "A different module with the same name already exists in the current scene. You may enter a new name, or leave it the same to overwrite the existing module."
- },
- "brightness_inconsistent_warning": {
- "incomplete": true,
- "message": "The brightnesses of two or more light sources saturate with inconsistent ratios. This may lead to wrong detector readings and color rendering. Please increase the ray density or reduce the brightnesses of the light sources."
- }
-}
\ No newline at end of file
diff --git a/locales/pl/gallery.json b/locales/pl/gallery.json
new file mode 100644
index 00000000..054986ff
--- /dev/null
+++ b/locales/pl/gallery.json
@@ -0,0 +1,356 @@
+{
+ "galleryPage": {
+ "title": "Galeria Promieni Optycznych",
+ "description": "Jest to zbiór symulacji wykonanych za pomocą [aplikacji internetowej](/simulator), którą można wykorzystać do tworzenia takich interaktywnych demonstracji z optyki. Zapraszamy do dodawania nowych elementów. Aby uzyskać więcej informacji, zobacz [przewodnik dotyczący wkładu](/contributing/gallery). Aby zgłosić błąd, [otwórz problem w GitHub](/github/issues) lub wyślij wiadomość e-mail na adres [ray-optics@phydemo.app](/email).",
+ "categories": {
+ "title": "Kategorie",
+ "reflection": "Odbicie",
+ "refraction": "Załamanie",
+ "lens": "Soczewka",
+ "combinationOfLenses": "Układy soczewek",
+ "grinOptics": "Optyka gradientowa (GRIN)",
+ "miscellaneous": "Różne"
+ },
+ "contributors": "Osoba wnosząca wkład: {{contributors}}",
+ "openInSimulator": "Otwórz w symulatorze"
+ },
+ "galleryData": {
+ "common": {
+ "warningthesequenceof": "Ostrzeżenie: sekwencja pojawiania się światła nie reprezentuje rzeczywistej prędkości światła - znaczenie ma tylko obraz końcowy."
+ },
+ "imagesFormedByTwoMirrors": {
+ "title": "Obrazy w układzie dwóch zwierciadeł",
+ "description": "Symulacja pokazuje obrazy utworzone przez dwa zwierciadła płaskie. Zielone \"L\" to przedmiot. Jeśli kąt między dwoma zwierciadłami wynosi \\(\\frac{360^\\circ}{n}\\), wtedy powstanie \\(n-1\\) pozornych obrazów (pomarańczowe L). Można przeciągnąć punkt końcowy każdego ze zwierciadeł, aby zmienić kąt między nimi."
+ },
+ "parabolicMirror": {
+ "title": "Zwierciadło paraboliczne",
+ "description": "Symulacja pokazuje właściwości ogniskowania zwierciadła parabolicznego."
+ },
+ "hyperbolicMirror": {
+ "title": "Zwierciadło hiperboliczne",
+ "description": "Demonstracja właściwości odbicia od zwierciadła hiperbolicznego: Promienie świetlne biegnące od jednego ogniska w kierunku zwierciadła hiperbolicznego będą odbijać się biegnąc tak, że ich przedłużenia wypadają w drugim ognisku.\n\nDwa ogniska hiperboli to punkty aplanatyczne (patrz [Punkty aplanatyczne](/gallery/aplanatic-points)).",
+ "theorangeraysareimag": "Promienie pomarańczowe są pozornymi promieniami (przedłużenia odbitych promieni żółtych).\nTe pozorne promienie skupiają się w drugim ognisku.",
+ "pointlightsourceaton": "Umieść źródło światła w ognisku"
+ },
+ "retroreflectors": {
+ "title": "Retroreflektory",
+ "description": "symulacja dwóch rodzajów retroreflektorów:\n\n1. Retroreflektor narożny.\n2. Retroreflektor kocie oko.",
+ "dragtorotatethebeam": "przeciągnij tutaj\naby obrócić wiązkę",
+ "catseyeretroreflecto": "Retroreflektor kocie oko",
+ "cornerretroreflector": "Retroreflektor narożny"
+ },
+ "periscope": {
+ "title": "Peryskop",
+ "description": "Symulacja peryskopu wykonanego z dwóch płaskich zwierciadeł i kilku elementów blokujących światło.",
+ "observerseyenottosca": "Oko obserwatora (nie w skali)"
+ },
+ "newtonianTelescope": {
+ "title": "Teleskop Newtona",
+ "description": "Model teleskopu Newtona z okularem Plössla."
+ },
+ "penroseUnilluminableRoom": {
+ "title": "Nieoświetlony pokój Penrose'a",
+ "description": "Niemożliwy do oświetlenia pokój Penrose'a jest zbudowany z luster eliptycznych, kołowych i liniowych. Ma tą interesującą właściwość, że źródło punktowe (zielone) w pomieszczeniu nie oświetli całego pomieszczenia, bez względu na to, gdzie je umieścisz. Możesz przeciągnąć zielony punkt, aby przesunąć źródło.",
+ "nomatterwhereyouputt": "Bez względu na to, gdzie umieścisz źródło punktowe, nie oświetli ono całego pomieszczenia.\nOstrzeżenie: z powodu błędu numerycznego po pewnym czasie może nadal świecić."
+ },
+ "opticalCavity": {
+ "title": "Wnęka optyczna z dwoma zwierciadłami",
+ "description": "Jest to symulacja promieni wewnątrz wnęki optycznej z dwoma zwierciadłami. Biorąc pod uwagę, że długość wnęki wynosi \\(d\\), a promienie krzywizny jej zwierciadeł wynoszą odpowiednio \\(R_1\\) i \\(R_2\\) (z konwencją, że \\(R>0\\) dla zwierciadła wklęsłego), to wnęka optyczna jest stabilna (co oznacza, że dla każdego promienia wychodzącego z jednego zwierciadeł w kierunku drugiego zwierciadła trajektoria nierozbieżna jest gwarantowana dla dostatecznie wysokich zwierciadeł), wtedy i tylko wtedy, gdy \\(0\\leq (1-\\frac {d}{R_1})(1-\\frac {d}{R_2})\\leq 1\\). W tej symulacji zakładamy, że zwierciadła są idealnie zakrzywionymi zwierciadłami, co oznacza, że \\(f=\\frac{R}{2}\\) i sprowadza poprzedni warunek stabilności do postaci \\(0\\leq (1-\\frac {d}{2f_1})(1-\\frac {d}{2f_2})\\leq 1\\). [Tutaj](/gallery/resonator) podobna symulacja ze zwierciadłami sferycznymi, gdzie pierwszy warunek stabilności jest spełniony w przybliżeniu przyosiowym.",
+ "clickholdleftmouseto": "Kliknij + przytrzymaj lewy przycisk myszy\naby przesunąć promień",
+ "d400intheresonatorsb": "d = 400 w rezonatorach poniżej",
+ "confocalresonator": "Rezonator konfokalny",
+ "concentricresonator": "Rezonator koncentryczny",
+ "concaveconvexresonat": "Rezonator wklęsło-wypukły",
+ "planoconcaveresonato": "Rezonator płasko-wklęsły"
+ },
+ "resonator": {
+ "title": "Rezonator płasko-wklęsły",
+ "description": "To jest demonstracja rezonatora płasko-wklęsłego. Jeśli odległość między zwierciadłami jest większa niż promień krzywizny, rezonator jest niestabilny. Jeśli odległość między zwierciadłami jest mniejsza lub równa promieniowi krzywizny, otrzymujemy stabilny tryb rezonatora.",
+ "flatmirror": "Zwierciadło płaskie",
+ "sphericalconcavemirr": "Sferyczne zwierciadło wklęsłe",
+ "unstableresonator": "Niestabilny rezonator",
+ "stableresonator": "Stabilny rezonator"
+ },
+ "mazeSolution": {
+ "title": "Rozwiązanie labiryntu",
+ "description": "Symulacja biegu promienia światła wysłanego w labiryncie, wielokrotnie odbijanego przez ściany. Większy i mniejszy czerwony kwadrat wewnątrz labiryntu (widoczne na zrzucie ekranu poniżej) reprezentują odpowiednio punkt wysłania i początkowy kierunek promienia światła. W przypadku niektórych początkowych orientacji, promień światła wychodzi z labiryntu, a tym samym, cofając się po torze promienia, można zasadniczo znaleźć rozwiązanie labiryntu.",
+ "controltherayorigina": "Kontroluj początek promienia i początkowy kierunek\nprzeciągając górny i dolny znacznik (odpowiednio).",
+ "notethatthesimulatio": "Należy zauważyć, że przetwarzanie symulacji kończy się tylko raz\ni wtedy komunikat przetwarzania w lewym dolnym rogu zniknie.",
+ "mazeexit": "Wyjście z labiryntu"
+ },
+ "specularAndDiffuseReflection": {
+ "title": "Odbicie zwierciadlane i rozproszone",
+ "description": "Identyczne wiązki promieni padają na powierzchnię gładką i chropowatą, ilustrując różnicę między odbiciem zwierciadlanym i rozproszonym.",
+ "specular": "Zwierciadlane",
+ "diffuse": "Rozproszone"
+ },
+ "chaffCountermeasure": {
+ "title": "Dipole odbijające (chaff)",
+ "description": "Jest to jakościowa symulacja systemu przeciwdziałania namiarom radarowym (pomijając efekty dyfrakcyjne).",
+ "plane": "Płaszczyzna",
+ "radar": "Radar",
+ "chaff": "Chaff"
+ },
+ "reflect": {
+ "title": "Odbicie i załamanie",
+ "description": "Symulacja pokazuje odbicie i załamanie na powierzchni."
+ },
+ "internalReflection": {
+ "title": "Odbicie wewnętrzne",
+ "description": "Symulacja pokazuje refrakcję i wewnętrzne odbicie na powierzchni."
+ },
+ "prisms": {
+ "title": "Pryzmaty",
+ "description": "Symulacja pokazuje pryzmat prostokątny, pryzmat Porro (dachowy), pryzmat romboidalny, pryzmat Gołębicy i pryzmat pentagonalny.",
+ "rhomboid": "romboidalny",
+ "rightangle": "prostokątny",
+ "porro": "Porro",
+ "dove": "Gołąb",
+ "pentaprism": "pentagonalny"
+ },
+ "beamDirectors": {
+ "title": "Kierowanie wiązką światła",
+ "description": "Symulacja bipryzmatu regularnego i Fresnela. Bipryzmat może skierować padającą skolimowaną wiązkę w dwóch kierunkach, w zależności od kąta wierzchołkowego.",
+ "fresnelbiprism": "Bipryzmat Fresnela",
+ "biprism": "Bipryzmat"
+ },
+ "apparentDepth": {
+ "title": "Pozorna głębokość",
+ "description": "Kiedy patrzysz z powietrza na obiekt pod wodą, głębokość na jakiej się znajduje wydaje się być mniejsza niż w rzeczywistości. Złudzenie to jest spowodowane załamaniem światła i zostało zademonstrowane w tej symulacji. Pozorna głębokość zależy od położenia obserwatora, co można zademonstrować, przeciągając niebieskie kółko.",
+ "observedimageorange": "obserwowany obraz (pomarańczowy)",
+ "observer": "obserwator",
+ "objectunderwatergree": "obiekt pod wodą (zielony)"
+ },
+ "bendedPencil": {
+ "title": "Zgięty ołówek",
+ "description": "Jest to symulacja obrazu postrzeganego przez nas, gdy patrzymy z góry na częściowo zanurzony w szklance wody ołówek. Załamanie promieni powoduje, że ołówek może wyglądać zarówno na wygięty, jak i złamany (w zależności od położenia oczu obserwatora). Jednak w tej symulacji zginanie jest bardziej wyraźne. Możesz sprawdzić symulację [Złamany ołówek](/gallery/broken-pencil), gdzie to drugie złudzenie jest bardziej wyraźne.",
+ "bentpencilyellowimag": "zagięty ołówek (żółty)\nobraz na siatkówce",
+ "dielectricmaterial": "materiał dielektryczny",
+ "originalpencilgreen": "ołówek oryginalny (zielony)",
+ "observerseye": "oko obserwatora",
+ "ignoretheorangesquar": "Zignoruj pomarańczowe kwadraty!"
+ },
+ "brokenPencil": {
+ "title": "Złamany ołówek",
+ "description": "Jest to symulacja obrazu postrzeganego przez nas, gdy patrzymy z boku na częściowo zanurzony w szklance wody ołówek. Załamanie promieni powoduje, że ołówek może wyglądać zarówno na wygięty, jak i złamany (w zależności od położenia oczu obserwatora). Jednak w tej symulacji złamanie jest bardziej wyraźne. Możesz sprawdzić symulację [Zgięty ołówek](/gallery/bended-pencil), gdzie to drugie złudzenie jest bardziej wyraźne.",
+ "brokenpencilyellowim": "złamany ołówek (żółty)\nobraz na siatkówce"
+ },
+ "chromaticDispersion": {
+ "title": "Dyspersja chromatyczna",
+ "description": "Symulacja pokazuje dyspersję chromatyczną za pomocą wiązki światła białego i trójkątnego pryzmatu. Biały kolor tutaj powstaje przez mieszanie kolorów czerwonego, pomarańczowego, żółtego, zielonego, cyjanowego, niebieskiego i fioletowego.",
+ "dragheretoadjustbeam": "przeciągnij tutaj\n aby ustawić szerokość wiązki",
+ "dragheretorotatethep": "przeciągnij tutaj\naby obrócić pryzmat"
+ },
+ "rainbows": {
+ "title": "Tęcze",
+ "description": "Symulacja pokazuje formowanie się tęczy pierwotnej, tęczy wtórnej i ciemnego pasa Aleksandra. Tutaj widmo światła słonecznego jest przybliżone przez zmieszanie kolorów czerwonego, pomarańczowego, żółtego, zielonego, cyjanowego, niebieskiego i fioletowego. Promienie wychodzące dla pierwotnej/wtórnej tęczy wynikają z jednego/dwóch wewnętrznych odbić w kropli deszczu (można to zobaczyć, ustawiając niską gęstość promieni i przeciągając kroplę deszczu). Należy zauważyć, że nie są to całkowite wewnętrzne odbicia, więc intensywność promieni wychodzących jest znacznie niższa niż promieni padających. Ponieważ [minimalne kąty odchylenia](/gallery/minimum-deviation-angle) zależą od długości fali, różne kolory kumulują się pod różnymi kątami. Stąd powstają kolory tęczy. Z dala od minimalnych kątów promienie nie kumulują się, więc wszystkie kolory są słabe i mieszają się ze sobą, tworząc przyćmiony biały (lub „szary”) kolor pod kątami tuż na zewnątrz obu tęcz. Z drugiej strony żadne promienie nie docierają w obszar kąta między tęczami, tworząc ciemny pas Aleksandra.",
+ "thesearethecolorspro": "Są to kolory powstałe z pojedynczej kropli deszczu.\nKońcowe tęcze, które widzimy, są spowodowane ogromną liczbą kropel deszczu na niebie,\nz których każda daje obserwatorowi jeden kolor (pod odpowiednim kątem).",
+ "secondaryrainbow": "Tęcza wtórna",
+ "alexandersdarkband": "Ciemny pas Aleksandra",
+ "raindrop": "Kropla deszczu",
+ "primaryrainbow": "Tęcza pierwotna",
+ "sunlight": "Światło słoneczne"
+ },
+ "minimumDeviationAngle": {
+ "title": "Minimalny kąt odchylenia",
+ "description": "Definicja kąta odchylenia promienia padającego na element optyczny zależy od kontekstu - na poniższym zrzucie ekranu możesz zobaczyć jego definicję dla pryzmatu trójkątnego i sferycznego. W przykładach zawartych w tej symulacji kąt odchylenia jako funkcja kąta padania promienia wchodzącego do elementu optycznego ma lokalne minimum, które nazywa się \"minimalnym kątem odchylenia\". To lokalne minimum może wyjaśniać zjawiska optyczne, takie jak [tęcze](/gallery/rainbows) i halo - z powodu tego lokalnego minimum, odchylone promienie gromadzą się w określonych kierunkach, tworząc \"optyczną kaustykę\" (jak widać w przykładzie C w symulacji), którą postrzegamy jako tęcze/halo.",
+ "inexamplesaandbbyrot": "W przykładach A i B, obracając pryzmaty między punktami A1 do A2 i B1 do B2 i zmieniając w ten sposób\nkąt padania promienia wpadającego do elementu optycznego, można łatwo zauważyć, że minimalny\nkąt odchylenia uzyskuje się gdzieś pomiędzy parą punktów.\n(w przykładzie A kąt odchylenia mierzony jest względem osi poziomej, natomiast w przykładzie B\njest mierzony względem osi pionowej).\n\nTeraz powiększ przykład C (używając powiększenia symulacyjnego) i rozszerz dwie wiązki (czerwoną i fioletową, a\nich przecięcie wygląda na różowe. Jest to faktycznie to samo, co obracanie pryzmatu sferycznego w\nprzykładzie B, zmieniające w ten sposób kąt padania promienia wchodzącego) i zobacz, że od punktu\nC1 do C2 promienie wychodzące wstecz kumulują się w dół w dwa odrębne promienie - czerwony i fioletowy\n(\"kaustyka optyczna\")– minimalny kąt odchylenia występuje koło punktu C2 i zależy od\ntdługości fali światła (kolor). Następnie, podczas rozszerzania dwóch wiązek od punktu C2 do C3,\npromienie wychodzące wstecz odwracają swój kierunek w górę.",
+ "examplea": "Przykład - A",
+ "examplec": "Przykład - C",
+ "exampleb": "Przykład - B",
+ "usethebuiltinzoomtob": "Użyj wbudowanego zoomu, aby lepiej operować symulacją",
+ "deviationangle": "Kąt odchylenia",
+ "incidenceangle": "Kąt padania"
+ },
+ "aplanaticPoints": {
+ "title": "Punkty aplanatyczne",
+ "description": "Punkty aplanatyczne układu optycznego to szczególne punkty na jego osi optycznej, takie, że \"promienie wychodzące z jednego z nich zbiegają się lub rozchodzą się z drugiego punktu\".\n\n- Elipsa: dwa ogniska eliptycznej soczewki/zwierciadła są punktami aplanatycznymi, ponieważ światło emitowane z jednego ogniska zbiega się w kierunku drugiego.\n- Sfera: soczewka sferyczna ma dwa punkty aplanatyczne, wewnątrz i na zewnątrz kuli - więcej szczegółów w symulacji.\n- Hiperbola: dwa ogniska [modelu zwierciadła hiperbolicznego](/gallery/hyperbolic-mirror) są również punktami aplanatycznymi.\n\nJeśli dane są dwa punkty o odciętych \\(x_1\\) i \\(x_2\\) oraz identycznych rzędnych, i współczynniki załamania światła na zewnątrz i wewnątrz naszego elementu optycznego wynoszą odpowiednio \\(n_1\\) i \\(n_2\\), to aby te dwa punkty były punktami aplanatycznymi, granica naszego elementu optycznego musi spełniać równanie\\begin{equation}k_1 n_1 \\sqrt{ (x - x_1)^2 + y^2} + k_2 n_2 \\sqrt{ (x - x_2)^2 + y^2} = E\\end{equation}, gdzie \\(k_i=1\\) or \\(-1\\), jeśli promień łączący \\(x_i\\) i granicę naszego elementu optycznego jest odpowiednio rzeczywisty lub pozorny, a \\(E\\) jest stałą, dla której to równanie ma nietrywialne rozwiązanie. To równanie (które można wyprowadzić za pomocą zasady Fermata) jest równaniem owalu Kartezjusza, którego krzywe stożkowe są przypadkami szczególnymi.",
+ "clickontheextendedra": "Kliknij przycisk \"Promienie rozszerzone\", aby sprawdzić, czy światło emitowane ze źródła światła w soczewce sferycznej (punkt A)\nbędzie odchylać się od innego punktu na osi optycznej poza soczewką sferyczną (punkt B) bez aberracji sferycznej.\nPunkty A i B są przykładem punktów aplanatycznych sfery, dla której (k1, k2, n1, n2, x1, x2, E)=(1, -1, 1.5, 1, 3 * 20, -4.5 * 20, 0) relative to the marked Y axis,\ngdzie x1,x2 to odpowiednio poziome współrzędne punktów A, B (każda komórka siatki ma wymiary 20 na 20).\nW podobny sposób ogniska elipsy (punkty C i D) są przykładem punktów aplanatycznych elipsy, dla których (k1, k2, n1, n2, E)=(1, 1, 1.5, 1.5, > 0)",
+ "sphericallens": "Soczewka sferyczna",
+ "ellipticallens": "Soczewka eliptyczna",
+ "yaxis": "oś Y"
+ },
+ "concaveLens": {
+ "title": "Soczewka wklęsła",
+ "description": "Symulacja pokazuje soczewkę wklęsłą rozpraszającą wiązkę."
+ },
+ "convexLens": {
+ "title": "Soczewka wypukła",
+ "description": "Symulacja pokazuje soczewkę wypukłą skupiającą wiązkę."
+ },
+ "lensImages": {
+ "title": "Obrazy w soczewce",
+ "description": "Symulacja pokazuje obrazy wiązki i źródeł punktowych wytwarzanych przez idealne soczewki."
+ },
+ "transverseAndLongitudinalMagnification": {
+ "title": "Powiększenie poprzeczne i wzdłużne",
+ "description": "Symulacja powiększenia poprzecznego i wzdłużnego dla idealnej soczewki o ogniskowej \\(f\\). Powiększenie poprzeczne (zwane także liniowym) i wzdłużne to odpowiednio \\(M_T=1-\\frac{u}{f}\\) i \\(M_L=\\frac{dv}{du}\\), gdzie \\(u\\) and \\(v\\) to odpowiednio odległość przedmiotu i obrazu od naszej idealnej soczewki. Dla idealnej soczewki zachodzi również \\(M_L=-(M_T)^2\\)",
+ "inthisexamplewehavey": "W tym przykładzie mamy y'_j - y'_k = M_T * (y_j - y_k), gdzie j,k∈{0,1,2,3,4,5}.\nDlatego np. powiększenie poprzeczne obiektu punktowego (x_0,y_0) wynosi M_T = -3 i możemy obliczyć - \n(x'_0 - x'_1)/(x_1 - x_0) ≈ -0.3699\n(x'_0 - x'_2)/(x_2 - x_0) ≈ -0.7297\n(x'_0 - x'_3)/(x_3 - x_0) ≈ -1.4211\n(x'_0 - x'_4)/(x_4 - x_0) ≈ -2.4545\n(x'_0 - x'_5)/(x_5 - x_0) = -5.4\n.\n.\n.\n(Stosunek będzie zbieżny do powiększenia podłużnego: M_L = - (M_T)^2 = -9)",
+ "rightclickonarealobj": "Kliknij prawym przyciskiem myszy (rzeczywisty) obiekt, aby wyświetlić jego współrzędne.\nZielone kwadraty to rzeczywiste źródła punktowe, podczas gdy żółte kwadraty to obrazy."
+ },
+ "vanishingPoint": {
+ "title": "Punkt zbiegu",
+ "description": "Niektóre układy optyczne odwzorowują nieskończone równoległe proste na linie na płaszczyźnie obrazu, które spotykają się w jednym punkcie, tworząc złudzenie, że spotykają się \"w nieskończoności\". Ten pojedynczy punkt nazywany jest punktem zbiegu.\n\nDla układu optycznego składającego się z idealnej soczewki o ogniskowej \\(f\\), położonej na płaszczyźnie \\(XY\\), tak że jej oś optyczna pokrywa się z osią \\(X\\)(poziomą) i soczewka pokrywa się z osią \\(Y\\), punkt zbiegu linii o współczynniku kierunkowym \\(m\\), umieszczonaj w obszarze \\(x<0\\), ma współrzędne \\((f,m f)\\).",
+ "youcanverifythatapai": "Możesz sprawdzić, że para prostych równoległych o współczynniku kierunkowym - m skupiana jest przez idealną soczewkę w punkcie o współrzędnych (f,m∙f),\nklikając przycisk \"Siatka\" i zauważając, że każda komórka siatki ma wymiary 20 na 20.\nMożna również sprawdzić, jak zmiana ogniskowej idealnej soczewki - f, wpływa na punkty zbiegu.",
+ "thesepairofparallell": "Ta para równoległych prostych zbiega się w punkcie B",
+ "thesepairofparallell1": "Ta para równoległych prostych zbiega się w punkcie A",
+ "notethatthesepairsof": "Zauważ, że te pary równoległych linii nie są w rzeczywistości nieskończone."
+ },
+ "monochromaticAberrations": {
+ "title": "Aberracje monochromatyczne",
+ "description": "To jest symulacja różnych aberracji monochromatycznych:\n\n1. Aberracja sferyczna.\n2. Aberracja komatyczna.\n3. Aberracja rozogniskowania.\n4. Aberracja krzywizny pola.",
+ "defocusaberration": "Rozogniskowanie",
+ "sphericalaberration": "Aberracja sferyczna",
+ "screen": "Ekran",
+ "fieldcurvatureaberra": "Krzywizna pola",
+ "commaaberration": "Koma"
+ },
+ "chromaticAberration": {
+ "title": "Aberracja chromatyczna",
+ "description": "Ta symulacja pokazuje aberrację chromatyczną w soczewce sferycznej. Tutaj biały kolor powstaje przez mieszanie kolorów czerwonego, pomarańczowego, żółtego, zielonego, cyjanowego, niebieskiego i fioletowego. Ogniskowa dla światła czerwonego jest największa, a dla fioletowego najmniejsza."
+ },
+ "hyperbolicLens": {
+ "title": "Soczewka hiperboliczna",
+ "description": "Jest to symulacja i porównanie soczewek hiperbolicznych i sferycznych. Obie soczewki mają identyczne ogniskowe, ale w przeciwieństwie do soczewki sferycznej, soczewka hiperboliczna może skupić równoległą wiązkę światła monochromatycznego do jednego punktu (pomijając falową naturę światła - czyli w przybliżeniu optyki geometrycznej) bez aberracji sferycznych.",
+ "thefocallengthofthis": "Ogniskowa tej soczewki sferycznej (w przybliżeniu przyosiowym) wynosi:\nf=R/(n-1)=200/(1.5-1)=400",
+ "thefocallengthofthis1": "Ogniskowa tej soczewki hiperbolicznej wynosi:\nf = |C| ∙ sqrt(n^2 - 1) / (n - 1) = K ∙ sqrt(0.8) ∙ sqrt(1.5^2 - 1) / (1.5 - 1) = 400\ngdzie równanie tej hiperboli to:\ny(x) = (a/K) - sqrt( ((x/K)^2 + (C/K)^2) / (n^2 - 1) )\n= 1.5 - sqrt( (0.8 + (x / 200)^2) / (1.5^2 - 1) )\ntaka, że K jest stałą przeliczeniową wymiarów równania na wymiary siatki - dla tej soczewki hiperbolicznej K=200.\n(na przykład 0 0\\) i \\(\\alpha = \\arctan k\\) to stały kąt między dwiema stycznymi w punkcie przecięcia koncentrycznej spirali logarytmicznej z okręgiem (jak pokazuje [ta](https://en.wikipedia.org/wiki/Logarithmic_spiral#/media/File:Logspiral.gif) animacja), to \\(n(r) ∝ \\frac{1}{r}\\) (można to wykazać zapisując ścieżkę optyczną we współrzędnych biegunowych i wykorzystując zasadę Fermata).",
+ "thecircularblockeris": "Kołowy bloker znajduje się w środku,\naby uniknąć osobliwości współczynnika załamania"
+ },
+ "luneburgLens": {
+ "title": "Soczewka Luneburga",
+ "description": "Symulacja soczewki Luneburga, która jest sferycznym dielektrykiem o współczynniku załamania światła \\(\\rho) = \\sqrt{n_0-(\\frac{\\rho}{R})^2} \\), gdzie \\(n_0=2\\) to współczynnik załamania w środku soczewki soczewki, \\(R=100\\) to promień soczewki, a \\(\rho\\) to odległość od środka soczewki.\n\nGórny dielektryk składa się z \\(N=20\\) koncentrycznych soczewek sferycznych o promieniu \\(R_i=5(N+1-i)\\) i współczynniku załamania światła \\(n_i = \\sqrt{n_0-(\\frac{R_i}{R})^2} \\), gdzie \\(i=1,...,N\\). Jednakże, ponieważ ten symulator oblicza efektywny współczynnik załamania światła elementu optycznego poprzez pomnożenie współczynnika załamania elementu przez współczynniki załamania elementów optycznych, które są w nim osadzone, współczynnik załamania \\(i\\)-tej koncentrycznej soczewki sferycznej jest określony wzorem \\(n_{i}^\\text{numerical}=\\frac{n_i}{n_{i-1}}\\).\n\nDolny dielektryk jest materiałem gradientowym o współczynniku załamania \\(n(r)\\)."
+ },
+ "maxwellFisheyeLens": {
+ "title": "Soczewka rybie oko Maxwella",
+ "description": "To jest symulacja soczewki typu rybie oko Maxwella, która jest sferycznym dielektrykiem o współczynniku załamania światła \\(n(\\rho) = \\frac{n_0}{1+(\\frac{\\rho}{R})^2} \\), gdzie \\(n_0=2\\) to współczynnik załamania w środku soczewki soczewki, \\(R=100\\) to promień soczewki, a \\(\\rho\\) to odległość od środka soczewki.\n\nGórny dielektryk składa się z \\(N=20\\) koncentrycznych soczewek sferycznych o promieniu \\(R_i=5(N+1-i)\\) i współczynniku załamania światła \\(n_i = \\frac{n_0}{1+(\\frac{R_i}{R})^2} \\), gdzie \\(i=1,...,N\\). Jednakże, ponieważ ten symulator oblicza efektywny współczynnik załamania światła elementu optycznego poprzez pomnożenie współczynnika załamania elementu przez współczynniki załamania elementów optycznych, które są w nim osadzone, współczynnik załamania \\(i\\)-tej koncentrycznej soczewki sferycznej jest określony wzorem \\(n_{i}^\\text{numerical}=\\frac{n_i}{n_{i-1}}\\).\n\nDolny dielektryk jest materiałem gradientowym o współczynniku załamania \\(n(r)\\)."
+ },
+ "singleRayDemo": {
+ "title": "Pojedynczy promień",
+ "description": "Symulacja pokazująca odbicie i załamanie pojedynczego promienia."
+ },
+ "sphericalLensAndMirror": {
+ "title": "Soczewka sferyczna i zwierciadło sferyczne",
+ "description": "Symulacja pokazuje ciągłą wiązkę przechodzącą przez soczewkę sferyczną i zwierciadło sferyczne."
+ },
+ "interrogationRoom": {
+ "title": "Pokój przesłuchań",
+ "description": "Jest to symulacja lustra weneckiego (właściwym określeniem jest lustro fenickie) w pokoju przesłuchań. Obserwator w ciemnym pokoju (najlepiej, gdy wnętrze ciemnego pokoju nie emituje/odbija światła, a także pochłania całe światło wpadające z pokoju przesłuchań) jest w stanie zajrzeć do wnętrza pokoju przesłuchań, ponieważ światło wytwarzane przez lampę w pokoju przesłuchań jest rozpraszane i odbierane przez obserwatora przez lustro weneckie, podczas gdy podejrzany widzi tylko wnętrze pokoju przesłuchań oraz odbicie swoje i lampy (ponieważ nie dociera do niego światło z ciemnego pokoju).",
+ "pressonallimagestose": "Naciśnij \"Wszystkie obrazy\", aby zobaczyć lokalizację\nodbicia lampy i obiektów\nw płaszczyźnie obrazu podejrzanego i obserwatora",
+ "darkroom": "Ciemny pokój",
+ "twowaymirror": "Lustro weneckie",
+ "lamp": "Lampa",
+ "interrogationroom": "Pokój przesłuchań",
+ "observerseyeris": "Oczy obserwatora",
+ "suspectseyeris": "Oczy podejrzanego",
+ "thelampobjectinthesu": "Oświetlony obiekt w płaszczyźnie obrazu podejrzanego",
+ "thelampsreflectionin": "Odbicie lampy w płaszczyźnie obrazu podejrzanego",
+ "thelampsreflection": "Odbicie lampy",
+ "thelampobjectintheob": "Oświetlony obiekt w płaszczyźnie obrazu obserwatora"
+ },
+ "cameraObscura": {
+ "title": "Camera obscura",
+ "description": "To jest symulacja Camera obscura (łac. ciemna komnata). W ciemnym pokoju można zobaczyć odwrócony obraz obiektów na zewnątrz, rzutowany na ścianie (bez użycia dodatkowego obiektywu).",
+ "observer2": "Obserwator",
+ "objectsoutside": "Obiekty na zewnątrz",
+ "darkroom1": "Ciemny pokój"
+ },
+ "nlSimulation": {
+ "title": "Lornetki NL",
+ "description": "Symulacja przedstawia zgrubny szkic zasady działania lornetki Swarovski NL."
+ },
+ "einsteinRingRefocusedToSingleImageViaEyepiece": {
+ "title": "Pierścień Einsteina ponownie zogniskowany przez okular na pojedynczy obraz",
+ "description": "Model okularu/soczewki, który mógłby być użyty w dowolnym teleskopie naukowym, który odwróci \"halo\" i skupi pierścień Einsteina z powrotem do pierwotnej postaci, jednocześnie rozpraszając światło gwiazdy lub masywnego obiektu, który spowodował utworzenie pierścienia."
+ },
+ "blackCatBecomesWhite": {
+ "title": "\"Czarny kot staje się biały\" demo",
+ "description": "\"Czarny kot staje się biały\" to demonstracja popularnonaukowa, w której część figurki znika po włożeniu do wody. Składa się z następujących kroków:\n\n1. Narysuj postać (np. czarnego kota) na kartce papieru.\n2. Włóż kartkę do przezroczystej, szczelnie zamykanej plastikowej torby.\n3. Narysuj część figury (np. obwódkę kota) lub inną figurę na plastikowej powierzchni. Po włożeniu do wody postać narysowana na papierze znika, ale nie część narysowana na plastikowej powierzchni.\n\nTa symulacja wyjaśnia, jak to działa.",
+ "whenthebagisunderwat": "Gdy torebka znajduje się pod wodą, światło od papieru nie dociera do oczu,\nwięc widzimy tylko postać narysowaną na plastikowej powierzchni.",
+ "lightfromtheplastics": "Światło od plastikowej powierzchni",
+ "lightfromthepaper": "Światło od papieru",
+ "eyes": "Oczy"
+ },
+ "dichroicRbgSplitterAndCombiner": {
+ "title": "Dichroiczny rozdzielacz i sumator RGB",
+ "description": "Ta symulacja demonstruje rozdzielanie i łączenie wiązek RGB przy użyciu zwierciadeł dichroicznych.",
+ "rgbcomponentsplitter": "Rozdzielacz i sumator komponentów RGB",
+ "lightsource": "Źródło światła",
+ "dichroiccube": "Kostka dichroiczna",
+ "beamcombiner": "Sumator wiązki"
+ },
+ "ganBasedLcdPixel": {
+ "title": "Piksel LCD",
+ "description": "Model piksela LCD. Symuluje działanie warstw wyświetlacza mikroledowego i sposób, w jaki nasze oczy postrzegają piksel.",
+ "pixelsaresosmallthel": "Piksele są tak małe, że światło\nnaszym oczom wydaje się być zmieszane",
+ "changetherateoftrans": "Zmień szybkość transmisji\nAby utworzyć dowolną wartość RGB",
+ "blueledbacklight": "Niebieskie podświetlenie LED",
+ "yellowphosphor": "Fosfor żółty",
+ "liquidcrystal": "Ciekły kryształ",
+ "lightfilters": "Filtry światła",
+ "pixelasvisibletoview": "Piksel, tak jak widzi go obserwator",
+ "notpartoflcddisplay": "Nie jest częścią wyświetlacza LCD"
+ }
+ }
+}
\ No newline at end of file
diff --git a/locales/pl/main.json b/locales/pl/main.json
new file mode 100644
index 00000000..65028e73
--- /dev/null
+++ b/locales/pl/main.json
@@ -0,0 +1,203 @@
+{
+ "meta": {
+ "languageName": "polski",
+ "parentheses": "{{main}} ({{sub}})",
+ "colon": "{{name}}: {{value}}",
+ "list": "{{first}}, {{others}}"
+ },
+ "project": {
+ "name": "Symulacja biegu promieni",
+ "shortName": "Optyka geometryczna",
+ "description": "Aplikacja internetowa open source umożliwiająca symulację odbicia i załamania światła."
+ },
+ "pages": {
+ "home": "Strona główna",
+ "gallery": "Galeria",
+ "about": "O aplikacji",
+ "github": "GitHub"
+ },
+ "homePage": {
+ "description": "Twórz i symuluj interaktywnie sceny optyki geometrycznej 2D.\nCałkowicie darmowa aplikacja webowa. Kod źródłowy jest [dostępny na GitHub](/github).",
+ "launchSimulator": "Uruchom symulator"
+ },
+ "tools": {
+ "title": "Narzędzia",
+ "categories": {
+ "lightSource": "Źródło światła",
+ "mirror": "Zwierciadła",
+ "glass": "Szkła",
+ "blocker": "Przesłony",
+ "other": "Inne"
+ },
+ "common": {
+ "clickInstruction": "Kliknij, aby utworzyć.",
+ "lineInstruction": "Przeciągnij lub kliknij, aby utworzyć.",
+ "circleInstruction": "Przeciągnij lub kliknij, aby utworzyć."
+ },
+ "SingleRay": {
+ "title": "Promień",
+ "description": "Pojedynczy promień światła określony przez dwa punkty.",
+ "instruction": "Przeciągnij lub kliknij, aby utworzyć. Pierwszy punkt to źródło, wysyłające promień w kierunku drugiego punktu."
+ },
+ "Beam": {
+ "title": "Wiązka",
+ "description": "Z odcinka wyłania się równoległa lub rozbieżna wiązka promieni o gęstości kontrolowanej przez suwak 'Gęstość promieni'."
+ },
+ "PointSource": {
+ "title": "Źródło punktowe",
+ "description": "Promienie wychodzące z jednego punktu. Ich liczba regulowana jest za pomocą suwaka 'Gęstość promieni'."
+ },
+ "AngleSource": {
+ "instruction": "Przeciągnij lub kliknij, aby utworzyć. Pierwszy punkt to źródło, wysyłające promień w kierunku drugiego punktu.",
+ "description": "Źródło punktowe o zadanym kącie emisji."
+ },
+ "Mirror": {
+ "title": "Płaskie",
+ "description": "Symuluje odbicie światła w zwierciadle płaskim."
+ },
+ "otherMirror": {
+ "title": "zakrzywione",
+ "description": "Zwierciadło, którego powierzchnia jest zakrzywiona. Może być kołowa, paraboliczna lub zdefiniowana przez niestandardowe równanie y = f(x)."
+ },
+ "ArcMirror": {
+ "title": "Sferyczne",
+ "description": "Zwierciadło, którego powierzchnia w przekroju jest fragmentem okręgu, określonym za pomocą trzech punktów.",
+ "instruction": "Przeciągnij lub kliknij, aby utworzyć. Pierwsze 2 punkty określają odstęp między końcami łuku, ostatni punkt określa promień krzywizny."
+ },
+ "ParabolicMirror": {
+ "title": "Paraboliczne",
+ "description": "Zwierciadło, którego powierzchnia w przekroju jest fragmentem paraboli, określonej za pomocą trzech punktów.",
+ "instruction": "Przeciągnij lub kliknij, aby utworzyć."
+ },
+ "CustomMirror": {
+ "title": "Równanie niestandardowe",
+ "description": "Zwierciadło, którego kształt jest określony przez niestandardowe równanie y = f(x), gdzie (x,y) jest w przekształconych współrzędnych, w których dwoma punktami kontrolnymi są (-1,0) i (1,0)."
+ },
+ "IdealMirror": {
+ "title": "Idealnie zakrzywione",
+ "description": "Idealnie 'zakrzywione' zwierciadło, dokładnie spełniające równanie (1/x + 1/y = 1/f). Ogniskową można ustawić bezpośrednio."
+ },
+ "BeamSplitter": {
+ "title": "Rozdzielacz wiązki",
+ "description": "Zwierciadło odbijające pewien procent padającego światła."
+ },
+ "PlaneGlass": {
+ "title": "Półpłaszczyzna",
+ "description": "Symuluje załamanie i odbicie światła na granicy ośrodków.",
+ "instruction": "Przeciągnij lub kliknij, aby utworzyć."
+ },
+ "otherGlass": {
+ "title": "inne kształty",
+ "description": "Szkło o dowolnych kształtach, ograniczonych odcinkami i łukami okręgów lub zdefiniowanych układem nierówności f(x) < y < g(x)."
+ },
+ "CircleGlass": {
+ "title": "Koło",
+ "description": "Szkło o przekroju kołowym, określonym przez środek i punkt na brzegu."
+ },
+ "Glass": {
+ "title": "Dowolny kształt / Wielokąt",
+ "description": "Szkło o dowolnych kształtach, mających przekroje ograniczone odcinkami i fragmentami okręgów.",
+ "instruction": "Kliknij, aby utworzyć odcinek; przeciągnij, aby utworzyć łuk; kliknij punkt początkowy, żeby zakończyć rysowanie."
+ },
+ "CustomGlass": {
+ "title": "Równanie niestandardowe",
+ "description": "Szkło o kształcie zdefiniowanym przez niestandardową nierówność f(x) < y < g(x), gdzie (x,y) jest w przekształconych współrzędnych, w których dwoma punktami kontrolnymi są (-1,0) i (1,0)."
+ },
+ "IdealLens": {
+ "title": "Soczewka idealna",
+ "description": "Idealna soczewka, która spełnia dokładnie równanie (1/x + 1/y = 1/f). Ogniskową można ustawić bezpośrednio."
+ },
+ "SphericalLens": {
+ "title": "Soczewka sferyczna",
+ "description": "Soczewka sferyczna."
+ },
+ "CircleGrinGlass": {
+ "title": "Koło gradientowe",
+ "description": "Szkło z konfigurowaną funkcją współczynnika załamania n(x,y) i kołową krawędzią."
+ },
+ "GrinGlass": {
+ "title": "Wielokąt gradientowy",
+ "description": "Szkło z konfigurowaną funkcją współczynnika załamania n(x,y) i wielokątną krawędzią.",
+ "instruction": "Kliknij, aby utworzyć odcinek, kliknij punkt początkowy po zakończeniu rysowania.",
+ "warning": "OSTRZEŻENIE: Obsługiwane są tylko proste wielokąty, w przeciwnym razie zachowanie jest nieprzewidywalne."
+ },
+ "otherGrinGlass": {
+ "title": "Szkło gradientowe (GRIN)"
+ },
+ "Blocker": {
+ "title": "Przesłona liniowa",
+ "description": "Przeszkoda - odcinek - pochłaniająca padające promienie."
+ },
+ "CircleBlocker": {
+ "title": "Przesłona kołowa",
+ "description": "Przeszkoda - okrąg - pochłaniająca padające promienie."
+ },
+ "Aperture": {
+ "title": "Apertura",
+ "description": "Para blokerów światła, które pochłaniają padające promienie. Rozmiar otworu można regulować symetrycznie.",
+ "instruction": "Przeciągnij lub kliknij dwa punkty końcowe, aby utworzyć."
+ },
+ "Ruler": {
+ "title": "Linijka",
+ "description": "Linijka odmierzająca odległość od punktu zero (pierwsze kliknięcie) do innego punktu (drugie kliknięcie)."
+ },
+ "Protractor": {
+ "title": "Kątomierz",
+ "description": "Kątomierz określony przez środek (wierzchołek kąta - pierwsze kliknięcie) i inny punkt dla kierunku zerowego (drugie kliknięcie). Skala jest w stopniach."
+ },
+ "Detector": {
+ "title": "Detektor",
+ "description": "Narzędzie do pomiaru szybkości przepływu energii (P), szybkości prostopadłego przepływu pędu (F⊥), i szybkości równoległego przepływu pędu (F∥) przez odcinek. . Jednostki są umowne."
+ },
+ "TextLabel": {
+ "title": "Tekst",
+ "description": "Etykieta tekstowa."
+ },
+ "LineArrow": {
+ "title": "Linia / Strzałka",
+ "description": "Odcinek lub strzałka."
+ },
+ "Drawing": {
+ "title": "Rysunek",
+ "description": "Narzędzie do rysowania odręcznego.",
+ "instruction": "Przeciągnij, aby narysować."
+ },
+ "moveView": {
+ "title": "Przesuń widok",
+ "description": "Przeciągnij, aby przesunąć widok. (Przeciąganie prawym przyciskiem myszy ma tę samą funkcję)."
+ }
+ },
+ "view": {
+ "title": "Widok",
+ "rays": {
+ "title": "Promienie",
+ "description": "Pokaż promienie. Gdy 'Gęstość promieni' jest duża, wiązka pojawia się jako ciągła."
+ },
+ "extended": {
+ "title": "Rozszerzone promienie",
+ "description": "Pokaż zarówno promienie, jak i ich przedłużenia. Kolor pomarańczowy wskazuje przedłużenia do tyłu, a szary do przodu.",
+ "simulateColorsNote": "Gdy opcja „Symuluj kolory” jest włączona, są one wyświetlane w kolorach źródłowych i zamiast tego wyróżniane linią przerywaną."
+ },
+ "images": {
+ "title": "Wszystkie obrazy",
+ "description": "Pokaż położenie wszystkich obrazów. Żółte punkty oznaczają obrazy rzeczywiste, pomarańczowe obrazy pozorne, a szare (brak na tym zdjęciu) obiekty wirtualne. Zwróć uwagę, że niektórych obrazów nie można wykryć, jeśli 'Gęstość promieni' nie jest wystarczająco wysoka.",
+ "simulateColorsNote": "Gdy opcja „Symuluj kolory” jest włączona, są one wyświetlane w kolorach źródłowych i zamiast tego rozróżniane na podstawie wielkości kropek."
+ },
+ "observer": {
+ "title": "Widziane przez obserwatora",
+ "description": "Symuluje promienie i obrazy widziane z określonego miejsca. Obserwatora symbolizuje niebieskie kółko. Wszelkie przecinające je promienie uważa się za 'obserwowane'. Obserwator nie wie, gdzie faktycznie zaczynają się promienie, ale będzie mu się wydawało, że zaczynają się w pewnym punkcie (punktach), jeśli się tam przecinają. Promienie są pokazane na niebiesko, a punkty na żółto (rzeczywiste) lub pomarańczowo (pozorne).",
+ "simulateColorsNote": "Gdy opcja „Symuluj kolory” jest włączona, zamiast tego są one wyświetlane w kolorach źródłowych.",
+ "instruction": "Przeciągnij dużą niebieską kropkę, aby przesunąć obserwatora."
+ }
+ },
+ "simulateColors": {
+ "title": "Symuluj kolory",
+ "description": "Symulacja kolorów (długości fal) źródeł światła, mieszania kolorów, filtrowania kolorów przez filtry blokujące i lustra oraz dyspersji chromatycznej szkieł.",
+ "instruction": "Po wybraniu można ustawić te parametry dla tych obiektów. Aby symulować widma kolorów, należy nałożyć na siebie promienie o różnych długościach fal.",
+ "warning": "Kolory wyświetlane na ekranie są jedynie przybliżone i mogą być bardzo niedokładne, gdy 'Gęstość promieni' jest zbyt wysoka lub zbyt niska."
+ },
+ "languageDropdown": {
+ "title": "Język: {{language}}",
+ "translatedFraction": "{{fraction}} przetłumaczone"
+ }
+}
\ No newline at end of file
diff --git a/locales/pl/simulator.json b/locales/pl/simulator.json
new file mode 100644
index 00000000..fe0c8b25
--- /dev/null
+++ b/locales/pl/simulator.json
@@ -0,0 +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"
+ },
+ "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ć."
+ }
+}
\ No newline at end of file
diff --git a/locales/pt-BR.json b/locales/pt-BR.json
deleted file mode 100644
index 3b89015c..00000000
--- a/locales/pt-BR.json
+++ /dev/null
@@ -1,863 +0,0 @@
-{
- "appName": {
- "message": "Simulador - Simulação de Óptica de Raios"
- },
- "appShortName": {
- "message": "Óptica de Raios"
- },
- "appDesc": {
- "message": "Uma aplicação web grátis e de código aberto para criação e simulação de cenas de óptica geométrica 2D."
- },
- "homepage_desc": {
- "message": "Crie e simule cenas ópticas geométricas 2D interativamente. Totalmente gratuito e baseado na web. Código-fonte está disponível no GitHub."
- },
- "launch_simulator": {
- "message": "Abrir Simulador"
- },
- "home": {
- "message": "Início"
- },
- "home_url": {
- "message": "https://phydemo.app/ray-optics/pt-BR/"
- },
- "gallery": {
- "message": "Galeria"
- },
- "gallery_url": {
- "message": "https://phydemo.app/ray-optics/gallery/"
- },
- "welcome": {
- "message": "Bem-vindo à Simulação de Óptica de Raios Para adicionar um componente ótico, selecione uma ferramenta e clique no espaço vazio. Para carregar um exemplo, por favor visite a página da Galeria."
- },
- "loading_msg": {
- "message": "Bem-vindo à Simulação de Óptica de Raios Carregando cena a partir de URL... Por favor aguarde."
- },
- "toolbar_title": {
- "message": "Ferramenta: "
- },
- "toolname_SingleRay": {
- "message": "Raio único"
- },
- "toolname_AngleSource": {
- "message": "Fonte pontual"
- },
- "toolname_PointSource": {
- "message": "Fonte pontual"
- },
- "toolname_Beam": {
- "message": "Feixe"
- },
- "toolname_mirror_": {
- "message": "Espelho"
- },
- "toolname_Mirror": {
- "message": "Espelho"
- },
- "toolname_ArcMirror": {
- "message": "Espelho"
- },
- "toolname_ParabolicMirror": {
- "message": "Espelho"
- },
- "toolname_CustomMirror": {
- "message": "Espelho"
- },
- "toolname_IdealMirror": {
- "message": "Espelho curvo ideal"
- },
- "toolname_glass_": {
- "message": "Vidro"
- },
- "toolname_blocker_": {
- "message": "Bloqueador"
- },
- "toolname_BeamSplitter": {
- "message": "Divisor de Feixe"
- },
- "toolname_PlaneGlass": {
- "message": "Vidro"
- },
- "toolname_CircleGlass": {
- "message": "Vidro"
- },
- "toolname_CircleGrinGlass": {
- "message": "Círculo com gradiente de índice"
- },
- "toolname_Glass": {
- "message": "Polígono / Arcos Circulares"
- },
- "toolname_GrinGlass": {
- "message": "Polígono com gradiente de índice"
- },
- "toolname_IdealLens": {
- "message": "Lente ideal"
- },
- "toolname_SphericalLens": {
- "message": "Lente esférica"
- },
- "toolname_CustomGlass": {
- "message": "Vidro"
- },
- "toolname_Blocker": {
- "message": "Bloqueador reto"
- },
- "toolname_Aperture": {
- "message": "Abertura"
- },
- "toolname_CircleBlocker": {
- "message": "Bloqueador circular"
- },
- "toolname_DiffractionGrating": {
- "message": "Grade de difraçãoBeta"
- },
- "toolname_Ruler": {
- "message": "Régua"
- },
- "toolname_Protractor": {
- "message": "Transferidor"
- },
- "tool_Detector": {
- "message": "Detector"
- },
- "toolname_Detector": {
- "message": "Detector"
- },
- "toolname_TextLabel": {
- "message": "Texto"
- },
- "toolname_LineArrow": {
- "message": "Linha"
- },
- "toolname_Drawing": {
- "message": "Desenho"
- },
- "toolname_Handle": {
- "message": "Ponto de manuseio"
- },
- "toolname_CropBox": {
- "message": "Exportar"
- },
- "toolname_ModuleObj": {
- "message": "MóduloBeta"
- },
- "tool_more_": {
- "message": "Outros"
- },
- "toolname_": {
- "message": "Mover vista"
- },
- "modebar_title": {
- "message": "Ver:"
- },
- "modename_light": {
- "message": "Raios"
- },
- "modename_extended_light": {
- "message": "Raios extendidos"
- },
- "modename_images": {
- "message": "Todas Imagens"
- },
- "modename_observer": {
- "message": "Visto por Observador"
- },
- "simulateColors": {
- "message": "Simular Cores"
- },
- "File: ": {
- "message": "Arquivo"
- },
- "Tools: ": {
- "message": "Ferramentas"
- },
- "tool_SingleRay": {
- "message": "Raio único"
- },
- "tool_Beam": {
- "message": "Feixe paralelo"
- },
- "tool_PointSource": {
- "message": "Fonte pontual (360°)"
- },
- "tool_AngleSource": {
- "message": "Fonte pontual (<360°)"
- },
- "tool_PointSource_": {
- "message": "Fonte pontual"
- },
- "tool_lightSource_": {
- "message": "Fonte de luz"
- },
- "tool_mirror_": {
- "message": "Espelho"
- },
- "tool_Mirror": {
- "message": "Segmento"
- },
- "tool_ArcMirror": {
- "message": "Arco Circular"
- },
- "tool_ParabolicMirror": {
- "message": "Parabólico"
- },
- "tool_CustomMirror": {
- "message": "Equação Personalizada"
- },
- "tool_BeamSplitter": {
- "message": "Divisor de Feixe"
- },
- "tool_IdealMirror": {
- "message": "Curvo Ideal"
- },
- "tool_glass_": {
- "message": "Vidro"
- },
- "tool_blocker_": {
- "message": "Bloqueador"
- },
- "tool_PlaneGlass": {
- "message": "Semi-plano"
- },
- "tool_CircleGlass": {
- "message": "Círculo"
- },
- "tool_CircleGrinGlass": {
- "message": "Círculo"
- },
- "tool_Glass": {
- "message": "Forma livre"
- },
- "tool_GrinGlass": {
- "message": "Forma livre"
- },
- "tool_IdealLens": {
- "message": "Lente Ideal"
- },
- "tool_SphericalLens": {
- "message": "Lente Esférica"
- },
- "tool_CustomGlass": {
- "message": "Equação Personalizada"
- },
- "tool_Blocker": {
- "message": "Bloqueador Reto"
- },
- "tool_Aperture": {
- "message": "Abertura"
- },
- "tool_CircleBlocker": {
- "message": "Bloqueador Circular"
- },
- "tool_DiffractionGrating": {
- "message": "Grade de DifraçãoBeta"
- },
- "tool_Ruler": {
- "message": "Régua"
- },
- "tool_Protractor": {
- "message": "Transferidor"
- },
- "tool_TextLabel": {
- "message": "Texto"
- },
- "tool_LineArrow": {
- "message": "Linha / Seta"
- },
- "tool_Drawing": {
- "message": "Desenhar"
- },
- "tool_": {
- "message": "Mover Vista"
- },
- "View: ": {
- "message": "Ver"
- },
- "Settings: ": {
- "message": "Configurações"
- },
- "moresettings": {
- "message": "Mais"
- },
- "mode_rays": {
- "message": "Raios"
- },
- "mode_extended": {
- "message": "Raios extendidos"
- },
- "mode_images": {
- "message": "Todas Imagens"
- },
- "mode_observer": {
- "message": "Visto por Observador"
- },
- "zoom": {
- "message": "Zoom"
- },
- "help": {
- "message": "Ajuda"
- },
- "rayDensity": {
- "message": "Densidade de Raios"
- },
- "raydensity": {
- "message": "Densidade de Raios:"
- },
- "undo": {
- "message": "Desfazer"
- },
- "redo": {
- "message": "Refazer"
- },
- "reset": {
- "message": "Reiniciar"
- },
- "save": {
- "message": "Salvar"
- },
- "rename": {
- "message": "Renomear"
- },
- "get_link": {
- "message": "Copiar Link Compartilhável"
- },
- "export_svg": {
- "message": "Exportar como PNG/SVG"
- },
- "view_gallery": {
- "message": "Ver Galeria"
- },
- "save_name": {
- "message": "Nome"
- },
- "save_cancel": {
- "message": "Cancelar"
- },
- "save_description": {
- "message": "
Você pode usar Configurações -> Sincronizar URL automaticamente ao invés de salvar para um arquivo.
Clique \"Renomear\" para mudar o título sem salvar um arquivo.
"
- },
- "open": {
- "message": "Abrir"
- },
- "layoutaids": {
- "message": "Auxílio de posicionamento"
- },
- "lockObjs": {
- "message": "Travar Objetos"
- },
- "showGrid": {
- "message": "Grade"
- },
- "snapToGrid": {
- "message": "Ajustar na grade"
- },
- "snaptogrid": {
- "message": "Ajustar na grade"
- },
- "length_unit_popover": {
- "message": "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."
- },
- "lengthScale": {
- "message": "Escala de ComprimentoBeta"
- },
- "lengthScale_popover": {
- "message": "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."
- },
- "brightness": {
- "message": "Brilho"
- },
- "wavelength": {
- "message": "Comprimento de onda (nm)"
- },
- "dichroic": {
- "message": "Dicróico"
- },
- "filter": {
- "message": "Filtro"
- },
- "bandwidth": {
- "message": "Largura de banda (nm)"
- },
- "invert": {
- "message": "Inverter"
- },
- "emisAngle": {
- "message": "Ângulo de Emissão (°)"
- },
- "mirrored": {
- "message": "Espelhado"
- },
- "lineDensity": {
- "message": "Linhas/mm"
- },
- "slitRatio": {
- "message": "Largura de vão / Espaçamento de linha"
- },
- "customBrightness": {
- "message": "Brilho Personalizado"
- },
- "customBrightness_note_popover": {
- "message": "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."
- },
- "symmetric": {
- "message": "Simétrico"
- },
- "eqn_note": {
- "message": "
Constantes suportadas: pi e
Operadores suportados: + - * / ^
Funções suportadas: sqrt sin cos tan sec csc cot sinh cosh tanh log exp arcsin arccos arctan arcsinh arccosh arctanh floor round ceil trunc sgn max min abs
Funções suportadas: sqrt sin cos tan sec csc cot sinh cosh tanh log arcsin arccos arctan
To simulate chromatic dispersion, use parameter lambda for the vacuum wavelength in nanometers.Beta
Somente suporta funções diferenciáveis.
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.
Para simulação mais precisa, veja \"Mais opções...\"
Esta opção se aplica a todos objetos GRIN na simulação.
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 'CircleGrinGlass.js').
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.
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.
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 'CircleGrinGlass.js', para mais informações.
Essa tolerância numérica é usada nas funções 'isOnBoundary' e 'countIntersections', dentro do arquivo'GrinGlass.js'.
"
- },
- "cauchyCoeff": {
- "message": "Coeficiente de Cauchy"
- },
- "transRatio": {
- "message": "Razão de Transmissão"
- },
- "applytoall": {
- "message": "Aplicar em Todos"
- },
- "duplicate": {
- "message": "Duplicar"
- },
- "delete": {
- "message": "Apagar"
- },
- "unselect": {
- "message": "Desselecionar"
- },
- "unselect_popover": {
- "message": "Desselecionar esse objeto (Botão direito do mouse em espaço vazio tem a mesma função.)"
- },
- "showadvanced": {
- "message": "Mais opções..."
- },
- "processing": {
- "message": "Processando... Clique aqui para parar."
- },
- "contribute": {
- "message": "Contribuir"
- },
- "github": {
- "message": "GitHub"
- },
- "about": {
- "message": "Sobre"
- },
- "about_url": {
- "message": "https://phydemo.app/ray-optics/about"
- },
- "translate": {
- "message": "Ajude-nos a traduzir este aplicativo"
- },
- "translated": {
- "message": "traduzido"
- },
- "undo_popover": {
- "message": "Desfazer última ação. (Ctrl+Z)"
- },
- "redo_popover": {
- "message": "Refazer última ação. (Ctrl+Y)"
- },
- "reset_popover": {
- "message": "Desfazer todas as mudanças."
- },
- "save_popover": {
- "message": "Salvar a cena atual como um arquivo."
- },
- "open_popover": {
- "message": "Abrir um arquivo existente ou imagem de fundo. A imagem de fundo será exibida a partir origem das coordenadas. (Ou solte o arquivo)"
- },
- "get_link_popover": {
- "message": "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."
- },
- "get_link_warning": {
- "message": "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."
- },
- "export_svg_warning": {
- "message": "Exportar como SVG: Misturas de cores e índices refrativos relativos abaixo de 1 não são suportados."
- },
- "export_ray_count_warning": {
- "message": "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."
- },
- "view_gallery_popover": {
- "message": "Ir para a página web da Galeria para carregar um exemplo."
- },
- "tool_SingleRay_popover": {
- "message": "Um único raio de luz definido por dois pontos. (Arraste ou clique para criar. O primeiro ponto é a fonte, disparando rumo ao segundo ponto.)"
- },
- "tool_Beam_popover": {
- "message": "Um feixe paralelo ou divergente de luz emerge de um segmento de linha, com densidade controlada pelo controle deslizante 'Densidade de raios'. (Arraste ou clique para criar.)"
- },
- "tool_PointSource_popover": {
- "message": "Raios emergem de um ponto único, com quantidade controlada pelo controle deslizante 'Densidade de raios'. (Clique para criar.)"
- },
- "tool_AngleSource_popover": {
- "message": "Fonte pontual com um ângulo de emissão definido."
- },
- "tool_Mirror_popover": {
- "message": "Simule a reflexão da luz em um espelho. (Arraste ou clique para criar.)"
- },
- "tool_ArcMirror_popover": {
- "message": "Um espelho cujo formato é parte de um círculo, que é definido por três pontos. (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.)"
- },
- "tool_ParabolicMirror_popover": {
- "message": "Um espelho cujo formato é uma parábola, que é definida por três pontos. (Arraste ou clique para criar.)"
- },
- "tool_CustomMirror_popover": {
- "message": "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). (Arraste ou clique para criar.)"
- },
- "tool_BeamSplitter_popover": {
- "message": "Um espelho que transmite uma porcentagem da luz que chega (Arraste ou clique para criar.)"
- },
- "tool_IdealMirror_popover": {
- "message": "O espelho 'curvo' idealizado que obedece exatamente a equação (1/p + 1/q = 1/f). O comprimento focal pode ser definido diretamente. (Arraste ou clique para criar.)"
- },
- "tool_PlaneGlass_popover": {
- "message": "Simule a refração e a reflexão da luz em uma superfície. (Arraste ou clique para criar.)"
- },
- "tool_CircleGlass_popover": {
- "message": "Vidro com um formato circular, definido por seu centro e um ponto na superfície. (Arraste ou clique para criar.)"
- },
- "tool_CircleGrinGlass_popover": {
- "message": "Vidro com uma função personalizada de índice refrativo n(x,y) e um formato circular. (Arraste ou clique para criar.)"
- },
- "tool_Glass_popover": {
- "message": "Vidro com qualquer formato construído com segmentos de linha e arcos circulares. (Clique para criar um segmento, arraste para criar um arco, e clique no ponto de início quando acabar de desenhar.)"
- },
- "tool_GrinGlass_popover": {
- "message": "Vidro com uma função personalizada de índice refrativo n(x,y) e um formato poligonal. AVISO: Somente polígonos simples são suportados, senão o comportamento pode ser imprevisível. (Clique para criar um segmento, arraste para criar um arco, e clique no ponto de início quando acabar de desenhar.)"
- },
- "tool_IdealLens_popover": {
- "message": "Uma lente ideal que obedece exatamente à equação de lente fina (1/p + 1/q = 1/f). O comprimento focal pode ser definido diretamente. (Arraste ou clique para criar.)"
- },
- "tool_SphericalLens_popover": {
- "message": "Uma lente esférica. (Clique para criar.)"
- },
- "tool_CustomGlass_popover": {
- "message": "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). (Arraste ou clique para criar.)"
- },
- "tool_Blocker_popover": {
- "message": "Um segmento de linha bloqueador de luz que absorve os raios incidentes. (Arraste ou clique para criar.)"
- },
- "tool_Aperture_popover": {
- "message": "Um par de bloqueadores de luz que absorvem os raios incidentes. O tamanho do furo pode ser ajustado simetricamente. (Arraste ou clique nas duas pontas para criar.)"
- },
- "tool_CircleBlocker_popover": {
- "message": "Um bloqueador circular de luz que absorve os raios incidentes. (Arraste ou clique para criar.)"
- },
- "tool_DiffractionGrating_popover": {
- "message": "Uma grade de difração que divide luz em um ângulo dependente do comprimento de onda (Arraste ou clique para criar.)"
- },
- "tool_Ruler_popover": {
- "message": "Uma régua a partir de um ponto zero até um outro ponto. (Arraste ou clique para criar.)"
- },
- "tool_Protractor_popover": {
- "message": "Um transferidor definido a partir do centro e outro ponto para a direção do zero. A escala está em graus (Arraste ou clique para criar.)"
- },
- "tool_Detector_popover": {
- "message": "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. (Arraste ou clique para criar o segmento de linha.) As unidades são arbitrárias."
- },
- "tool_Detector_info_popover": {
- "message": "
P: A taxa de fluxo de energia em B/s (ver abaixo).
F⊥: A taxa de fluxo de momento perpendicular em (B/s)/c.
F∥: A taxa de fluxo de momento paralelo em (B/s)/c.
A irradiância no CSV exportado está em (B/s)/L.
L é a unidade arbitrária de comprimento utilizada nesse simulador.
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.
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.
Se alguns raios forem truncados na série infinita de reflexão interna, a truncação total é exibida como estimativas de erro.
"
- },
- "tool_TextLabel_popover": {
- "message": "Um rótulo de texto."
- },
- "tool_LineArrow_popover": {
- "message": "Uma seta ou segmento de linha. (Arraste ou clique para criar.)"
- },
- "tool_Drawing_popover": {
- "message": "Uma ferramenta de desenho à mão livre. (Arraste para desenhar)"
- },
- "tool__popover": {
- "message": "Arraste para mover a vista. (Arrastar com o botão direito do mouse tem a mesma função.)"
- },
- "mode_rays_popover": {
- "message": "Exibir os raios. Quando a 'Densidade de Raios' está alta, eles parecem ser contínuos."
- },
- "mode_extended_popover": {
- "message": "Exibir tanto os raios quanto suas extensões. Laranja indica extensões para trás, e cinza indica para frente. Quando 'Simular Cores' está ligado, eles são exibidos na cor fonte e distinguidos por traços."
- },
- "mode_images_popover": {
- "message": "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. Quando 'Simular Cores' está ligado, eles são exibidos nas cores fonte e distinguidos por tamanhos de ponto."
- },
- "mode_observer_popover": {
- "message": "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). (Arraste o ponto grande azul para mover o observador.) Quando 'Simular Cores' está ligado, eles são exibidos nas cores fonte."
- },
- "simulateColors_popover": {
- "message": "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. Você pode definir esses parâmetros para esses objetos quando selecionados. Para simular espectros de cor, sobreponha raios com comprimentos de onda diferentes. 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."
- },
- "rayDensity_popover": {
- "message": "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."
- },
- "showGrid_popover": {
- "message": "Define a visibilidade da grade de fundo."
- },
- "grid_popover": {
- "message": "Define se vai ajustar à grade."
- },
- "lockObjs_popover": {
- "message": "Define se os objetos podem ser movidos ou não."
- },
- "zoom_popover": {
- "message": "Configurar zoom com porcentagem."
- },
- "help_popover": {
- "message": "Arraste restrito
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.
Agrupar, rotacionar e ajustar escala de objetos
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.
Editar coordenadas diretamente
Clique duplo ou clique com botão direito no ponto de controle do objeto, edite as coordenadas (x,y), então aperte Enter.
Atalhos de teclado
Quando um objeto está selecionado (ao clicar nele), aperte as setas do teclado para movê-lo; Ctrl+D para duplicar; tecla Delete para apagar.
"
- },
- "show_help_popups": {
- "message": "Exibir popups de ajuda"
- },
- "show_help_popups_popover": {
- "message": "Define se vai exibir popups de ajuda quando pairando sobre botões. (Recarregue a página para fazer efeito.)"
- },
- "show_json_editor": {
- "message": "Exibir editor JSONBeta"
- },
- "show_json_editor_popover": {
- "message": "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)."
- },
- "show_status": {
- "message": "Exibir caixa de status"
- },
- "show_status_popover": {
- "message": "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)."
- },
- "auto_sync_url": {
- "message": "Sincronizar URL automaticamente"
- },
- "auto_sync_url_popover": {
- "message": "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"
- },
- "auto_sync_url_warning": {
- "message": "A cena é grande demais para sincronizar com URL. Por favor, salve manualmente"
- },
- "gridSize": {
- "message": "Tamanho da Grade"
- },
- "observer_size": {
- "message": "Tamanho do Observador"
- },
- "language": {
- "message": "Linguagem"
- },
- "close": {
- "message": "Fechar"
- },
- "advanced_help": {
- "message": "Para ajuda avançada, veja o ícone de ajuda no canto inferior direito."
- },
- "ray_count": {
- "message": "Número de segmentos de raio: "
- },
- "total_truncation": {
- "message": "Brilho truncado: "
- },
- "brightness_scale": {
- "message": "Escala de Brilho: "
- },
- "time_elapsed": {
- "message": "Tempo decorrido (ms): "
- },
- "force_stopped": {
- "message": "Interrompido à força."
- },
- "mouse_coordinates": {
- "message": "Coordenadas do Mouse: "
- },
- "modules_tutorial": {
- "message": "Criar módulos personalizados"
- },
- "modules_tutorial_url": {
- "message": "https://phydemo.app/ray-optics/modules/tutorial"
- },
- "identical_optical_objects_warning": {
- "message": "Há dois elementos ópticos idênticos na cena que se sobrepõem completamente."
- },
- "import_modules": {
- "message": "Importar Módulos..."
- },
- "import_modules_title": {
- "message": "Importar Módulos"
- },
- "modules_url": {
- "message": "../modules/modules.html"
- },
- "remove_module": {
- "message": "Remover módulo"
- },
- "module_conflict": {
- "message": "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."
- },
- "brightness_inconsistent_warning": {
- "message": "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."
- }
-}
\ No newline at end of file
diff --git a/locales/pt-BR/main.json b/locales/pt-BR/main.json
new file mode 100644
index 00000000..99a86e63
--- /dev/null
+++ b/locales/pt-BR/main.json
@@ -0,0 +1,212 @@
+{
+ "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."
+ }
+ },
+ "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/simulator.json b/locales/pt-BR/simulator.json
new file mode 100644
index 00000000..98cf67d3
--- /dev/null
+++ b/locales/pt-BR/simulator.json
@@ -0,0 +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"
+ },
+ "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))."
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/locales/ru.json b/locales/ru.json
deleted file mode 100644
index e33e4d32..00000000
--- a/locales/ru.json
+++ /dev/null
@@ -1,1048 +0,0 @@
-{
- "appName": {
- "message": "Симуляция оптических лучей"
- },
- "appShortName": {
- "message": "Лучевая оптика"
- },
- "appDesc": {
- "incomplete": true,
- "message": "A free, open-source web app for creating and simulating 2D geometric optical scenes."
- },
- "homepage_desc": {
- "incomplete": true,
- "message": "Create & simulate 2D geometric optical scenes interactively. Totally free and web-based. Source code is available on GitHub."
- },
- "launch_simulator": {
- "incomplete": true,
- "message": "Launch Simulator"
- },
- "home": {
- "incomplete": true,
- "message": "Home"
- },
- "home_url": {
- "message": "https://phydemo.app/ray-optics/ru/"
- },
- "gallery": {
- "incomplete": true,
- "message": "Gallery"
- },
- "gallery_url": {
- "incomplete": true,
- "message": "https://phydemo.app/ray-optics/gallery/"
- },
- "welcome": {
- "incomplete": true,
- "message": "Welcome to Ray Optics Simulation To add an optical component, select a tool and click the blank space. To load an example, please go to the Gallery page."
- },
- "loading_msg": {
- "incomplete": true,
- "message": "Welcome to Ray Optics Simulation Loading scene from URL... Please wait."
- },
- "toolbar_title": {
- "message": "Инструмент: "
- },
- "toolname_SingleRay": {
- "message": "Луч"
- },
- "toolname_AngleSource": {
- "message": "Точечный источник"
- },
- "toolname_PointSource": {
- "message": "Точечный источник"
- },
- "toolname_Beam": {
- "message": "Пучок"
- },
- "toolname_mirror_": {
- "message": "Зеркало"
- },
- "toolname_Mirror": {
- "message": "Зеркало"
- },
- "toolname_ArcMirror": {
- "message": "Зеркало"
- },
- "toolname_ParabolicMirror": {
- "message": "Зеркало"
- },
- "toolname_CustomMirror": {
- "incomplete": true,
- "message": "Mirror"
- },
- "toolname_IdealMirror": {
- "message": "Идеальное кривое зеркало"
- },
- "toolname_glass_": {
- "message": "Стекло"
- },
- "toolname_blocker_": {
- "message": "Поглощающая поверхность"
- },
- "toolname_BeamSplitter": {
- "incomplete": true,
- "message": "Beam Splitter"
- },
- "toolname_PlaneGlass": {
- "message": "Стекло"
- },
- "toolname_CircleGlass": {
- "message": "Стекло"
- },
- "toolname_CircleGrinGlass": {
- "incomplete": true,
- "message": "Gradient-index glass"
- },
- "toolname_Glass": {
- "message": "Стекло"
- },
- "toolname_GrinGlass": {
- "incomplete": true,
- "message": "Gradient-index glass"
- },
- "toolname_IdealLens": {
- "message": "Идеальная линза"
- },
- "toolname_SphericalLens": {
- "incomplete": true,
- "message": "Spherical lens"
- },
- "toolname_CustomGlass": {
- "incomplete": true,
- "message": "Glass"
- },
- "toolname_Blocker": {
- "incomplete": true,
- "message": "Line Blocker"
- },
- "toolname_Aperture": {
- "incomplete": true,
- "message": "Aperture"
- },
- "toolname_CircleBlocker": {
- "incomplete": true,
- "message": "Circle Blocker"
- },
- "toolname_DiffractionGrating": {
- "incomplete": true,
- "message": "Diffraction GratingBeta"
- },
- "toolname_Ruler": {
- "message": "Линейка"
- },
- "toolname_Protractor": {
- "message": "Транспортир"
- },
- "tool_Detector": {
- "incomplete": true,
- "message": "Detector"
- },
- "toolname_Detector": {
- "incomplete": true,
- "message": "Detector"
- },
- "toolname_TextLabel": {
- "incomplete": true,
- "message": "Text"
- },
- "toolname_LineArrow": {
- "incomplete": true,
- "message": "Line"
- },
- "toolname_Drawing": {
- "incomplete": true,
- "message": "Drawing"
- },
- "toolname_Handle": {
- "incomplete": true,
- "message": "Handle"
- },
- "toolname_CropBox": {
- "incomplete": true,
- "message": "Export"
- },
- "toolname_ModuleObj": {
- "incomplete": true,
- "message": "ModuleBeta"
- },
- "tool_more_": {
- "message": "Другое"
- },
- "toolname_": {
- "message": "Движение камеры"
- },
- "modebar_title": {
- "message": "Вид:"
- },
- "modename_light": {
- "message": "Лучи"
- },
- "modename_extended_light": {
- "message": "Лучи с продолжениями"
- },
- "modename_images": {
- "message": "Все изображения"
- },
- "modename_observer": {
- "message": "Видимые наблюдателем"
- },
- "simulateColors": {
- "incomplete": true,
- "message": "Simulate Colors"
- },
- "File: ": {
- "message": "Файл"
- },
- "Tools: ": {
- "message": "Инструменты"
- },
- "tool_SingleRay": {
- "message": "Луч"
- },
- "tool_Beam": {
- "message": "Пучок"
- },
- "tool_PointSource": {
- "message": "Точечный источник (360°)"
- },
- "tool_AngleSource": {
- "message": "Точечный источник (<360°)"
- },
- "tool_PointSource_": {
- "message": "Точечный источник"
- },
- "tool_lightSource_": {
- "message": "Источник света"
- },
- "tool_mirror_": {
- "message": "Зеркала"
- },
- "tool_Mirror": {
- "message": "Плоское"
- },
- "tool_ArcMirror": {
- "message": "Дуговое"
- },
- "tool_ParabolicMirror": {
- "incomplete": true,
- "message": "Parabolic"
- },
- "tool_CustomMirror": {
- "incomplete": true,
- "message": "Custom Equation"
- },
- "tool_BeamSplitter": {
- "incomplete": true,
- "message": "Beam Splitter"
- },
- "tool_IdealMirror": {
- "message": "Идеальное кривое"
- },
- "tool_glass_": {
- "message": "Стекло"
- },
- "tool_blocker_": {
- "message": "Блокиратор"
- },
- "tool_PlaneGlass": {
- "message": "Полуплоскость"
- },
- "tool_CircleGlass": {
- "message": "Круг"
- },
- "tool_CircleGrinGlass": {
- "incomplete": true,
- "message": "Gradient-index circle"
- },
- "tool_Glass": {
- "incomplete": true,
- "message": "Polygon / Circular Arcs"
- },
- "tool_GrinGlass": {
- "incomplete": true,
- "message": "Gradient-index polygon"
- },
- "tool_IdealLens": {
- "message": "Идеальная линза"
- },
- "tool_SphericalLens": {
- "incomplete": true,
- "message": "Spherical Lens"
- },
- "tool_CustomGlass": {
- "incomplete": true,
- "message": "Custom Equation"
- },
- "tool_Blocker": {
- "incomplete": true,
- "message": "Line Blocker"
- },
- "tool_Aperture": {
- "incomplete": true,
- "message": "Aperture"
- },
- "tool_CircleBlocker": {
- "incomplete": true,
- "message": "Circle Blocker"
- },
- "tool_DiffractionGrating": {
- "incomplete": true,
- "message": "Diffraction GratingBeta"
- },
- "tool_Ruler": {
- "message": "Линейка"
- },
- "tool_Protractor": {
- "message": "Транспортир"
- },
- "tool_TextLabel": {
- "incomplete": true,
- "message": "Text"
- },
- "tool_LineArrow": {
- "incomplete": true,
- "message": "Line / Arrow"
- },
- "tool_Drawing": {
- "incomplete": true,
- "message": "Drawing"
- },
- "tool_": {
- "message": "Движение камеры"
- },
- "View: ": {
- "message": "Вид"
- },
- "Settings: ": {
- "message": "Настройки"
- },
- "moresettings": {
- "incomplete": true,
- "message": "More"
- },
- "mode_rays": {
- "message": "Лучи"
- },
- "mode_extended": {
- "message": "Лучи с продолжениями"
- },
- "mode_images": {
- "message": "Все изображения"
- },
- "mode_observer": {
- "message": "Видимые наблюдателем"
- },
- "zoom": {
- "message": "Масштаб"
- },
- "help": {
- "message": "Помощь"
- },
- "rayDensity": {
- "message": "Плотность лучей"
- },
- "raydensity": {
- "message": "Плотность лучей:"
- },
- "undo": {
- "message": "Отмена"
- },
- "redo": {
- "message": "Повтор"
- },
- "reset": {
- "message": "Сброс"
- },
- "save": {
- "message": "Сохранить"
- },
- "rename": {
- "incomplete": true,
- "message": "Rename"
- },
- "get_link": {
- "incomplete": true,
- "message": "Copy Shareable Link"
- },
- "export_svg": {
- "incomplete": true,
- "message": "Export as PNG/SVG"
- },
- "view_gallery": {
- "incomplete": true,
- "message": "View Gallery"
- },
- "save_name": {
- "message": "Название"
- },
- "save_cancel": {
- "message": "Отмена"
- },
- "save_description": {
- "incomplete": true,
- "message": "
You may use Settings -> Auto sync URL instead of saving to a file.
Click \"Rename\" to change the title without saving to a file.
"
- },
- "open": {
- "message": "Открыть"
- },
- "layoutaids": {
- "incomplete": true,
- "message": "Layout Aids"
- },
- "lockObjs": {
- "incomplete": true,
- "message": "Lock Objects"
- },
- "showGrid": {
- "message": "Сетка"
- },
- "snapToGrid": {
- "message": "Клеиться к сетке"
- },
- "snaptogrid": {
- "message": "Клеиться к сетке"
- },
- "length_unit_popover": {
- "incomplete": true,
- "message": "The unit of length used in this simulator (except for wavelengths) is an arbitrary unit, which can be interpreted as any physical unit (e.g. millimeters) as long as it is consistent throughout the simulation. If the unit appears too small or too large, please adjust Settings -> Length Scale."
- },
- "lengthScale": {
- "incomplete": true,
- "message": "Length ScaleBeta"
- },
- "lengthScale_popover": {
- "incomplete": true,
- "message": "If the default unit of length is too small or too large to model a physical system when interpreted as a common physical unit (e.g. millimeters), this factor can be used to scale the appearance (e.g. line widths) in the scene."
- },
- "brightness": {
- "message": "Яркость"
- },
- "wavelength": {
- "message": "Длина волны (nm)"
- },
- "dichroic": {
- "message": "Дихроик"
- },
- "filter": {
- "message": "Фильтр"
- },
- "bandwidth": {
- "message": "Пропускная способность (nm)"
- },
- "invert": {
- "message": "Инвертировать"
- },
- "emisAngle": {
- "incomplete": true,
- "message": "Emission Angle (°)"
- },
- "mirrored": {
- "incomplete": true,
- "message": "Mirrored"
- },
- "lineDensity": {
- "incomplete": true,
- "message": "Lines/mm"
- },
- "slitRatio": {
- "incomplete": true,
- "message": "Slit width / line spacing"
- },
- "customBrightness": {
- "incomplete": true,
- "message": "Custom Brightness"
- },
- "customBrightness_note_popover": {
- "incomplete": true,
- "message": "When on, the brightnesses of the diffracted rays are customized by an array of numbers corresponding to m = 0, 1, -1, 2, -2, .... The number is to be normalized to the brightness of the incident ray. The values not in the array are set to 0. For example, \"1, 0.5, 0.5\" means the m=0 ray has the same brightness as the incident ray, the m=1 and m=-1 rays have half the brightness, and all other rays are ignored."
- },
- "symmetric": {
- "incomplete": true,
- "message": "Symmetric"
- },
- "eqn_note": {
- "incomplete": true,
- "message": "
Supported constants: pi e
Supported operators: + - * / ^
Supported functions: sqrt sin cos tan sec csc cot sinh cosh tanh log exp arcsin arccos arctan arcsinh arccosh arctanh floor round ceil trunc sgn max min abs
Supported functions: sqrt sin cos tan sec csc cot sinh cosh tanh log arcsin arccos arctan
To simulate chromatic dispersion, use parameter lambda for the vacuum wavelength in nanometers.Beta
Only supports differentiable functions.
The origin of n(x,y) is in the absolute coordinates and does not move with the object. You may double-click a control-point to inspect its absolute coordinates.
For a more accurate simulation, see \"More options...\"
This toggle applies to all GRIN objects in the simulation.
This simulator has currently two implementations of light propagation between different mediums, for GRIN objects - numerical and symbolic (see 'multRefIndex' and 'devRefIndex' functions in 'CircleGrinGlass.js').
The numerical implementation is faster but doesn't always work properly (depending on the specific case) in scenarios when used with more than one GRIN object, such that at least one of them has a refractive index function which is not defined in the entire plane, while the symbolic implementation is slower but robust to such problems.
If this object is to be simulated with (absolute) refractive index n₁, but is placed inside another glass with refractive index n₀, then you should set the refractive index to n₁/n₀ here. In more complicated cases that several glasses overlap together, the effective reflective index of the overlapping region equals the product of the reflective indices of individual ones.
Step size of Euler's method for solving the eikonal ray equation - see 'step' function and documentation inside the 'CircleGrinGlass.js' file, for more information.
This numerical tolerance is used in the functions 'isOnBoundary' and 'countIntersections', inside the 'GrinGlass.js' file.
"
- },
- "cauchyCoeff": {
- "incomplete": true,
- "message": "Cauchy coefficient"
- },
- "transRatio": {
- "incomplete": true,
- "message": "Transmission Ratio"
- },
- "applytoall": {
- "message": "Применить ко всем"
- },
- "duplicate": {
- "message": "Дублировать"
- },
- "delete": {
- "message": "Удалить"
- },
- "unselect": {
- "incomplete": true,
- "message": "Unselect"
- },
- "unselect_popover": {
- "incomplete": true,
- "message": "Unselect this object (Right-click on blank space has the same function.)"
- },
- "showadvanced": {
- "incomplete": true,
- "message": "More options..."
- },
- "processing": {
- "message": "Вычисление... Нажмите, чтобы остановить."
- },
- "contribute": {
- "incomplete": true,
- "message": "Contribute"
- },
- "github": {
- "incomplete": true,
- "message": "GitHub"
- },
- "about": {
- "incomplete": true,
- "message": "About"
- },
- "about_url": {
- "message": "https://phydemo.app/ray-optics/about"
- },
- "translate": {
- "incomplete": true,
- "message": "Help us translate this app"
- },
- "translated": {
- "incomplete": true,
- "message": "translated"
- },
- "undo_popover": {
- "message": "Отменить последнее действие. (Ctrl+Z)"
- },
- "redo_popover": {
- "message": "Повторить последнее действие. (Ctrl+Y)"
- },
- "reset_popover": {
- "message": "Сбросить все изменения."
- },
- "save_popover": {
- "incomplete": true,
- "message": "Save the current scene as a file."
- },
- "open_popover": {
- "incomplete": true,
- "message": "Open an existing file or background image. The background image will be shown from the coordinate origin. (Or drop the file)"
- },
- "get_link_popover": {
- "incomplete": true,
- "message": "Copy and go to the direct URL for the current scene, which can be used for sharing (possibly via a URL shortener). Also see Settings -> Auto sync URL."
- },
- "get_link_warning": {
- "incomplete": true,
- "message": "The URL is too long that it may not work on some platforms. You may need to use \"Save\" and share the file instead."
- },
- "export_svg_warning": {
- "incomplete": true,
- "message": "Export to SVG: Color mixtures and relative refractive indices below 1 are not supported."
- },
- "export_ray_count_warning": {
- "incomplete": true,
- "message": "The current number of rays in the scene is larger than the ray count limit. You may need to increase the ray count limit in the Crop Box options."
- },
- "view_gallery_popover": {
- "incomplete": true,
- "message": "Go to the Gallery webpage to load an example."
- },
- "tool_SingleRay_popover": {
- "message": "Одиночный луч света, задаваемый двумя точками. (Потяните или нажмите, чтобы создать. Первая точка - источник, испускающий луч в сторону второй точки.)"
- },
- "tool_Beam_popover": {
- "incomplete": true,
- "message": "A parallel or divergent beam of rays emerges from a line segment, with density controlled by the 'Ray density' slider. (Drag or click to create.)"
- },
- "tool_PointSource_popover": {
- "message": "Лучи исходят из одной точки во всех направлениях. Количество лучей задается ползунком 'Плотность лучей'. (Нажмите, чтобы создать.)"
- },
- "tool_AngleSource_popover": {
- "incomplete": true,
- "message": "Point source with a given emission angle."
- },
- "tool_Mirror_popover": {
- "message": "Симулирует отражение в зеркале. (Потяните или нажмите, чтобы создать.)"
- },
- "tool_ArcMirror_popover": {
- "message": "Зеркало в форме дуги. Задается тремя точками. (Потяните или нажмите, чтобы создать. Первые две точки задают концы дуги, последняя точка задает радиус окружности.)"
- },
- "tool_ParabolicMirror_popover": {
- "incomplete": true,
- "message": "A mirror whose shape is a parabola, which is defined by three points. (Drag or click to create.)"
- },
- "tool_CustomMirror_popover": {
- "incomplete": true,
- "message": "A mirror whose shape is defined by a custom equation y = f(x), where (x,y) is in the transformed coordinates in which the two control points are (-1,0) and (1,0). (Drag or click to create.)"
- },
- "tool_BeamSplitter_popover": {
- "incomplete": true,
- "message": "A mirror that transmits a percentage of incoming light. (Drag or click to create.)"
- },
- "tool_IdealMirror_popover": {
- "message": "Идеальное 'кривое' зеркало, строго подчиняющееся уравнению зеркала (1/d + 1/f = 1/F). Фокальное расстояние задается. (Потяните или нажмите, чтобы создать.)"
- },
- "tool_PlaneGlass_popover": {
- "message": "Симулирует отражение и преломление света на поверхности. (Потяните или нажмите, чтобы создать.)"
- },
- "tool_CircleGlass_popover": {
- "message": "Стекло в форме круга. Задается центром и точкой. (Потяните или нажмите, чтобы создать.)"
- },
- "tool_CircleGrinGlass_popover": {
- "incomplete": true,
- "message": "Glass with a custom refractive index function n(x,y) and a circular boundary. (Drag or click to create.)"
- },
- "tool_Glass_popover": {
- "message": "Стекло с формой, состоящей из отрезков и дуг. (Нажмите, чтобы создать отрезок, потяните, чтобы создать дугу, нажмите на начальную точку, чтобы закончить фигуру.)"
- },
- "tool_GrinGlass_popover": {
- "incomplete": true,
- "message": "Glass with a custom refractive index function n(x,y) and a polygonal boundary. WARNING: Only simple polygons are supported, otherwise the behavior is unpredictable. (Click to create a segment, click on the starting point when finish drawing.)"
- },
- "tool_IdealLens_popover": {
- "message": "Идеальная линза, строго подчиняющаяся уравнению плоской линзы (1/d + 1/f = 1/F). Фокальное расстояние задается. (Потяните или нажмите, чтобы создать.)"
- },
- "tool_SphericalLens_popover": {
- "incomplete": true,
- "message": "A spherical lens. (Click to create.)"
- },
- "tool_CustomGlass_popover": {
- "incomplete": true,
- "message": "Glass with the shape defined by a custom inequality f(x) < y < g(x), where (x,y) is in the transformed coordinates in which the two control points are (-1,0) and (1,0). (Drag or click to create.)"
- },
- "tool_Blocker_popover": {
- "message": "Отрезок, поглощающий попадающие на него лучи. (Потяните или нажмите, чтобы создать.)"
- },
- "tool_Aperture_popover": {
- "incomplete": true,
- "message": "A pair of light blockers which absorbs the incident rays. The size of the hole can be adjusted symmetrically. (Drag or click the two endpoints to create.)"
- },
- "tool_CircleBlocker_popover": {
- "incomplete": true,
- "message": "A circle light blocker which absorbs the incident rays. (Drag or click to create.)"
- },
- "tool_DiffractionGrating_popover": {
- "incomplete": true,
- "message": "A diffraction grating that splits light at an angle depending on wavelength. Warning: The intensities of diffracted rays may not be accurate. (Drag or click to create.)"
- },
- "tool_Ruler_popover": {
- "message": "Линейка от нуля до точки. (Потяните или нажмите, чтобы создать.)"
- },
- "tool_Protractor_popover": {
- "message": "Транспортир Ноль задается центром и другой точкой. Масштаб в градусах. (Потяните или нажмите, чтобы создать.)"
- },
- "tool_Detector_popover": {
- "incomplete": true,
- "message": "A tool for measuring the rate of energy flow (P), the rate of perpendicular momentum flow (F⊥), and the rate of parallel momentum flow (F∥) through a line segment. (Drag or click to create the line segment.) The units are arbitrary."
- },
- "tool_Detector_info_popover": {
- "incomplete": true,
- "message": "
P: The rate of energy flow (flux) in B/s (see below).
F⊥: The rate of perpendicular momentum flow in (B/s)/c.
F∥: The rate of parallel momentum flow in (B/s)/c.
The irradiance in the exported CSV is in (B/s)/L.
L is the arbitrary unit of length used in this simulator.
B is an arbitrary unit of radiant flux or luminous flux, corresponding to the unit of the \"Brightness\" option being B/L for non-Lambertian beams and 500B/360° for point sources.
The dimensionless factor s is the \"Brightness Scale\" shown in Settings -> Show status box, which equals 1 when \"Ray Density\" is above some threshold and proportional to \"Ray Density\" otherwise.
If some rays are truncated in the infinite series of internal reflection, the total truncation is shown as error estimates.
"
- },
- "tool_TextLabel_popover": {
- "incomplete": true,
- "message": "A text label."
- },
- "tool_LineArrow_popover": {
- "incomplete": true,
- "message": "A line segment or arrow. (Drag or click to create.)"
- },
- "tool_Drawing_popover": {
- "incomplete": true,
- "message": "A freehand drawing tool. (Drag to draw.)"
- },
- "tool__popover": {
- "message": "Потяните, чтобы переместить камеру. (Также можно потянуть правой кнопкой мыши.)"
- },
- "mode_rays_popover": {
- "message": "Показывает лучи. Если 'Плотность лучей' высока, они выглядят цельным пучком."
- },
- "mode_extended_popover": {
- "incomplete": true,
- "message": "Show both the rays and its extension. Orange indicates backward extensions, and gray indicates forward ones. When 'Simulate Colors' is on, they are shown in source colors and distinguished by dashing instead."
- },
- "mode_images_popover": {
- "incomplete": true,
- "message": "Show the position of all images. Yellow points indicate real images, orange indicates virtual images, and gray (none in this picture) indicates virtual objects. Note that some images cannot be detected if 'Ray density' is not high enough. When 'Simulate Colors' is on, they are shown in source colors and distinguished by dot sizes instead."
- },
- "mode_observer_popover": {
- "incomplete": true,
- "message": "Simulate the rays and images seen from some position. The blue circle is the observer. Any rays crossing it are considered to be 'observed'. The observer does not know where the rays actually begin, but may think they begin at some point(s) if they intersect there. The rays are shown in blue, and the points in yellow (real) or orange (virtual). (Drag the big blue dot to move the observer.) When 'Simulate Colors' is on, they are shown in source colors instead."
- },
- "simulateColors_popover": {
- "incomplete": true,
- "message": "Simulate colors (wavelengths) of light sources, mixture of colors, color filtering of blockers and mirrors, and chromatic dispersion of glasses. You can set those parameters for those objects when selected. To simulate color spectra, overlap rays with different wavelengths. The colors shown on the screen are only rough approximations, and can be very inaccurate when 'Ray density' is too high or too low."
- },
- "rayDensity_popover": {
- "incomplete": true,
- "message": "Determines the number of rays to be emitted by beams and point sources. This also affects the accuracy of image detection and color rendering."
- },
- "showGrid_popover": {
- "message": "Включить или выключить сетку."
- },
- "grid_popover": {
- "message": "Включить или выключить приклейку к сетке."
- },
- "lockObjs_popover": {
- "message": "Разрешить или нет перемещение объектов."
- },
- "zoom_popover": {
- "message": "Увеличить или уменьшить масштаб."
- },
- "help_popover": {
- "incomplete": true,
- "message": "Constrained dragging
When dragging an object, hold Shift to limit to horizontal/vertical; hold Ctrl to clone. When creating a line-shaped object or dragging its endpoints, hold Shift to lock the angle or snap to 0°, 45°, 90°; hold Ctrl to rotate/scale about its center.
Group, rotate, and scale objects
Hold Ctrl, click several control points (e.g. endpoints), then click empty space to group these points and create a handle. Drag the handle (or press arrow keys) to move the group; Shift+drag to limit to horizontal/vertical; Ctrl+drag to rotate, Ctrl+Shift+drag to scale. Drag the \"+\" to set rotation/scaling center. Click the handle and press Ctrl+D to duplicate the group; press Delete to ungroup.
Edit coordinates directly
Double-click or right-click the control point (e.g. endpoint) of the object, edit the (x,y) coordinates, then press Enter.
Keyboard shortcuts
When an object is selected (by clicking it), press arrow keys to move; Ctrl+D to duplicate; Delete key to delete.
"
- },
- "open": {
- "message": "විවෘත කරන්න"
- },
- "layoutaids": {
- "incomplete": true,
- "message": "Layout Aids"
- },
- "lockObjs": {
- "incomplete": true,
- "message": "Lock Objects"
- },
- "showGrid": {
- "message": "Grid"
- },
- "snapToGrid": {
- "incomplete": true,
- "message": "Snap to Grid"
- },
- "snaptogrid": {
- "incomplete": true,
- "message": "Snap to Grid"
- },
- "length_unit_popover": {
- "incomplete": true,
- "message": "The unit of length used in this simulator (except for wavelengths) is an arbitrary unit, which can be interpreted as any physical unit (e.g. millimeters) as long as it is consistent throughout the simulation. If the unit appears too small or too large, please adjust Settings -> Length Scale."
- },
- "lengthScale": {
- "incomplete": true,
- "message": "Length ScaleBeta"
- },
- "lengthScale_popover": {
- "incomplete": true,
- "message": "If the default unit of length is too small or too large to model a physical system when interpreted as a common physical unit (e.g. millimeters), this factor can be used to scale the appearance (e.g. line widths) in the scene."
- },
- "brightness": {
- "incomplete": true,
- "message": "Brightness"
- },
- "wavelength": {
- "message": "තරංග ආයාමය (nm)"
- },
- "dichroic": {
- "message": "ද්වි වර්ණ"
- },
- "filter": {
- "message": "පෙරහන"
- },
- "bandwidth": {
- "message": "Bandwidth (nm)"
- },
- "invert": {
- "message": "Invert"
- },
- "emisAngle": {
- "message": "විමෝචන කෝණය (°)"
- },
- "mirrored": {
- "incomplete": true,
- "message": "Mirrored"
- },
- "lineDensity": {
- "message": "රේඛා/mm"
- },
- "slitRatio": {
- "message": "ස්ලිට් පළල / රේඛා පරතරය"
- },
- "customBrightness": {
- "incomplete": true,
- "message": "Custom Brightness"
- },
- "customBrightness_note_popover": {
- "incomplete": true,
- "message": "When on, the brightnesses of the diffracted rays are customized by an array of numbers corresponding to m = 0, 1, -1, 2, -2, .... The number is to be normalized to the brightness of the incident ray. The values not in the array are set to 0. For example, \"1, 0.5, 0.5\" means the m=0 ray has the same brightness as the incident ray, the m=1 and m=-1 rays have half the brightness, and all other rays are ignored."
- },
- "symmetric": {
- "message": "සමමිතික"
- },
- "eqn_note": {
- "incomplete": true,
- "message": "
Supported constants: pi e
Supported operators: + - * / ^
Supported functions: sqrt sin cos tan sec csc cot sinh cosh tanh log exp arcsin arccos arctan arcsinh arccosh arctanh floor round ceil trunc sgn max min abs
Supported functions: sqrt sin cos tan sec csc cot sinh cosh tanh log arcsin arccos arctan
To simulate chromatic dispersion, use parameter lambda for the vacuum wavelength in nanometers.Beta
Only supports differentiable functions.
The origin of n(x,y) is in the absolute coordinates and does not move with the object. You may double-click a control-point to inspect its absolute coordinates.
For a more accurate simulation, see \"More options...\"
This toggle applies to all GRIN objects in the simulation.
This simulator has currently two implementations of light propagation between different mediums, for GRIN objects - numerical and symbolic (see 'multRefIndex' and 'devRefIndex' functions in 'CircleGrinGlass.js').
The numerical implementation is faster but doesn't always work properly (depending on the specific case) in scenarios when used with more than one GRIN object, such that at least one of them has a refractive index function which is not defined in the entire plane, while the symbolic implementation is slower but robust to such problems.
Step size of Euler's method for solving the eikonal ray equation - see 'step' function and documentation inside the 'CircleGrinGlass.js' file, for more information.
P: The rate of energy flow (flux) in B/s (see below).
F⊥: The rate of perpendicular momentum flow in (B/s)/c.
F∥: The rate of parallel momentum flow in (B/s)/c.
The irradiance in the exported CSV is in (B/s)/L.
L is the arbitrary unit of length used in this simulator.
B is an arbitrary unit of radiant flux or luminous flux, corresponding to the unit of the \"Brightness\" option being B/L for non-Lambertian beams and 500B/360° for point sources.
The dimensionless factor s is the \"Brightness Scale\" shown in Settings -> Show status box, which equals 1 when \"Ray Density\" is above some threshold and proportional to \"Ray Density\" otherwise.
If some rays are truncated in the infinite series of internal reflection, the total truncation is shown as error estimates.
When dragging an object, hold Shift to limit to horizontal/vertical; hold Ctrl to clone. When creating a line-shaped object or dragging its endpoints, hold Shift to lock the angle or snap to 0°, 45°, 90°; hold Ctrl to rotate/scale about its center.
Group, rotate, and scale objects
Hold Ctrl, click several control points (e.g. endpoints), then click empty space to group these points and create a handle. Drag the handle (or press arrow keys) to move the group; Shift+drag to limit to horizontal/vertical; Ctrl+drag to rotate, Ctrl+Shift+drag to scale. Drag the \"+\" to set rotation/scaling center. Click the handle and press Ctrl+D to duplicate the group; press Delete to ungroup.
Edit coordinates directly
Double-click or right-click the control point (e.g. endpoint) of the object, edit the (x,y) coordinates, then press Enter.
Keyboard shortcuts
When an object is selected (by clicking it), press arrow keys to move; Ctrl+D to duplicate; Delete key to delete.
"
- },
- "open": {
- "incomplete": true,
- "message": "Open"
- },
- "layoutaids": {
- "incomplete": true,
- "message": "Layout Aids"
- },
- "lockObjs": {
- "incomplete": true,
- "message": "Lock Objects"
- },
- "showGrid": {
- "incomplete": true,
- "message": "Grid"
- },
- "snapToGrid": {
- "incomplete": true,
- "message": "Snap to Grid"
- },
- "snaptogrid": {
- "incomplete": true,
- "message": "Snap to Grid"
- },
- "length_unit_popover": {
- "incomplete": true,
- "message": "The unit of length used in this simulator (except for wavelengths) is an arbitrary unit, which can be interpreted as any physical unit (e.g. millimeters) as long as it is consistent throughout the simulation. If the unit appears too small or too large, please adjust Settings -> Length Scale."
- },
- "lengthScale": {
- "incomplete": true,
- "message": "Length ScaleBeta"
- },
- "lengthScale_popover": {
- "incomplete": true,
- "message": "If the default unit of length is too small or too large to model a physical system when interpreted as a common physical unit (e.g. millimeters), this factor can be used to scale the appearance (e.g. line widths) in the scene."
- },
- "brightness": {
- "incomplete": true,
- "message": "Brightness"
- },
- "wavelength": {
- "incomplete": true,
- "message": "Wavelength (nm)"
- },
- "dichroic": {
- "incomplete": true,
- "message": "Dichroic"
- },
- "filter": {
- "incomplete": true,
- "message": "Filter"
- },
- "bandwidth": {
- "incomplete": true,
- "message": "Bandwidth (nm)"
- },
- "invert": {
- "incomplete": true,
- "message": "Invert"
- },
- "emisAngle": {
- "incomplete": true,
- "message": "Emission Angle (°)"
- },
- "mirrored": {
- "incomplete": true,
- "message": "Mirrored"
- },
- "lineDensity": {
- "incomplete": true,
- "message": "Lines/mm"
- },
- "slitRatio": {
- "incomplete": true,
- "message": "Slit width / line spacing"
- },
- "customBrightness": {
- "incomplete": true,
- "message": "Custom Brightness"
- },
- "customBrightness_note_popover": {
- "incomplete": true,
- "message": "When on, the brightnesses of the diffracted rays are customized by an array of numbers corresponding to m = 0, 1, -1, 2, -2, .... The number is to be normalized to the brightness of the incident ray. The values not in the array are set to 0. For example, \"1, 0.5, 0.5\" means the m=0 ray has the same brightness as the incident ray, the m=1 and m=-1 rays have half the brightness, and all other rays are ignored."
- },
- "symmetric": {
- "incomplete": true,
- "message": "Symmetric"
- },
- "eqn_note": {
- "incomplete": true,
- "message": "
Supported constants: pi e
Supported operators: + - * / ^
Supported functions: sqrt sin cos tan sec csc cot sinh cosh tanh log exp arcsin arccos arctan arcsinh arccosh arctanh floor round ceil trunc sgn max min abs
Supported functions: sqrt sin cos tan sec csc cot sinh cosh tanh log arcsin arccos arctan
To simulate chromatic dispersion, use parameter lambda for the vacuum wavelength in nanometers.Beta
Only supports differentiable functions.
The origin of n(x,y) is in the absolute coordinates and does not move with the object. You may double-click a control-point to inspect its absolute coordinates.
For a more accurate simulation, see \"More options...\"
This toggle applies to all GRIN objects in the simulation.
This simulator has currently two implementations of light propagation between different mediums, for GRIN objects - numerical and symbolic (see 'multRefIndex' and 'devRefIndex' functions in 'CircleGrinGlass.js').
The numerical implementation is faster but doesn't always work properly (depending on the specific case) in scenarios when used with more than one GRIN object, such that at least one of them has a refractive index function which is not defined in the entire plane, while the symbolic implementation is slower but robust to such problems.
If this object is to be simulated with (absolute) refractive index n₁, but is placed inside another glass with refractive index n₀, then you should set the refractive index to n₁/n₀ here. In more complicated cases that several glasses overlap together, the effective reflective index of the overlapping region equals the product of the reflective indices of individual ones.
Step size of Euler's method for solving the eikonal ray equation - see 'step' function and documentation inside the 'CircleGrinGlass.js' file, for more information.
This numerical tolerance is used in the functions 'isOnBoundary' and 'countIntersections', inside the 'GrinGlass.js' file.
"
- },
- "cauchyCoeff": {
- "incomplete": true,
- "message": "Cauchy coefficient"
- },
- "transRatio": {
- "incomplete": true,
- "message": "Transmission Ratio"
- },
- "applytoall": {
- "incomplete": true,
- "message": "Apply to All"
- },
- "duplicate": {
- "incomplete": true,
- "message": "Duplicate"
- },
- "delete": {
- "incomplete": true,
- "message": "Delete"
- },
- "unselect": {
- "incomplete": true,
- "message": "Unselect"
- },
- "unselect_popover": {
- "incomplete": true,
- "message": "Unselect this object (Right-click on blank space has the same function.)"
- },
- "showadvanced": {
- "incomplete": true,
- "message": "More options..."
- },
- "processing": {
- "incomplete": true,
- "message": "Processing... Click here to stop."
- },
- "contribute": {
- "incomplete": true,
- "message": "Contribute"
- },
- "github": {
- "incomplete": true,
- "message": "GitHub"
- },
- "about": {
- "incomplete": true,
- "message": "About"
- },
- "about_url": {
- "incomplete": true,
- "message": "https://phydemo.app/ray-optics/about"
- },
- "translate": {
- "incomplete": true,
- "message": "Help us translate this app"
- },
- "translated": {
- "incomplete": true,
- "message": "translated"
- },
- "undo_popover": {
- "incomplete": true,
- "message": "Undo last action. (Ctrl+Z)"
- },
- "redo_popover": {
- "incomplete": true,
- "message": "Redo last action. (Ctrl+Y)"
- },
- "reset_popover": {
- "incomplete": true,
- "message": "Reset all changes."
- },
- "save_popover": {
- "incomplete": true,
- "message": "Save the current scene as a file."
- },
- "open_popover": {
- "incomplete": true,
- "message": "Open an existing file or background image. The background image will be shown from the coordinate origin. (Or drop the file)"
- },
- "get_link_popover": {
- "incomplete": true,
- "message": "Copy and go to the direct URL for the current scene, which can be used for sharing (possibly via a URL shortener). Also see Settings -> Auto sync URL."
- },
- "get_link_warning": {
- "incomplete": true,
- "message": "The URL is too long that it may not work on some platforms. You may need to use \"Save\" and share the file instead."
- },
- "export_svg_warning": {
- "incomplete": true,
- "message": "Export to SVG: Color mixtures and relative refractive indices below 1 are not supported."
- },
- "export_ray_count_warning": {
- "incomplete": true,
- "message": "The current number of rays in the scene is larger than the ray count limit. You may need to increase the ray count limit in the Crop Box options."
- },
- "view_gallery_popover": {
- "incomplete": true,
- "message": "Go to the Gallery webpage to load an example."
- },
- "tool_SingleRay_popover": {
- "incomplete": true,
- "message": "A single ray of light defined by two points. (Drag or Click to create. The first point is the source, shooting toward the second point.)"
- },
- "tool_Beam_popover": {
- "incomplete": true,
- "message": "A parallel or divergent beam of rays emerges from a line segment, with density controlled by the 'Ray density' slider. (Drag or click to create.)"
- },
- "tool_PointSource_popover": {
- "incomplete": true,
- "message": "Rays emerge from a single point, with number controlled by the 'Ray density' slider. (Click to create.)"
- },
- "tool_AngleSource_popover": {
- "incomplete": true,
- "message": "Point source with a given emission angle."
- },
- "tool_Mirror_popover": {
- "incomplete": true,
- "message": "Simulate the reflection of light on a mirror. (Drag or click to create.)"
- },
- "tool_ArcMirror_popover": {
- "incomplete": true,
- "message": "A mirror whose shape is part of a circle, which is defined by three points. (Drag or click to create. The first 2 points define the gap between arc's edges, the last point defines the arc's size.)"
- },
- "tool_ParabolicMirror_popover": {
- "incomplete": true,
- "message": "A mirror whose shape is a parabola, which is defined by three points. (Drag or click to create.)"
- },
- "tool_CustomMirror_popover": {
- "incomplete": true,
- "message": "A mirror whose shape is defined by a custom equation y = f(x), where (x,y) is in the transformed coordinates in which the two control points are (-1,0) and (1,0). (Drag or click to create.)"
- },
- "tool_BeamSplitter_popover": {
- "incomplete": true,
- "message": "A mirror that transmits a percentage of incoming light. (Drag or click to create.)"
- },
- "tool_IdealMirror_popover": {
- "incomplete": true,
- "message": "The idealized 'curved' mirror which obeys exactly the mirror equation (1/p + 1/q = 1/f). The focal length can be set directly. (Drag or click to create.)"
- },
- "tool_PlaneGlass_popover": {
- "incomplete": true,
- "message": "Simulate the refraction and reflection of light on a surface. (Drag or click to create.)"
- },
- "tool_CircleGlass_popover": {
- "incomplete": true,
- "message": "Glass with a circle shape, defined by its center and a point on the surface. (Drag or click to create.)"
- },
- "tool_CircleGrinGlass_popover": {
- "incomplete": true,
- "message": "Glass with a custom refractive index function n(x,y) and a circular boundary. (Drag or click to create.)"
- },
- "tool_Glass_popover": {
- "incomplete": true,
- "message": "Glass with any shapes constructed from line segments and circular arcs. (Click to create a segment, drag to create an arc, click on the starting point when finish drawing.)"
- },
- "tool_GrinGlass_popover": {
- "incomplete": true,
- "message": "Glass with a custom refractive index function n(x,y) and a polygonal boundary. WARNING: Only simple polygons are supported, otherwise the behavior is unpredictable. (Click to create a segment, click on the starting point when finish drawing.)"
- },
- "tool_IdealLens_popover": {
- "incomplete": true,
- "message": "An ideal lens which obeys exactly the thin lens equation (1/p + 1/q = 1/f). The focal length can be set directly. (Drag or click to create.)"
- },
- "tool_SphericalLens_popover": {
- "incomplete": true,
- "message": "A spherical lens. (Click to create.)"
- },
- "tool_CustomGlass_popover": {
- "incomplete": true,
- "message": "Glass with the shape defined by a custom inequality f(x) < y < g(x), where (x,y) is in the transformed coordinates in which the two control points are (-1,0) and (1,0). (Drag or click to create.)"
- },
- "tool_Blocker_popover": {
- "incomplete": true,
- "message": "A line-segment light blocker which absorbs the incident rays. (Drag or click to create.)"
- },
- "tool_Aperture_popover": {
- "incomplete": true,
- "message": "A pair of light blockers which absorbs the incident rays. The size of the hole can be adjusted symmetrically. (Drag or click the two endpoints to create.)"
- },
- "tool_CircleBlocker_popover": {
- "incomplete": true,
- "message": "A circle light blocker which absorbs the incident rays. (Drag or click to create.)"
- },
- "tool_DiffractionGrating_popover": {
- "incomplete": true,
- "message": "A diffraction grating that splits light at an angle depending on wavelength. Warning: The intensities of diffracted rays may not be accurate. (Drag or click to create.)"
- },
- "tool_Ruler_popover": {
- "incomplete": true,
- "message": "A ruler from a point for zero and another point. (Drag or click to create.)"
- },
- "tool_Protractor_popover": {
- "incomplete": true,
- "message": "A protractor defined from the center and another point for the zero direction. The scale is in degrees. (Drag or click to create.)"
- },
- "tool_Detector_popover": {
- "incomplete": true,
- "message": "A tool for measuring the rate of energy flow (P), the rate of perpendicular momentum flow (F⊥), and the rate of parallel momentum flow (F∥) through a line segment. (Drag or click to create the line segment.) The units are arbitrary."
- },
- "tool_Detector_info_popover": {
- "incomplete": true,
- "message": "
P: The rate of energy flow (flux) in B/s (see below).
F⊥: The rate of perpendicular momentum flow in (B/s)/c.
F∥: The rate of parallel momentum flow in (B/s)/c.
The irradiance in the exported CSV is in (B/s)/L.
L is the arbitrary unit of length used in this simulator.
B is an arbitrary unit of radiant flux or luminous flux, corresponding to the unit of the \"Brightness\" option being B/L for non-Lambertian beams and 500B/360° for point sources.
The dimensionless factor s is the \"Brightness Scale\" shown in Settings -> Show status box, which equals 1 when \"Ray Density\" is above some threshold and proportional to \"Ray Density\" otherwise.
If some rays are truncated in the infinite series of internal reflection, the total truncation is shown as error estimates.
"
- },
- "tool_TextLabel_popover": {
- "incomplete": true,
- "message": "A text label."
- },
- "tool_LineArrow_popover": {
- "incomplete": true,
- "message": "A line segment or arrow. (Drag or click to create.)"
- },
- "tool_Drawing_popover": {
- "incomplete": true,
- "message": "A freehand drawing tool. (Drag to draw.)"
- },
- "tool__popover": {
- "incomplete": true,
- "message": "Drag to move the view. (Mouse right button drag has the same function.)"
- },
- "mode_rays_popover": {
- "incomplete": true,
- "message": "Show the rays. When the 'Ray density' is high, they appear to be continuous."
- },
- "mode_extended_popover": {
- "incomplete": true,
- "message": "Show both the rays and its extension. Orange indicates backward extensions, and gray indicates forward ones. When 'Simulate Colors' is on, they are shown in source colors and distinguished by dashing instead."
- },
- "mode_images_popover": {
- "incomplete": true,
- "message": "Show the position of all images. Yellow points indicate real images, orange indicates virtual images, and gray (none in this picture) indicates virtual objects. Note that some images cannot be detected if 'Ray density' is not high enough. When 'Simulate Colors' is on, they are shown in source colors and distinguished by dot sizes instead."
- },
- "mode_observer_popover": {
- "incomplete": true,
- "message": "Simulate the rays and images seen from some position. The blue circle is the observer. Any rays crossing it are considered to be 'observed'. The observer does not know where the rays actually begin, but may think they begin at some point(s) if they intersect there. The rays are shown in blue, and the points in yellow (real) or orange (virtual). (Drag the big blue dot to move the observer.) When 'Simulate Colors' is on, they are shown in source colors instead."
- },
- "simulateColors_popover": {
- "incomplete": true,
- "message": "Simulate colors (wavelengths) of light sources, mixture of colors, color filtering of blockers and mirrors, and chromatic dispersion of glasses. You can set those parameters for those objects when selected. To simulate color spectra, overlap rays with different wavelengths. The colors shown on the screen are only rough approximations, and can be very inaccurate when 'Ray density' is too high or too low."
- },
- "rayDensity_popover": {
- "incomplete": true,
- "message": "Determines the number of rays to be emitted by beams and point sources. This also affects the accuracy of image detection and color rendering."
- },
- "showGrid_popover": {
- "incomplete": true,
- "message": "Defines the visibility of the background grid."
- },
- "grid_popover": {
- "incomplete": true,
- "message": "Defines whether to snap to grid."
- },
- "lockObjs_popover": {
- "incomplete": true,
- "message": "Defines whether the objects can be moved or not."
- },
- "zoom_popover": {
- "incomplete": true,
- "message": "Zoom the view with percentage."
- },
- "help_popover": {
- "incomplete": true,
- "message": "Constrained dragging
When dragging an object, hold Shift to limit to horizontal/vertical; hold Ctrl to clone. When creating a line-shaped object or dragging its endpoints, hold Shift to lock the angle or snap to 0°, 45°, 90°; hold Ctrl to rotate/scale about its center.
Group, rotate, and scale objects
Hold Ctrl, click several control points (e.g. endpoints), then click empty space to group these points and create a handle. Drag the handle (or press arrow keys) to move the group; Shift+drag to limit to horizontal/vertical; Ctrl+drag to rotate, Ctrl+Shift+drag to scale. Drag the \"+\" to set rotation/scaling center. Click the handle and press Ctrl+D to duplicate the group; press Delete to ungroup.
Edit coordinates directly
Double-click or right-click the control point (e.g. endpoint) of the object, edit the (x,y) coordinates, then press Enter.
Keyboard shortcuts
When an object is selected (by clicking it), press arrow keys to move; Ctrl+D to duplicate; Delete key to delete.
')) {
+ html = html.substring(3, html.length - 4);
+ }
+
+ // If options contains "blank", replace the link with a target="_blank" link
+ if (options.hash.blank) {
+ html = html.replace(/${lang}`).join(' & ')
+ }));
+ }
+ return formatList(contribItems);
+ }
+ const aboutTemplate = Handlebars.compile(fs.readFileSync(path.join(__dirname, '../src/webpages/about.hbs'), 'utf8'));
+ const aboutData = {
+ title: i18next.t('main:pages.about') + ' - ' + i18next.t('main:project.name'),
+ ogImage: rootAbsUrl + '/img/image.png',
+ absUrl: rootAbsUrl + urlMaps[lang]['/about'],
+ lang: lang,
+ langName: langNames[lang],
+ supportedLangs: aboutLangs.map((lang) => {
+ return {
+ lang: lang,
+ name: langNames[lang],
+ url: rootUrl + urlMaps[lang]['/about'],
+ absUrl: rootAbsUrl + urlMaps[lang]['/about'],
+ };
+ }),
+ imgUrl: rootUrl + '/img',
+ thirdpartyUrl: rootUrl + '/thirdparty',
+ homeUrl: rootUrl + urlMaps[lang]['/home'],
+ aboutUrl: rootUrl + urlMaps[lang]['/about'],
+ galleryUrl: rootUrl + urlMaps[lang]['/gallery'],
+ simulatorUrl: rootUrl + urlMaps[lang]['/simulator'],
+ isHome: false,
+ isGallery: false,
+ isAbout: true,
+ mainAuthors: sortedMainAuthors.map(c => {
+ const name = (c.name === 'Yi-Ting Tu' && lang.startsWith('zh') ? '凃懿庭 Yi-Ting Tu' : c.name);
+ const url = (c.name === 'Yi-Ting Tu') ? 'https://yitingtu.com' : '';
+ return new Handlebars.SafeString(i18next.t('main:meta.parentheses', {
+ main: url ? `${name}` : name,
+ sub: formatContributions(c.contributions)
+ }));
+ }),
+ contributors: sortedContributors.map(c => {
+ return new Handlebars.SafeString(i18next.t('main:meta.parentheses', {
+ main: c.name,
+ sub: formatContributions(c.contributions)
+ }))
+ }),
+ }
+ fs.writeFileSync(path.join(langDir, 'about.html'), aboutTemplate(aboutData));
+ }
+
+ // Create the gallery webpage
+ if (galleryLangs.includes(lang)) {
+ // Create the gallery/ directory
+ const galleryDir = path.join(langDir, 'gallery');
+ fs.mkdirSync(galleryDir, { recursive: true });
+ const rootUrl = lang == 'en' ? '..' : '../..';
+
+ const galleryTemplate = Handlebars.compile(fs.readFileSync(path.join(__dirname, '../src/webpages/gallery.hbs'), 'utf8'));
+ const galleryData = {
+ title: i18next.t('main:pages.gallery') + ' - ' + i18next.t('main:project.name'),
+ ogImage: rootAbsUrl + '/img/image.png',
+ absUrl: rootAbsUrl + urlMaps[lang]['/gallery'],
+ lang: lang,
+ langName: langNames[lang],
+ supportedLangs: galleryLangs.map((lang) => {
+ return {
+ lang: lang,
+ name: langNames[lang],
+ url: rootUrl + urlMaps[lang]['/gallery'],
+ absUrl: rootAbsUrl + urlMaps[lang]['/gallery'],
+ translatedFraction: i18next.t('main:meta.parentheses', {
+ main: '',
+ sub: i18next.t('main:languageDropdown.translatedFraction', {
+ fraction: Math.round(galleryItemsTranslated[lang] * 100) + '%'
+ })
+ }),
+ };
+ }),
+ imgUrl: rootUrl + '/img',
+ thirdpartyUrl: rootUrl + '/thirdparty',
+ homeUrl: rootUrl + urlMaps[lang]['/home'],
+ aboutUrl: rootUrl + urlMaps[lang]['/about'],
+ galleryUrl: rootUrl + urlMaps[lang]['/gallery'],
+ simulatorUrl: rootUrl + urlMaps[lang]['/simulator'],
+ isHome: false,
+ isGallery: true,
+ isAbout: false,
+ categories: galleryList.map(item => {
+ return {
+ id: item.id,
+ title: i18next.t('gallery:galleryPage.categories.' + galleryCategoryToCamelCase[item.id]),
+ items: item.content.map(contentItem => {
+ return {
+ id: contentItem.id,
+ title: i18next.t('gallery:galleryData.' + galleryIDToCamelCase[contentItem.id] + '.title'),
+ url: rootUrl + urlMaps[lang]['/gallery/' + contentItem.id],
+ contributors: contentItem.contributors.join(', '),
+ };
+ }),
+ };
+ }),
+ }
+ fs.writeFileSync(path.join(galleryDir, 'index.html'), galleryTemplate(galleryData));
+
+ // Load the gallery item template
+ const galleryItemTemplate = Handlebars.compile(fs.readFileSync(path.join(__dirname, '../src/webpages/galleryItem.hbs'), 'utf8'));
+
+ // Create the gallery item webpages
+ for (const id of galleryIDs) {
+ if (!galleryItemsLangs[id].includes(lang)) continue;
+ if (!galleryIDInList[id]) continue;
+
+ const galleryItemData = {
+ title: i18next.t('gallery:galleryData.' + galleryIDToCamelCase[id] + '.title') + ' - ' + i18next.t('main:project.name'),
+ ogImage: rootAbsUrl + urlMaps[lang]['/gallery/' + id] + '.jpg',
+ absUrl: rootAbsUrl + urlMaps[lang]['/gallery/' + id],
+ lang: lang,
+ langName: langNames[lang],
+ supportedLangs: galleryItemsLangs[id].map((lang) => {
+ return {
+ lang: lang,
+ name: langNames[lang],
+ url: rootUrl + urlMaps[lang]['/gallery/' + id],
+ absUrl: rootAbsUrl + urlMaps[lang]['/gallery/' + id],
+ };
+ }),
+ imgUrl: rootUrl + '/img',
+ thirdpartyUrl: rootUrl + '/thirdparty',
+ homeUrl: rootUrl + urlMaps[lang]['/home'],
+ aboutUrl: rootUrl + urlMaps[lang]['/about'],
+ galleryUrl: rootUrl + urlMaps[lang]['/gallery'],
+ simulatorUrl: rootUrl + urlMaps[lang]['/simulator'],
+ isHome: false,
+ isGallery: true,
+ isAbout: false,
+ id: id,
+ titleKey: 'gallery:galleryData.' + galleryIDToCamelCase[id] + '.title',
+ descriptionKey: 'gallery:galleryData.' + galleryIDToCamelCase[id] + '.description',
+ idHashUrl: (lang == 'en' ? '' : '..' + routesData[lang] + '/gallery/') + id,
+ contributors: galleryIDContributors[id].join(', '),
+ contributorCount: galleryIDContributors[id].length,
+ }
+ fs.writeFileSync(path.join(galleryDir, id + '.html'), galleryItemTemplate(galleryItemData));
+ }
+ }
+
+ // Create the modules webpage
+ if (modulesLangs.includes(lang)) {
+ // create the modules/ directory
+ const modulesDir = path.join(langDir, 'modules');
+ fs.mkdirSync(modulesDir, { recursive: true });
+ const rootUrl = lang == 'en' ? '..' : '../..';
+
+ // Load the modules template
+ const modulesTemplate = Handlebars.compile(fs.readFileSync(path.join(__dirname, '../src/webpages/modules.hbs'), 'utf8'));
+ const modulePageData = {
+ lang: lang,
+ langName: langNames[lang],
+ imgUrl: rootUrl + '/img',
+ thirdpartyUrl: rootUrl + '/thirdparty',
+ content: moduleList[0].content.map(item => {
+ return {
+ id: item.id,
+ thumbnailUrl: rootUrl + '/modules/' + item.id + '-thumbnail',
+ titleKey: 'modules:moduleData.' + item.id + '.title',
+ contributors: item.contributors.join(', '),
+ descriptionKey: 'modules:moduleData.' + item.id + '.description',
+ controlPointSequenceKeys: moduleControlPointSequenceKeys[item.id].map(key => 'modules:moduleData.' + item.id + '.' + key),
+ parametersKeys: moduleParametersKeys[item.id].map(key => 'modules:moduleData.' + item.id + '.' + key),
+ };
+ }),
+ }
+ fs.writeFileSync(path.join(modulesDir, 'modules.html'), modulesTemplate(modulePageData));
+
+ // Create the module tutorial webpage
+ if (moduleTutorialLangs.includes(lang)) {
+ const moduleTutorialTemplate = Handlebars.compile(fs.readFileSync(path.join(__dirname, '../src/webpages/moduleTutorial.hbs'), 'utf8'));
+
+ const galleryHashUrl = lang == 'en' ? '' : '..' + routesData[lang] + '/gallery/';
+ const moduleTutorialData = {
+ title: i18next.t('modules:moduleTutorial.title') + ' - ' + i18next.t('main:project.name'),
+ ogImage: rootAbsUrl + '/img/image.png',
+ absUrl: rootAbsUrl + urlMaps[lang]['/modules/tutorial'],
+ lang: lang,
+ langName: langNames[lang],
+ supportedLangs: moduleTutorialLangs.map((lang) => {
+ return {
+ lang: lang,
+ name: langNames[lang],
+ url: rootUrl + urlMaps[lang]['/modules/tutorial'],
+ absUrl: rootAbsUrl + urlMaps[lang]['/modules/tutorial'],
+ };
+ }),
+ imgUrl: rootUrl + '/img',
+ thirdpartyUrl: rootUrl + '/thirdparty',
+ homeUrl: rootUrl + urlMaps[lang]['/home'],
+ aboutUrl: rootUrl + urlMaps[lang]['/about'],
+ galleryUrl: rootUrl + urlMaps[lang]['/gallery'],
+ simulatorUrl: rootUrl + urlMaps[lang]['/simulator'],
+ isHome: false,
+ isGallery: false,
+ isAbout: false,
+ moduleExampleBasicsHashUrl: (galleryItemsLangs['module-example-basics'].includes(lang) ? galleryHashUrl : '') + 'module-example-basics',
+ moduleExampleParametersHashUrl: (galleryItemsLangs['module-example-parameters'].includes(lang) ? galleryHashUrl : '') + 'module-example-parameters',
+ moduleExampleControlPointsHashUrl: (galleryItemsLangs['module-example-control-points'].includes(lang) ? galleryHashUrl : '') + 'module-example-control-points',
+ moduleExampleArraysAndConditionalsHashUrl: (galleryItemsLangs['module-example-arrays-and-conditionals'].includes(lang) ? galleryHashUrl : '') + 'module-example-arrays-and-conditionals',
+ moduleExampleCustomEquationHashUrl: (galleryItemsLangs['module-example-custom-equation'].includes(lang) ? galleryHashUrl : '') + 'module-example-custom-equation',
+ moduleExampleShapeParametrizationHashUrl: (galleryItemsLangs['module-example-shape-parametrization'].includes(lang) ? galleryHashUrl : '') + 'module-example-shape-parametrization',
+ }
+ fs.writeFileSync(path.join(modulesDir, 'tutorial.html'), moduleTutorialTemplate(moduleTutorialData));
+ }
+ }
+}
diff --git a/scripts/sortTranslations.mjs b/scripts/sortTranslations.mjs
new file mode 100644
index 00000000..cc2694ba
--- /dev/null
+++ b/scripts/sortTranslations.mjs
@@ -0,0 +1,126 @@
+import fs from 'fs';
+import path from 'path';
+import { fileURLToPath } from 'url';
+
+
+// Convert import.meta.url to a file path and determine the directory
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = path.dirname(__filename);
+
+// Load the gallery data.
+const galleryList = JSON.parse(fs.readFileSync(path.join(__dirname, '../data/galleryList.json'), 'utf8'));
+
+// Load the module data.
+const moduleList = JSON.parse(fs.readFileSync(path.join(__dirname, '../data/moduleList.json'), 'utf8'));
+
+// Load the English strings for the gallery.
+const galleryStrings = JSON.parse(fs.readFileSync(path.join(__dirname, '../locales/en/gallery.json'), 'utf8'));
+
+// Load the English strings for the modules.
+const moduleStrings = JSON.parse(fs.readFileSync(path.join(__dirname, '../locales/en/modules.json'), 'utf8'));
+
+// Sort the gallery strings by the order in the gallery list.
+const galleryData = galleryStrings.galleryData;
+const newGalleryData = { common: galleryData.common };
+for (const category of galleryList) {
+ for (const item of category.content) {
+ const idCamelCase = item.id.toLowerCase().replace(/-([a-z])/g, (g) => g[1].toUpperCase());
+ if (galleryData[idCamelCase]) {
+ newGalleryData[idCamelCase] = galleryData[idCamelCase];
+ }
+ }
+}
+
+// Add the items in galleryData but not in galleryList.
+for (const id in galleryData) {
+ if (!newGalleryData[id]) {
+ newGalleryData[id] = galleryData[id];
+ }
+}
+
+galleryStrings.galleryData = newGalleryData;
+
+// Sort the module strings by the order in the module list.
+const moduleData = moduleStrings.moduleData;
+const newModuleData = {};
+for (const module of moduleList) {
+ const idCamelCase = module.id.toLowerCase().replace(/-([a-z])/g, (g) => g[1].toUpperCase());
+ if (moduleData[idCamelCase]) {
+ newModuleData[idCamelCase] = moduleData[idCamelCase];
+ }
+}
+
+// Add the items in moduleData but not in moduleList.
+for (const id in moduleData) {
+ if (!newModuleData[id]) {
+ newModuleData[id] = moduleData[id];
+ }
+}
+
+moduleStrings.moduleData = newModuleData;
+
+// Write the sorted gallery strings to the gallery file.
+fs.writeFileSync(path.join(__dirname, '../locales/en/gallery.json'), JSON.stringify(galleryStrings, null, 2));
+
+// Write the sorted module strings to the module file.
+fs.writeFileSync(path.join(__dirname, '../locales/en/modules.json'), JSON.stringify(moduleStrings, null, 2));
+
+
+// Sort the keys in other languages according to the English strings.
+// List all existing languages, which are the directories in the /locales directory.
+const langs = fs.readdirSync(path.join(__dirname, '../locales')).filter((file) => !file.includes('.'));
+
+// List all existing namespaces, which are the json files in the /locales/en directory.
+const namespaces = fs.readdirSync(path.join(__dirname, '../locales/en')).filter((file) => file.endsWith('.json'));
+
+// Define the recursive function to sort the keys in the JSON object from the corresponding English object. Some keys are in the format {{key}}_{{suffix}}, which should be treated as a single key {{key}}. The suffix is for grammatical inflection. The relative order of the keys with the same {{key}} should not be changed.
+function sortKeys(obj, enObj) {
+ const newObj = {};
+ const keyRoots = [];
+ for (const key in enObj) {
+ const keyRoot = key.replace(/_.*$/, '');
+ if (!keyRoots.includes(keyRoot)) {
+ keyRoots.push(keyRoot);
+ }
+ }
+
+ for (const keyRoot of keyRoots) {
+ const keys = [];
+ for (const key in obj) {
+ const keyRoot2 = key.replace(/_.*$/, '');
+ if (keyRoot2 === keyRoot) {
+ keys.push(key);
+ }
+ }
+
+ for (const key of keys) {
+ if (typeof obj[key] !== 'object') {
+ newObj[key] = obj[key];
+ } else {
+ newObj[key] = sortKeys(obj[key], enObj[key]);
+ }
+ }
+ }
+
+ return newObj;
+}
+
+// Sort the keys in the JSON files for each language for each namespace.
+for (const namespace of namespaces) {
+ const enObj = JSON.parse(fs.readFileSync(path.join(__dirname, '../locales/en', namespace), 'utf8'));
+ for (const lang of langs) {
+ if (lang === 'en') {
+ continue;
+ }
+
+ // Load the JSON object for the language, which may not exist.
+ const langPath = path.join(__dirname, '../locales', lang, namespace);
+ if (!fs.existsSync(langPath)) {
+ continue;
+ }
+
+ const langObj = JSON.parse(fs.readFileSync(langPath, 'utf8'));
+ const newLangObj = sortKeys(langObj, enObj);
+ fs.writeFileSync(langPath, JSON.stringify(newLangObj, null, 2));
+ }
+}
\ No newline at end of file
diff --git a/scripts/syncTranslations.js b/scripts/syncTranslations.js
deleted file mode 100644
index 486ee1c0..00000000
--- a/scripts/syncTranslations.js
+++ /dev/null
@@ -1,32 +0,0 @@
-const fs = require('fs');
-const path = require('path');
-
-function syncTranslations(localeDir) {
- const enContent = JSON.parse(fs.readFileSync(path.join(localeDir, 'en.json'), 'utf8'));
- const files = fs.readdirSync(localeDir);
-
- files.forEach(file => {
- if (path.extname(file) === '.json' && file !== 'en.json' && file !== 'completeness.json') {
- const content = JSON.parse(fs.readFileSync(path.join(localeDir, file), 'utf8'));
- const newContent = {};
- for (const key in enContent) {
- if (content[key]) {
- if (content[key].incomplete) {
- newContent[key] = { incomplete: true, message: enContent[key].message };
- } else {
- newContent[key] = { message: content[key].message };
- }
- } else {
- newContent[key] = { incomplete: true, message: enContent[key].message };
- }
- }
- fs.writeFileSync(path.join(localeDir, file), JSON.stringify(newContent, null, 2));
- }
- });
-}
-
-
-const localeDir = path.join(__dirname, '../locales');
-
-syncTranslations(localeDir);
-console.log('Translations synchronized.');
diff --git a/src/img/1.png b/src/img/1.png
deleted file mode 100644
index aa85d0b9..00000000
Binary files a/src/img/1.png and /dev/null differ
diff --git a/src/img/1.svg b/src/img/1.svg
deleted file mode 100644
index 75d40089..00000000
--- a/src/img/1.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/img/2.svg b/src/img/2.svg
deleted file mode 100644
index 86162954..00000000
--- a/src/img/2.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/img/3.svg b/src/img/3.svg
deleted file mode 100644
index 0ae2bb2b..00000000
--- a/src/img/3.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/src/img/5.svg b/src/img/5.svg
deleted file mode 100644
index 6f9e3854..00000000
--- a/src/img/5.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/src/img/6.png b/src/img/6.png
deleted file mode 100644
index 51bb61d1..00000000
Binary files a/src/img/6.png and /dev/null differ
diff --git a/src/img/4.svg b/src/img/images-formed-by-two-mirrors.svg
similarity index 100%
rename from src/img/4.svg
rename to src/img/images-formed-by-two-mirrors.svg
diff --git a/src/img/1.jpg b/src/img/spherical-lens-and-mirror.jpg
similarity index 100%
rename from src/img/1.jpg
rename to src/img/spherical-lens-and-mirror.jpg
diff --git a/src/simulator/index.html b/src/simulator/index.html
index 1c641399..f7213c9e 100644
--- a/src/simulator/index.html
+++ b/src/simulator/index.html
@@ -7,7 +7,7 @@
-
+
@@ -29,84 +29,53 @@
- Welcome to Ray Optics Simulation To add an optical component, select a tool and click the blank space. To load an example, please go to the Gallery page.
+