Symfony: path() ๋‚˜๋ญ‡ ๊ฐ€์ง€ ๊ธฐ๋Šฅ ๋‚ด์—์„œ ์ž๋™์œผ๋กœ ๋กœ์ผ€์ผ์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2011๋…„ 07์›” 15์ผ  ยท  31์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: symfony/symfony

๊ฐœ์ธ์ ์œผ๋กœ ์žฌ์ •์˜ํ•  ๋กœ์ผ€์ผ๋งŒ ์ง€์ •ํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๊ฒฝ๋กœ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ:

/์—ฐ๋ฝํ•˜๋‹ค
/์— ๋Œ€ํ•œ

/fr/์—ฐ๋ฝ์ฒ˜
/fr/์•ฝ

/fr/about์— ๊ฒฝ๋กœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

{{ ๊ฒฝ๋กœ('์—ฐ๋ฝ์ฒ˜') }}

/fr/contact ๋Œ€์‹  ๊ธฐ๋ณธ์ ์œผ๋กœ /contact์— ๋Œ€ํ•œ ๊ฒฝ๋กœ๋ฅผ ๋งŒ๋“œ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋งํฌ๋ณ„๋กœ ๊ธฐ๋ณธ ๋™์ž‘์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

{{ ๊ฒฝ๋กœ('์ฃผ์†Œ', {'_locale': app.request.attributes.get('_locale')}) }}

์ด๋ฅผ ์ˆ˜์ •ํ•  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ฒซ ๋ฒˆ์งธ @damien-roche ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์€ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?
๋‚˜๋Š” ๋˜‘๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ  ๊นจ๋—ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค

๋ชจ๋“  31 ๋Œ“๊ธ€

๋กœ์ผ€์ผ์€ ์ž๋™์œผ๋กœ ์„ค์ •๋˜์ง€๋งŒ, Routing Listener๊ฐ€ Routercontext ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์ „์— ์„ค์ •ํ•œ ๊ฒฝ์šฐ ํŠน์ • ์กฐ๊ฑด์—์„œ๋งŒ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

@Fabien :

2011๋…„ 7์›” 14์ผ ๋ชฉ์š”์ผ 23:57:58 -0700
ivrock์˜ [email protected] ์€ ๋‹ค์Œ

๊ฐœ์ธ์ ์œผ๋กœ ์žฌ์ •์˜ํ•  ๋กœ์ผ€์ผ๋งŒ ์ง€์ •ํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๊ฒฝ๋กœ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ:

/์—ฐ๋ฝํ•˜๋‹ค
/์— ๋Œ€ํ•œ

/fr/์—ฐ๋ฝ์ฒ˜
/fr/์•ฝ

/fr/about์— ๊ฒฝ๋กœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

{{ ๊ฒฝ๋กœ('์—ฐ๋ฝ์ฒ˜') }}

/fr/contact ๋Œ€์‹  ๊ธฐ๋ณธ์ ์œผ๋กœ /contact์— ๋Œ€ํ•œ ๊ฒฝ๋กœ๋ฅผ ๋งŒ๋“œ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋งํฌ๋ณ„๋กœ ๊ธฐ๋ณธ ๋™์ž‘์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

{{ ๊ฒฝ๋กœ('์ฃผ์†Œ', {'_locale': app.request.attributes.get('_locale')}) }}

์ด๋ฅผ ์ˆ˜์ •ํ•  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/symfony/symfony/issues/1700

ํ ..

