Translate the whole repository to English
The kit is going public, so everything a reader sees is now English:
27 model sources, the core vocabulary, meta.ts (titles, descriptions and
every slider label), the viewer UI, all script output, REFERENCE.md and
the READMEs.
Rules applied: only comments, doc comments and human-facing strings were
touched. Identifiers, numbers, logic, registry item ids, part names and
material slot names are unchanged — those are a published contract and
were already English.
Verified rather than assumed: for all 53 changed .ts files the code
skeleton (source with comments stripped and string contents replaced by a
placeholder) is byte-identical before and after. Full gate is green —
typecheck, registry conformance, ~510 model checks, GLB round trip and a
production build.
Also fixed here:
- index.html and viewer.html were missed by the translation pass because
the file list only covered .ts/.md/.css. Both had lang="tr" and Turkish
titles.
- The viewer formatted triangle counts with toLocaleString('tr-TR'), which
prints 15.425 rather than 15,425.
- REFERENCE.md's model table header did not match what
scripts/catalog-table.ts emits, so the next regeneration would have
silently changed it. Aligned to the generator.
- Removed scripts/probe.ts and scripts/zdiag.ts; they were throwaway
diagnostics that got committed by accident.
This commit is contained in:
parent
72f219d087
commit
50c7fc60b9
97 changed files with 4572 additions and 4270 deletions
|
|
@ -1,21 +1,22 @@
|
|||
/**
|
||||
* @medieval-kit/wooden-shovel
|
||||
*
|
||||
* Üçüncü deneme. İlk ikisi başarısızdı ve ikisi de aynı sebepten: ağzı düz
|
||||
* parçalardan kurmaya çalıştım.
|
||||
* Third attempt. The first two failed, and both for the same reason: I tried
|
||||
* to build the blade out of flat pieces.
|
||||
*
|
||||
* 1. deneme — iki kutuyu uç uca koydum. "Kürek şekli" çıktı, kürek çıkmadı.
|
||||
* 2. deneme — üç düz paneli hafifçe döndürüp yan yana dizdim. Paneller kendi
|
||||
* merkezleri etrafında döndüğü için aralarında kademe kaldı; göz onu tek
|
||||
* yüzey değil "üç tahta" olarak okudu.
|
||||
* attempt 1 — two boxes end to end. It came out "shovel-shaped", not a shovel.
|
||||
* attempt 2 — three flat panels, each rotated slightly, lined up side by
|
||||
* side. Because the panels rotated about their own centres, steps were
|
||||
* left between them; the eye read that as "three boards", not one surface.
|
||||
*
|
||||
* Küreği kürek yapan şey ağzın TEK SÜREKLİ İÇBÜKEY YÜZEY olması: toprağı tutan
|
||||
* çukur. `dishedSheetGeometry` tam bunun için yazıldı — enine kesiti kavisli,
|
||||
* genişliği ve kalınlığı boyunca değişen dikişsiz bir levha.
|
||||
* What makes a shovel a shovel is that the blade is ONE CONTINUOUS CONCAVE
|
||||
* SURFACE: the dish that holds the soil. `dishedSheetGeometry` was written for
|
||||
* exactly this — a seamless sheet with a curved cross-section whose width and
|
||||
* thickness change along its length.
|
||||
*
|
||||
* Siluet: sokette dar boyun, %45'te en geniş, uca doğru yumuşak daralma.
|
||||
* Arkada ayak basamağı — gerçek kürekte ağzın üst kenarı kıvrılır, ayakla
|
||||
* bastırmak için.
|
||||
* Silhouette: a narrow neck at the socket, widest at 45%, a soft taper towards
|
||||
* the tip. A foot tread at the back — on a real shovel the top edge of the
|
||||
* blade is folded over, to press down on with the foot.
|
||||
*/
|
||||
import { type BufferGeometry } from 'three'
|
||||
|
||||
|
|
@ -34,13 +35,13 @@ import {
|
|||
export interface WoodenShovelConfig {
|
||||
readonly length: number
|
||||
readonly shaftRadius: number
|
||||
/** Ağzın en geniş yeri (metre). */
|
||||
/** The widest point of the blade (metres). */
|
||||
readonly bladeWidth: number
|
||||
/** Ağız uzunluğu, toplam boyun oranı olarak. */
|
||||
/** Blade length, as a fraction of the total length. */
|
||||
readonly bladeLength: number
|
||||
/** Kepçenin derinliği: kenarların ortaya göre kalkması. 0 = düz levha. */
|
||||
/** Depth of the scoop: how far the edges rise above the middle. 0 = flat sheet. */
|
||||
readonly dish: number
|
||||
/** Ağzın sapa göre eğimi (derece). */
|
||||
/** Tilt of the blade relative to the shaft (degrees). */
|
||||
readonly bladeAngle: number
|
||||
readonly seed: number
|
||||
}
|
||||
|
|
@ -79,13 +80,14 @@ export function createModel(overrides: Partial<WoodenShovelConfig> = {}) {
|
|||
const t = config.length * 0.011
|
||||
const curve = config.bladeWidth * config.dish
|
||||
|
||||
// Enine kesit profili — DÖRDÜNCÜ deneme, bu kez siluet yüzünden.
|
||||
// Cross-section profile — the FOURTH attempt, this time over the silhouette.
|
||||
//
|
||||
// Üçüncü deneme geometrik olarak doğruydu (tek sürekli çukur yüzey) ama
|
||||
// hâlâ kürek gibi durmuyordu: kenarlar ortada şişip uca doğru yumuşakça
|
||||
// kapanıyordu, yani KAŞIK profili. Kürek kaşık değildir: yanları boyunca
|
||||
// neredeyse PARALEL gider, sonra uçta kısa bir pahla biter. Toprağı tutan
|
||||
// şey o paralel kısım; onsuz elde ettiğin şey bir spatula oluyor.
|
||||
// The third attempt was geometrically correct (one continuous dished
|
||||
// surface) but it still did not read as a shovel: the edges bulged in the
|
||||
// middle and closed softly towards the tip, i.e. a SPOON profile. A shovel
|
||||
// is not a spoon: it runs almost PARALLEL along its sides, then ends in a
|
||||
// short chamfer at the tip. What holds the soil is that parallel part;
|
||||
// without it what you get is a spatula.
|
||||
const profile: SheetLevel[] = [
|
||||
{ y: 0, halfWidth: half * 0.24, thickness: t * 1.5, curve: curve * 0.08 },
|
||||
{ y: span * 0.11, halfWidth: half * 0.82, thickness: t * 1.15, curve: curve * 0.4 },
|
||||
|
|
@ -98,9 +100,9 @@ export function createModel(overrides: Partial<WoodenShovelConfig> = {}) {
|
|||
|
||||
const sheet = dishedSheetGeometry(profile, 8, steelTint(random, -0.04), steelTint(random, 0.04))
|
||||
|
||||
// Ayak basamağı: ağzın üst kenarındaki kıvrım, çukurun ARKASINDA. Omuz
|
||||
// hizasında ve GENİŞ olmalı — üstüne basılan yer burası, dar bir çıkıntı
|
||||
// hem işlevsiz hem de siluette hiç görünmüyor.
|
||||
// Foot tread: the fold at the top edge of the blade, BEHIND the dish. It
|
||||
// must sit at shoulder height and be WIDE — this is where you step, and a
|
||||
// narrow ledge is both useless and invisible in the silhouette.
|
||||
const tread = chamferedBoxGeometry(
|
||||
[config.bladeWidth * 0.78, t * 2.4],
|
||||
[config.bladeWidth * 0.7, t * 1.9],
|
||||
|
|
@ -112,10 +114,11 @@ export function createModel(overrides: Partial<WoodenShovelConfig> = {}) {
|
|||
tread.rotateX(0.42)
|
||||
tread.translate(0, span * 0.12, -t * 1.7)
|
||||
|
||||
// Sırt kayışı: soketten çıkıp ağzın ARKASINDA yukarı uzanan dövme demir.
|
||||
// Küreği kürek yapan ikinci şey bu. Onsuz ağız, sapın ucuna yapıştırılmış
|
||||
// bir levha gibi duruyor; gerçek kürekte ağzı taşıyan şey o kayıştır ve
|
||||
// gözün "bu nasıl duruyor" sorusunu cevaplayan da odur.
|
||||
// Back strap: forged iron leaving the socket and running up BEHIND the
|
||||
// blade. This is the second thing that makes a shovel a shovel. Without it
|
||||
// the blade looks like a sheet glued to the end of the shaft; on a real
|
||||
// shovel the strap is what carries the blade, and it is also what answers
|
||||
// the eye's question of "how is this held on".
|
||||
const strap = chamferedBoxGeometry(
|
||||
[config.shaftRadius * 2.3, t * 2.2],
|
||||
[config.shaftRadius * 1.1, t * 1.4],
|
||||
|
|
@ -126,9 +129,9 @@ export function createModel(overrides: Partial<WoodenShovelConfig> = {}) {
|
|||
)
|
||||
|
||||
const blade: BufferGeometry = mergeColoured([sheet, tread])
|
||||
// İkisi de AYNI dönüşümden geçmeli, yoksa kayış ağzın arkasında kalmaz.
|
||||
// Both must take the SAME transform, or the strap won't stay behind the blade.
|
||||
for (const piece of [blade, strap]) {
|
||||
// Ağız sapla tam hizada değil, hafifçe öne eğik: toprağa dalması için.
|
||||
// The blade is tilted slightly forward of the shaft line, so it bites the soil.
|
||||
piece.rotateX(-(config.bladeAngle * Math.PI) / 180)
|
||||
piece.translate(0, shaft.top - span * 0.06, 0)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue