Блог ·
Назва, яку не можна перекласти
Девʼять мов сказали девʼять різних речей про одну конструкцію зовнішнього ключа. Вісім із них були правильними перекладами, і саме в цьому була вся проблема.
Автор: Provibr
Ми публікуємо кожну статтю девʼятьма мовами. Читач, що продирався крізь одну з них, помітив річ, яка на письмі виглядає дрібницею, а полагодити її як слід узяло два раунди: речення про зовнішній ключ казало іншу річ кожною мовою, і всі девʼять були слушними.
Речення пояснює, чому дочірній рядок, який прибирають, не має забирати з собою батьківського очікування. У схемі це є однією конструкцією, і в тієї конструкції є назва.
Вісім правильних перекладів і жодної назви
Ось як та сама конструкція виглядала в каталозі, перш ніж ми її торкнулися.
| Мова | Що казало речення |
|---|---|
| Англійська | set null rather than cascade |
| Нідерландська | op leegmaken en niet op meeverwijderen |
| Німецька | auf null setzen statt auf kaskadieren |
| Іспанська | pone a nulo en lugar de propagar el borrado |
| Французька | mise à nul, pas cascade |
| Італійська | impostata a nullo invece che a cascata |
| Португальська | anula em vez de propagar a eliminação |
| Румунська | pusă pe null și nu în cascadă |
| Українська | ставить null, а не каскадує |
Кожне з них є добрим реченням. Нідерландське, мабуть, є найкращим письмом у переліку; воно пояснює поведінку тому, хто ніколи не бачив схеми. Воно ж є найдальшим від придатності до вжитку, бо читачеві, який хоче звірити, що ми насправді зробили, немає чого набрати.
Двома речами, які ви пишете у схемі Postgres, є SET NULL і CASCADE. Вони не є описами поведінки, вони є її ідентифікаторами, а опис ідентифікатора не є ідентифікатором.
Дефект був у джерелі
Спокусливо вважати це вісьмома помилками перекладу. Це є однією помилкою джерела, і саме таке прочитання зробило виправлення малим.
Англійська казала set null rather than cascade, малими літерами, у плині речення, без жодного позначення. Перекладач, якому це дали, видає прозу, бо саме нею воно і є. Кожен з вісьмох зробив свою роботу правильно на тому матеріалі, який йому дали.
Тож зміною є не вісім виправлень. Це є одним рішенням щодо форми, застосованим девʼять разів, і воно змінює й англійську.
Питання форми відповіли вимірюванням, а не смаком
Має це бути SET NULL великими літерами чи set null малими? Обидва варіанти можна боронити в абстракції, а в абстракції та суперечка саме й не закінчується ніколи.
Тож ми подивилися, що решта корпусу вже робить із SQL усередині зворотних лапок. Трапляється девʼять випадків: WHERE двічі, UPDATE двічі, DROP двічі, голий DELETE, SELECT 1 у перевірці моніторингу і один FOR UPDATE SKIP LOCKED. Усі великими літерами.
Є ще й лексеми малими літерами у зворотних лапках, які мають вигляд контрприкладів і ними не є. unique, що виявляється позначкою в чиємусь API. where, що є іменем константи в JavaScript. null, що є значенням, а не конструкцією.
З цього випливає справжнє правило, і воно не про великі літери. Відмінність лежить між ключовим словом і назвою. Ключове слово мови йде великими літерами, бо саме так ту мову записують; назва, що випадково має такий самий вигляд, тримає той регістр, який їй дав власник. Рішення за самим лише регістром дало б тут правильну відповідь із хибної причини, а десь інде хибну відповідь.
Корпус ще й нагадує, що одна лексема може бути двома назвами. Більшість випадків DELETE у наших статтях зовсім не є SQL, вони є методом HTTP у речах на кшталт DELETE /servers/{id}. Ті самі літери, інша мова, і жодне правило про великі літери їх не розрізняє.
Рішення щодо форми має обсяг, а обсяг має край
Перший раунд полагодив ту статтю, яку читав читач. Перевірка потому показала, що друга стаття робить те саме твердження про схему в одному рядку, без лексеми, тож другий раунд зробив і її.
Це варто сказати прямо, бо рішення щодо форми не є завершеним тоді, коли завершено файл, який його спричинив. Перед тим другим раундом перевірка лексем повідомляла про обидві назви просто як про відсутні в англійській; потому вона зробила двадцять чотири лічби по мовах без жодного відхилення.
Краєм є та частина, що забрала думання. Правило звучить як чи називає це речення конструкцію, а не чи трапляється слово каскад. У тій самій статті, нижче в тому самому абзаці, є речення про каскад із короткоживучої таблиці в довгоживучу. Це є описом наслідку, а не посиланням на конструкцію, і воно лишається прозою в тому вигляді, який мова сказала б природно.
Ми зміряли ту межу по цілому англійському каталогу, а не повірили їй: три формулювання, які правдоподібно могли б називати конструкцію, шукали поза зворотними лапками в кожній англійській статті. Девʼять влучань на ту мить, пʼять із них у статті, про яку йшлося в другому раунді. Чотирма іншими були посилання, яке ставлять у значення null, заголовок розділу про прибирання при видаленні як про стратегію, зауваження, що певний рядок ні в якому каскаді не бере участі, і 404 на запит видалення. Жодне з них конструкції не називає. Після обох раундів лишається сім, а стаття, яку полагодив перший раунд, у переліку не зʼявляється вже зовсім, і це є найдешевшим із можливих підтверджень того, що зміна пішла туди, куди мала.
Що лишається за мовою
Назви є тотожними в усіх девʼятьох файлах. Речення навколо них не є і не має бути.
Німецька досі каже, що зовнішній ключ steht auf, нідерландська staat op, португальська está em. Дієслово, прийменник і порядок слів належать мові. Сталими є лише дві назви, і вони є сталими тому, що є цитатами з Postgres, а не нашими твердженнями.
Механічні частини витримали. Рендерер видає справжній елемент коду навіть тоді, коли лексема сидить усередині жирного тексту, а вона там сидить у нумерованому переліку в кінці кожної статті. Французький нерозривний пробіл перед двокрапкою пережив виправлення, яке переписало конструкцію просто перед ним, а це є саме тим родом речей, що тихо зникають, коли хтось перенабирає рядок.
А різниці є доказом того, що правило було досить вузьким. Три рядки всередину і три рядки геть на файл у першому раунді, один усередину й один геть у другому. Виправлення такого роду, що зачіпає десять рядків, щось переоздобило.
Що ми б записали
- Вісім правильних перекладів усе одно можуть бути дефектом. Правильність речення не є тим самим, що присутність назви.
- Дефект зазвичай є в джерелі. Проза всередину, проза назовні, і перекладачі не є проблемою.
- Назва є питанням форми, а не питанням мови. Її позначають один раз і копіюють усюди.
- Міряйте фірмову форму на корпусі, замість сперечатися про неї в абстракції.
- Відмінність є між ключовим словом і назвою, а не між великими й малими літерами.
- Одна лексема може бути двома назвами. Більшість наших
DELETEє HTTP, а не SQL. - Проводьте межу за тим, чи називає речення конструкцію, а не за тим, чи трапляється слово.
- Перевірте сестринську статтю. Рішення щодо форми має обсяг, і він рідко є одним файлом.
- Лишіть дієслово мові. Полагодити назву не означає полагодити речення.
- Мала різниця є доказом. Три рядки всередину і три геть означають, що правило було вузьким.
Для ясності про те, чим це є: два раунди, перший поклав дві назви в девʼять файлів по три рядки всередину і три рядки геть у кожному, другий зробив один рядок усередину і один геть на другій статті; збірка вмісту породила 886 статей без застережень, а перевірка вмісту знайшла 887 із 887 породжених файлів байт у байт тотожними, набір вебу зеленим на 4604, порівняння лексем на 40 лічбах, а тоді на 24 лічбах без жодного відхилення, порівняння фактів на 296 і 256 без жодного, побайтове сканування чистим, а три сторожі доведено червоними, перш ніж повірити їм зеленим. Прочитання корпусу склало три формулювання по 124 англійських статтях. Не доведено: досі є один читач на переклад, жоден із них не є носієм, і немає браузерної перевірки того, як лексема малюється всіма девʼятьма мовами.
Із платформної роботи над Provibr. Статтею, про яку все це йшлося, є Дочірнє виконання будить батьківське, що девʼять каталогів роблять із набором сталих елементів керування, описано в Шістнадцять тисяч ключів, девʼять мов, а ще один випадок, де переклад був правильним, а форма хибною, описано в Вибір охоплює все речення.