์ด ์ƒํ™ฉ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์˜์–ด๋กœ ๋œ ๊ธฐ๋ณธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์žˆ์œผ๋ฏ€๋กœ /en/ ์ ‘๋‘์–ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒฝ๋กœ์—๋Š” ์ž๋™์œผ๋กœ /en/ ์ ‘๋‘์‚ฌ๊ฐ€ ์‚ฝ์ž…๋˜์–ด URL ๊ตฌ์กฐ์™€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋กœ์ผ€์ผ์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์œผ๋ฉด ๊ฒฝ๋กœ์— ์ ‘๋‘์‚ฌ๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋„๋ก ์ด๋ฅผ ์šฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@ivrock : ์ด๊ฒƒ์€ ์ •ํ™•ํžˆ ๋‚ด๊ฐ€ ์ฐพ๊ณ  ์žˆ๋Š” ๋™์ž‘์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋กœ์ผ€์ผ์ด ์žˆ๋Š” ๊ฒฝ๋กœ์˜ URL์—๋Š” ๋กœ์ผ€์ผ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ „ํ˜€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ด๋ฉ”์ผ ์•Œ๋ฆผ, ์ฑ…๊ฐˆํ”ผ ๋“ฑ์˜ ๋ชจ๋“  ์ด์ „ URL์„ ์†์ƒ์‹œํ‚ค์ง€ ์•Š๊ณ  ๋กœ์ผ€์ผ ์ง€์›์„ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ฒ˜์Œ์— ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. IRC์—์„œ ์ด์— ๋Œ€ํ•ด ์งˆ๋ฌธํ•  ๋•Œ ์ด๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•  ๊ฒƒ์ด๋ผ๊ณ  ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์œ ๊ฐ€ ๊ถ๊ธˆ).

@beberlei : @fabpot ๋ง์”€์ด์‹œ์ฃ  ? ;)

@craue :

  1. ์ฒ˜์Œ๋ถ€ํ„ฐ ๋กœ์ผ€์ผ ๊ฒฝ๋กœ ์‚ฌ์šฉ
  2. ๋Œ€์‹  ๋กœ์ผ€์ผ ์„ธ์…˜์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค

๊ทธ๋“ค์€ ๊ทธ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์€ ์ด์œ ์— ๋Œ€ํ•ด ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๊นŒ?

@ivrock : ์˜ˆ, ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์˜ˆ๋ฅผ ๋“ค์–ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์œผ๋กœ ๋กœ์ผ€์ผ์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ URL์—์„œ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ˆจ๊ธฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์˜๊ฒฌ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ http://pastebin.com/gavYkF0C๋ฅผ ์ธ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

foo:
  pattern: /foo/{bar}/{car}
  defaults:
    bar: barValue
    car: carValue

์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๊ฒฝ๋กœ ์ƒ์„ฑ:

