$localized 가 ActionDispatcher 경로에서 항상 ko 를 반환했다. 컨텍스트에 $locale 이 없다는 것은 "로케일이 ko" 라는 뜻이 아니라 "이 경로가 로케일을 넘기지 않는다" 는 뜻인데, context.$locale || 'ko' 로 하드코딩 폴백하고 있었다. 바로 아래 $t 는 engine-v1.38.2 에서 이미 앱 설정 회수 폴백을 갖췄으나 $localized 만 정의 순서상 그 폴백보다 위에 있어 혜택을 받지 못했다. 로케일/templateId 해석을 두 헬퍼 앞으로 끌어올려 공유한다 (engine-v1.52.1). 국가 추가 폼은 이름 입력칸이 ko/en 두 칸으로 고정돼 그 외 언어의 국가명을 넣을 수 없었다. 설치된 언어를 $locales 로 순회해 입력칸을 만들고, 추가 조건도 특정 로케일 대신 "어느 한 언어라도 채워졌는가" 로 바꾼다. 백엔드 StoreEcommerceSettingsRequest 도 name 을 array 로만 요구하므로 계약이 일치한다. 저장 시 입력하지 않은 로케일은 남기지 않는다. 기존 저장본에 박힌 빈 문자열은 업그레이드 스텝이 청소한다 — 부재 로케일은 서버 localize_catalog_field 가 읽기 시점에 언어팩으로 보강하므로, 빈 문자열은 그 보강을 막는 어중간한 상태였다. 동일 결함 재발을 막는 audit 룰(engine-context-locale-hardcoded-fallback)을 함께 추가한다. 수정 전 코드에서 1건 검출, 수정 후 0건을 확인했다.
22 lines
868 B
PHP
22 lines
868 B
PHP
<?php
|
|
|
|
namespace Modules\Sirsoft\Ecommerce\Upgrades;
|
|
|
|
use App\Extension\AbstractUpgradeStep;
|
|
|
|
/**
|
|
* Ecommerce 모듈 1.0.2 업그레이드 스텝
|
|
*
|
|
* 배송가능 국가명(shipping.available_countries[].name)의 저장본에 남아 있는 빈 로케일 키를
|
|
* 제거한다. 구 국가 추가 폼이 한국어/영문 두 칸만 렌더했던 탓에, 한쪽을 비운 채 저장하면
|
|
* 빈 문자열이 저장본에 박혔다. 부재 로케일은 비워 두는 것이 계약이며(언어팩이 읽기 시점에
|
|
* 보강), 빈 문자열은 그 계약을 어기는 어중간한 상태였다.
|
|
*
|
|
* 국가명을 새로 채우지는 않는다 — 언어팩 보강이 그 역할을 한다.
|
|
*
|
|
* 모든 비즈니스 로직은 data/1.0.2/migrations/ 로 격리(AbstractUpgradeStep 규약).
|
|
*
|
|
* @upgrade-path B
|
|
*/
|
|
class Upgrade_1_0_2 extends AbstractUpgradeStep {}
|