$this->get('router')->generate('foo', array('bar' => 'barValue', 'car' => 'somethingElse');

URL์—์„œ ๊ธฐ๋ณธ๊ฐ’์ด ์ˆจ๊ฒจ์ ธ ์žˆ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ 'barValue'๋Š” ๊ธฐ๋ณธ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— URL์— ์ถ”๊ฐ€๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ƒ์„ฑ๋œ URL์€ /foo/somethingElse๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์ด์ œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ํ•ด๋‹น ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๊ณ  /foo/somethingElse๋ฅผ ์š”์ฒญํ–ˆ๊ณ  foo ๊ฒฝ๋กœ์™€ ์ผ์น˜ํ•˜๋ฉด /foo/somethingElse/carValue์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

๋ฐ”์™€ ์ž๋™์ฐจ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ˜ผํ•ฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค!

ํ•˜์ง€๋งŒ, ๊ทธ๊ฒƒ์€ ์ ˆ๋ฐ˜์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋ญ‡๊ฐ€์ง€ ํ…œํ”Œ๋ฆฟ์—์„œ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? (์›๋ณธ ๋ฉ”์‹œ์ง€ ์ฐธ์กฐ). ํ˜„์žฌ ๋กœ์ผ€์ผ์ธ ๊ฒฝ์šฐ ๊ธฐ๋ณธ ๋กœ์ผ€์ผ์„ ์ž๋™์œผ๋กœ ํฌํ•จํ•˜๋„๋ก path() ํ•จ์ˆ˜๋ฅผ ํ™•์žฅํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@ivrock : ๋ฌผ๋ก  ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค ( https://github.com/craue/TwigExtensionsBundle/blob/92ef57f757a24493314c0029d3e21c6ee5563d05/Twig/Extension/ChangeLanguageExtension.php#L223 ์ฐธ์กฐ) ์†”๋ฃจ์…˜์€ ;

@ivrock : ์ดˆ๊ธฐ ์„ค๋ช…์— ๋”ฐ๋ผ ๋ชจ๋“  ๊ฒฝ๋กœ๋ฅผ ๋‘ ๋ฒˆ ์ •์˜ํ•ฉ๋‹ˆ๊นŒ? ํ•œํŽธ์œผ๋กœ๋Š” ๋กœ์ผ€์ผ ์ ‘๋‘์‚ฌ(๊ธฐ๋ณธ ๋กœ์ผ€์ผ์šฉ)๊ฐ€ ์—†๊ณ  ๋‹ค๋ฅธ ํ•œํŽธ์œผ๋กœ๋Š” ๋กœ์ผ€์ผ ์ ‘๋‘์‚ฌ๊ฐ€ ๋ถ™์Šต๋‹ˆ๊นŒ? ๋ผ์šฐํŒ… ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋‘ ๋ฒˆ ๊ฐ€์ ธ์™€์„œ ๋ฌผ๋ก  ์ •์˜๋œ ๊ฒฝ๋กœ ์ด๋ฆ„์ด ์ค‘๋ณต๋˜๋„๋ก ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. _์ข‹์€_ ์†”๋ฃจ์…˜์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š”. ์•„๋‹ˆ, ๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ ํ”ผํ•˜๋ ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ‘์ž๊ธฐ 10๊ฐœ ์–ธ์–ด๊ฐ€ ์žˆ์œผ๋ฉด ์ˆ˜๋ฐฑ ๊ฐœ์˜ ๊ฒฝ๋กœ๊ฐ€ ์žˆ๋Š”๋ฐ 10๊ฐœ๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ช‡ ๊ฐ€์ง€ ์–ธ์–ด ๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด ๊ดœ์ฐฎ์€ ์ƒ๊ฐ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ.

๋‚˜๋Š” ํ˜„์žฌ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค :

app.com/kr/contact
app.com/ko/contact

์—ฌ๊ธฐ์„œ /en/์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋ณธ ๋กœ์ผ€์ผ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๊ฒฝ๋กœ๋ฅผ ์›ํ•œ๋‹ค

app.com/contact

์ž๋™์œผ๋กœ /en/์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๋กœ์ผ€์ผ์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋ฉฐ ์ด ๊ธฐ๋ณธ ๋กœ์ผ€์ผ์— ์žˆ์„ ๋•Œ ๋‚˜๋ญ‡๊ฐ€์ง€ ํ…œํ”Œ๋ฆฟ์— ๋Œ€ํ•ด ์ƒ์„ฑ๋œ ๋ชจ๋“  path() ๊ฒฝ๋กœ์—๋Š” ํ•ด๋‹น ๋กœ์ผ€์ผ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์€ ํ›Œ๋ฅญํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ฐพ๊ณ  ์žˆ๋Š” ์ถœ๋ ฅ์„ ์ •ํ™•ํžˆ ๋ช…ํ™•ํžˆ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ฐ€์ง€๊ณ ์žˆ๋‹ค:

ํŒจํ„ด: /{๋กœ์ผ€์ผ}/์—ฐ๋ฝ์ฒ˜

๋‚˜๋Š” ๊ฒฝ๋กœ๋ฅผ ์›ํ•œ๋‹ค:

app.com/contact(๊ตฌ์„ฑ ํŒŒ์ผ์— ์„ค์ •๋œ ๊ธฐ๋ณธ ๋กœ์ผ€์ผ)
app.com/kr/contact

์ด์ œ app.com/contact๋ฅผ ๋ณผ ๋•Œ ๋ชจ๋“  ๊ฒฝ๋กœ๊ฐ€ /pagename์œผ๋กœ ๊ธฐ๋ณธ ์„ค์ •๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— twig์˜ path()์— /{locale}/pagename์ด ํฌํ•จ๋˜์ง€ ์•Š๋„๋ก ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ 2๊ฐ€์ง€ ์žฅ์• ๋ฌผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ๋•Œ: /{locale}/contact, /contact๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค
  2. path()๋Š” ํ•ญ์ƒ {locale}์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

/contact๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋‘˜ ์ด์ƒ์˜ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋” ํฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. path()์—๋Š” ๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ ์ด์ œ ๋กœ์ผ€์ผ์— ๋”ฐ๋ผ 2๊ฐœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฝ๋กœ('์—ฐ๋ฝ์ฒ˜')
๊ฒฝ๋กœ('contactIN')

๋ชจ๋“  ๊ฒƒ์ด ๋งค์šฐ ์ง€์ €๋ถ„ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. path()์—์„œ ๊ธฐ๋ณธ ๋กœ์ผ€์ผ์„ ์„ ํƒํ•œ ๊ฒฝ์šฐ ๋‚˜๋ญ‡๊ฐ€์ง€๋ฅผ ํ™•์žฅํ•˜์—ฌ ๋กœ์ผ€์ผ์„ ์ œ๊ฑฐํ•˜๋”๋ผ๋„ ์—ฌ์ „ํžˆ ๊ฒฝ๋กœ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋‹น์žฅ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์•„์ด๋””์–ด์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

@ivrock : ๋‹น์‹ ์€ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค "๋งˆ๋ฒ•"(๊ฐ€์ง€) ๋งค๊ฐœ ๋ณ€์ˆ˜ {_locale} ๋Œ€์‹  {locale} ์ •ํ™•ํžˆ ๋‘ ๋ฒˆ ๋‚˜๋Š” ๊ฐ ๋กœ์ผ€์ผ์ด ์•„๋‹Œ ํ•œ ๊ฐ€์ง€๋ฅผ ์–ธ๊ธ‰ ํ•œ ๋ชจ๋“  ๊ฒฝ๋กœ๋ฅผ ์ •์˜ํ•ด์•ผํ•˜๋Š” ์ˆ˜๋‹จ . ๊ทธ๋Ÿฌ๋‚˜ ๊ท€ํ•˜๊ฐ€ ์„ค๋ช…ํ•œ ๋ฌธ์ œ๊ฐ€ ์ง€์†๋˜๋ฉฐ ํ˜„์žฌ ์ด์— ๋Œ€ํ•œ ๊นจ๋—ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ๋Š”์ง€ ์˜์‹ฌ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ฐจ์ด๊ฐ€ ์žˆ๋Š”์ง€ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค. ์ €๋Š” {_locale}์„ ์‚ฌ์šฉํ•˜๊ณ  ์˜ˆ๋ฅผ ๋“ค์–ด {locale}์„(๋ฅผ) ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ, ์Šฌํ”„๊ฒŒ๋„ ๋ฌธ์ œ๊ฐ€ ์—ฌ์ „ํžˆ ์ง€์†๋ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”,

์›ํ•˜๋Š” ๊ฒƒ์„ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ด ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ธฐ๋ณธ๊ฐ’๊ณผ ํ•จ๊ป˜ {_locale} ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์„์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ YAML ๋ผ์šฐํŒ… ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๋ช‡ ๊ฐ€์ง€ ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€์›ํ•˜๊ณ  ์‹ถ์€ ๋‹ค์Œ ๊ฒฝ๋กœ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

app.com/ => (์˜์–ด์—ฌ์•ผ ํ•จ)
app.com/en => (์˜์–ด์—ฌ์•ผ ํ•จ)
app.com/fr => (๋ถˆ์–ด์—ฌ์•ผ ํ•จ)

๋‚ด ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋‹ค์Œ ์ฃผ์„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

/**
 * @Route("/{_locale}", name = "index", defaults = {"_locale" = "en"})
 */

์ง€๊ธˆ์œผ๋กœ์„œ๋Š” ๋ผ์šฐํŒ… ์ •์˜์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์š”๊ตฌ์‚ฌํ•ญ์„ ์„ค์ •ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ƒˆ ๋กœ์ผ€์ผ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๋งŽ์€ ์š”๊ตฌ์‚ฌํ•ญ ์ ˆ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ defaults ์ ˆ์—๋„ ํ•ด๋‹น๋˜์ง€๋งŒ ๊ธฐ๋ณธ ๋กœ์ผ€์ผ์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์ƒˆ ๋กœ์ผ€์ผ์„ ์ถ”๊ฐ€ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์ ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์ง€๊ธˆ์€ app.com/es ๋ฅผ ๋กœ๋“œํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋‚ด ๊ธฐ๋ณธ ๋กœ์ผ€์ผ์ธ ์˜์–ด๋กœ ํŽ˜์ด์ง€๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

Twig์—์„œ {{ path('index') }} ํ•˜๋ฉด ํ˜„์žฌ {_locale} ๊ฐ€ en ์ด๊ณ  app.com/fr ๊ฐ€ ์ถœ๋ ฅ๋˜๋ฉด app.com/ url์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ {_locale} ๊ฐ€ fr . ๊ธฐ๋ณธ ์„ค์ •์ด ์—†๋Š” ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ์ด ์ž‘์—… ์ด๋ฒคํŠธ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด

/**
 * @Route("/{_locale}/event/create", name = "event_create")
 */

Twig, {{ path('event_create') }} ์—์„œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉด {_locale} ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํ˜„์žฌ ๊ฐ’๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ถœ๋ ฅ์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

en => app.com/en/event/create
fr => app.com/fr/event/create

์–ด๋””์—์„œ๋‚˜ ๋กœ์ผ€์ผ์„ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋ฌธ์•ˆ ์ธ์‚ฌ,
๋งคํŠธ

๋‚˜๋Š” ๋˜ํ•œ ์ด๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์—์„œ ๋‚ด ์†”๋ฃจ์…˜์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
http://github.com/schmittjoh/JMSI18nRoutingBundle

๊ธฐ๋ณธ์ ์œผ๋กœ ํ˜„์ง€ํ™”๋œ ๊ฒฝ๋กœ ์—†์ด ์‹œ์ž‘ํ•œ ๋‹ค์Œ ํ•„์š”์— ๋”ฐ๋ผ ๊ฒฝ๋กœ ๋˜๋Š” ์ผ๋ถ€ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ๋ฒˆ์—ญ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์‹œ๋ฉด Symfony 2.1์— ์ผ๋ถ€ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@schmittjoh : Thx, ์ด๊ฒƒ์€ ์ •๋ง ํฅ๋ฏธ๋กœ์šด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•ž์œผ๋กœ ๋ฉฐ์น  ๋™์•ˆ ๊ทธ๊ฒƒ์„๋ณด๊ณ  ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ๋‚˜์˜ ํ”ผ๋“œ๋ฐฑ์„ ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋ฒˆ๋“ค๊ณผ Symfony์— ๋Œ€ํ•œ ์ž‘์—…์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋ฌธ์•ˆ ์ธ์‚ฌ,
๋งคํŠธ

์•ˆ๋…•ํ•˜์„ธ์š”, ์•„๋งˆ๋„ ์ด ๋งํฌ๊ฐ€ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค:
http://stackoverflow.com/questions/5800675/symfony2-locale-in-route/5803144#5803144

{{ path('address', {'_locale': app.request.attributes.get('_locale')}) }}

๋งˆ์Šคํ„ฐ์—์„œ @beberlei ๊ฐ€ ์„ค๋ช…ํ•œ ๋ฌธ์ œ๊ฐ€ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ์ด ์ˆ˜์ • ์‚ฌํ•ญ์„ 2.0์œผ๋กœ ๋ฐฑํฌํŠธํ•  ์ˆ˜ ์—†์Œ). ๋”ฐ๋ผ์„œ _locale ์ธ์ˆ˜๋Š” ์ด์ œ ํ•ญ์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ˜„์žฌ ๋กœ์ผ€์ผ์— ๋Œ€ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋ช…์‹œ์ ์œผ๋กœ ์ „๋‹ฌํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ๋กœ์„œ๋Š” ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

PTCIdentialsBundle:
    resource: "@PTCIdentialsBundle/Controller/"
    type: annotation
    prefix: /{_locale}

๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์— defaults: { _locale: en } ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜๋‚˜์˜ ์ปจํŠธ๋กค๋Ÿฌ์— ๋Œ€ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ •์˜ํ•  ๋•Œ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

contact:
    pattern:   /{_locale}/contact
    defaults:  { _controller: AcmeDemoBundle:Contact:index, _locale: en }
    requirements:
        _locale: en|fr|de

๋”ฐ๋ผ์„œ ์‚ฌ์ดํŠธ์˜ ๋ฃจํŠธ์— ์•ก์„ธ์Šคํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฆฌ๋””๋ ‰์…˜์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

root:
    pattern: /
    defaults:
        _controller: FrameworkBundle:Redirect:redirect
        route: homepage
        permanent: true # this is for 301

๊ทธ๋ฆฌ๊ณ  ๋‚ด ๋ชจ๋“  ๊ฒฝ๋กœ์— ๋Œ€ํ•ด ๊ธฐ๋ณธ ๋กœ์ผ€์ผ์— ๋Œ€ํ•ด์„œ๋„ ํ•ญ์ƒ ๋กœ์ผ€์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

en => http://my-app.com/en (๊ธฐ๋ณธ ๋กœ์ผ€์ผ)
fr => http://my-app.com/fr

ํŠน์ • ์ปจํŠธ๋กค๋Ÿฌ์— ์ง์ ‘ {_locale}์„ ์ถ”๊ฐ€ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋™์ž‘์„ ํ•˜๋Š” ๊ฒƒ์ด ๋” ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

/**
 * @Route("/{_locale}", name = "homepage", defaults = {"_locale" = "en"})
 */

@raziel057 Sf 2.2 ์‚ฌ์šฉ์‹œ import์‹œ ๊ธฐ๋ณธ๊ฐ’ ๊ฐ€๋Šฅ

๋‚˜๋Š” Symfony(v 2.2.1)์˜ ๋งˆ์ง€๋ง‰ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ defaults ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์“ธ ๋•Œ ์•„๋ฌด ํšจ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

PTCIdentialsBundle:
    resource: "@PTCIdentialsBundle/Controller/"
    type: annotation
    prefix: /{_locale}
    defaults: { _locale: en }

http://my-app.com/ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ router:debug ๋ช…๋ น์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด defaults ๊ฐ€ ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค.

> php app/console router:debug welcome_index
[router] Route "welcome_index"
Name         welcome_index
Path         /{_locale}/
Host         ANY
Scheme       ANY
Method       ANY
Class        Symfony\Component\Routing\Route
Defaults     _controller: PTC\IdentialsBundle\Controller\WelcomeController::indexAction
             _locale: en
Requirements _locale: en|fr
Options      compiler_class: Symfony\Component\Routing\RouteCompiler
Path-Regex   #^/(?P<_locale>en|fr)/$#s

๊ทธ๋Ÿฌ๋‚˜ http://my-app.com/ ์— ์•ก์„ธ์Šคํ•˜๋ ค๊ณ  ํ•˜๋ฉด "NotFoundHttpException"์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

@ raziel057 ๋‚˜๋Š” ํ›„ํ–‰ "/"์„ ์ œ๊ฑฐํ•˜๊ณ  ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

@henrikbjorn ์ด๋ฏธ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ๊ฒฝ๋กœ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ:

> php app/console router:debug login
[router] Route "login"
Name         login
Path         /{_locale}/secured/login
Host         ANY
Scheme       ANY
Method       ANY
Class        Symfony\Component\Routing\Route
Defaults     _controller: PTC\IdentialsBundle\Controller\AuthenticationController::indexAction
Requirements _locale: en|fr
Options      compiler_class: Symfony\Component\Routing\RouteCompiler
Path-Regex   #^/(?P<_locale>en|fr)/secured/login$#s

{_locale}/ ๋Š” ๋‹ค์Œ์„ ์œ„ํ•ด ๊ธฐ๋ณธ ์–ธ์–ด๋กœ ์•ก์„ธ์Šคํ•  ๋•Œ ๋นˆ ๋ฌธ์ž์—ด๋กœ ๋Œ€์ฒด๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
http://my-app.com/secured/login in ko
http://my-app.com/fr/secured/login (ํ”„๋ž‘์Šค์–ด)

@raziel057 ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ #4322๋ฅผ ์น˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. /{_locale}/ ์˜ ๋กœ์ผ€์ผ์€ ๊ธฐ๋ณธ๊ฐ’์ด ์žˆ์–ด๋„ ์„ ํƒ ์‚ฌํ•ญ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ / ๋Š” ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ •๊ทœ์‹์˜ ๋„์›€์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

{_locale}/์€ ๋‹ค์Œ์„ ํฌํ•จํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ๋ณธ ์–ธ์–ด๋กœ ์•ก์„ธ์Šคํ•  ๋•Œ ๋นˆ ๋ฌธ์ž์—ด๋กœ ๋Œ€์ฒด๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
http://my-app.com/secured/login in ko
http://my-app.com/fr/secured/login in fr

๊ฐ™์€ ์ด์œ : ์ค‘๊ฐ„์— ์„ ํƒ์  ์ž๋ฆฌ ํ‘œ์‹œ์ž๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. #7051์ด ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

@ํ† ๋น„์˜จ ๋„ค . ์„ค๋ช…ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. @maoueh ๋‹˜์˜ ๋Œ“๊ธ€์„ ๋ณด๋‹ˆ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

Symfony์˜ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์•„์‹ญ๋‹ˆ๊นŒ?
http://symfony.com/doc/current/book/forms.html <- "en"์˜ ๋‚ด์šฉ
http://symfony.com/fr/doc/current/book/forms.html <- "fr"์˜ ๋‚ด์šฉ

์ด ๋ฌถ์Œ์ธ๊ฐ€์š”? http://github.com/schmittjoh/JMSI18nRoutingBundle

๋ชจ๋ฅด๊ฒ ์–ด. ๊ทธ๋Ÿฌ๋‚˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ๋กœ์ผ€์ผ์ด ์žˆ๋Š” ๊ฒฝ๋กœ์™€ ์—†๋Š” ๊ฒฝ๋กœ์˜ ๋‘ ๊ฐ€์ง€๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฝ๋กœ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ ์ ˆํ•œ ๊ฒฝ๋กœ๋ฅผ ์„ ํƒํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ด ๊ตฌ์„ฑ์œผ๋กœ http://github.com/schmittjoh/JMSI18nRoutingBundle ์„ ์‚ฌ์šฉํ•  ๋•Œ:

jms_i18n_routing:
    default_locale: en
    locales: [en, fr]
    strategy: prefix_except_default

php app/console router:debug ์‹คํ–‰ํ•  ๋•Œ ๋‹ค์Œ ๊ฒฝ๋กœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

en__RG__welcome_index                  ANY    ANY    ANY  /
fr__RG__welcome_index                  ANY    ANY    ANY  /fr/
en__RG__view_about                     ANY    ANY    ANY  /about
fr__RG__view_about                     ANY    ANY    ANY  /fr/about
en__RG__view_contact                   ANY    ANY    ANY  /contact
fr__RG__view_contact                   ANY    ANY    ANY  /fr/contact
...

๋”ฐ๋ผ์„œ ๊ฒฝ๋กœ๊ฐ€ ์ž˜ ๋ณต์ œ๋˜์—ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ http://my-app.com/ ์— ์•ก์„ธ์Šคํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

FatalErrorException: ์˜ค๋ฅ˜: ์ตœ๋Œ€ ํ•จ์ˆ˜ ์ค‘์ฒฉ ์ˆ˜์ค€ '100'์— ๋„๋‹ฌํ•˜์—ฌ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค! /home/lallement/workspace/Identials/vendor/symfony/symfony/src/Symfony/Component/Routing/Matcher/Dumper/DumperCollection.php ๋ผ์ธ 54

in /home/lallement/workspace/Identials/vendor/symfony/symfony/src/Symfony/Component/Routing/Matcher/Dumper/DumperCollection.php line 54
at ErrorHandler??handleFatal() in /home/lallement/workspace/Identials/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Debug/ErrorHandler.php line 0
at DumperCollection??add() in /home/lallement/workspace/Identials/vendor/symfony/symfony/src/Symfony/Component/Routing/Matcher/Dumper/DumperPrefixCollection.php line 70
at DumperPrefixCollection??addPrefixRoute() in /home/lallement/workspace/Identials/vendor/symfony/symfony/src/Symfony/Component/Routing/Matcher/Dumper/DumperPrefixCollection.php line 72

๊ฒ€์ƒ‰์„ ์ด์šฉํ•ด์ฃผ์„ธ์š”.

@Tobion ๋„ค ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค ;). xdebug์˜ max_nesting_level ๊ฐ€ ๋‚ฎ์Šต๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ @damien-roche ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์€ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?
๋‚˜๋Š” ๋˜‘๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ  ๊นจ๋—ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค

์ด๊ฒƒ์ด ๋‹น์‹ ์ด ์ฐพ๊ณ ์žˆ๋Š” ๊ฒƒ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ช‡ ๋…„ ํ›„์— ๊ทธ๋ ‡๊ฒŒ ์œ ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค ... ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์— ์„ค๋ช… ๋œ ์ƒํ™ฉ๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š” ๋‚ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ ํ•œ ์ž‘์—…์ด ์žˆ์Šต๋‹ˆ๋‹ค. @damien-roche .

์šฐ์„  ์ €๋Š” Symfony์˜ 5.1.2 ๋ฒ„์ „์œผ๋กœ ์ž‘์—…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ๋‚ด translation.yaml ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค:

framework:
    default_locale: fr
    translator:
        default_path: '%kernel.project_dir%/translations'
        fallbacks:
            - en
        enabled_locales: ['fr', 'en']

๋‚˜๋Š” ์ง€์›๋˜๋Š” ๋กœ์ผ€์ผ์„ ์ •์˜ํ•˜๊ณ  ์ •์˜ ๋œ FR ์— ๋Œ€์ฒด์™€ ๊ธฐ๋ณธ ํ•˜๋‚˜๋กœ EN . ์ด ๊ตฌ์„ฑ์€ ๋ผ์šฐํŒ… ์งˆ๋ฌธ์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ ๋ฒˆ์—ญ ๊ด€๋ฆฌ๋„ ๋‹ค๊ตญ์–ด ์›น์‚ฌ์ดํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์†”๋ฃจ์…˜์˜ ์ผ๋ถ€์ด๋ฏ€๋กœ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

์ •์˜๋œ ๋ชจ๋“  ์ฃผ์„์ด ๋‹ค๊ตญ์–ด ์ง€์›์„ ์œ„ํ•ด ๋ณ€๊ฒฝ๋  ํ•„์š”๊ฐ€ ์—†๋„๋ก ๊ฒฝ๋กœ ๊ตฌ์„ฑ์„ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ routes/annotations.yaml ์—์„œ ์ง€์›๋˜๋Š” ๊ฐ ์–ธ์–ด์— ๋Œ€ํ•œ ์ ‘๋‘์‚ฌ๋ฅผ ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

controllers:
    resource: ../../src/Controller/
    type: annotation
    defaults:
        _locale: '%kernel.default_locale%'
    requirements:
        _locale: fr|en
    prefix:
        fr: ''
        en: '/en'

๋‹ค์Œ์€ ๋ชจ๋“  ๊ฒฝ๋กœ๊ฐ€ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜๋„๋ก security.yaml ์—์„œ ๊ตฌ์„ฑํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    access_control:
        - { path: ^/(_|en/)login, roles: IS_AUTHENTICATED_ANONYMOUSLY}
        - { path: ^/(_|en/)/admin, roles: ROLE_ADMIN}
        - { path: ^/(_|en/)/, roles: IS_AUTHENTICATED_ANONYMOUSLY}

์ด ๊ตฌ์„ฑ์„ ํ†ตํ•ด ๊ธฐ๋ณธ ์–ธ์–ด( / , /login ...)์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ธฐ์กด ๊ฒฝ๋กœ์™€ en ์ ‘๋‘์‚ฌ( /en ๊ฐ€ ์ •์˜๋œ ์˜์–ด ๋ฒ„์ „์— ๋Œ€ํ•œ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. /en/login ...).

์ด์ œ php bin/console debug:router ์‹คํ–‰ํ•˜๋ฉด ๋‚˜๋ญ‡๊ฐ€์ง€ ํ…œํ”Œ๋ฆฟ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ๋กœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

image

์ฆ‰, ํ˜„์žฌ ๋กœ์ผ€์ผ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜์ง€ ์•Š๊ณ  ์›น์‚ฌ์ดํŠธ์—์„œ ํƒ์ƒ‰์„ ์ •์˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ํ‰์†Œ์™€ ๊ฐ™์ด ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<a href="{{ path('app_login') }}">{% trans %}action.menu.member.access{% endtrans %}</a>

๊ทธ๋ฆฌ๊ณ  ํŠน๋ณ„ํžˆ "ํ˜„์ง€ํ™”๋œ" ๊ฒฝ๋กœ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ(์˜ˆ: ์›น์‚ฌ์ดํŠธ๋ฅผ FR์—์„œ EN์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๋งํฌ) ์›ํ•˜๋Š” ๋กœ์ผ€์ผ์„ ํฌํ•จํ•˜๋Š” ์ ์ ˆํ•œ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

            {% if app.request.locale != 'en' %}
                <a href="{{ path('app_home_index.en') }}">EN</a>
            {% endif %}
            {% if app.request.locale != 'fr' %}
                <a href="{{ path('app_home_index.fr') }}">FR</a>
            {% endif %}

์ด๊ฒƒ์ด ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋ฌธ์•ˆ ์ธ์‚ฌ,

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