스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.
-
문법적 일치의 힘 체험하기
앱과 게임에서 자동 문법적 일치 기능을 사용해 더 포용적이고 자연스러운 표현을 만들어 보세요. Foundation을 가장 잘 활용하는 방법을 소개하고, 여러 가지 언어로 예시를 보여드리며, 여러 API를 사용해 앱의 사용자 경험을 개선하는 방법을 알려드립니다. 자동 문법적 일치 기능의 기초 내용은 WWD21의 'Foundation의 새로운 기능'에서 확인하세요.
챕터
- 0:00 - Introduction
- 1:28 - Grammatical agreement
- 3:12 - Dependency agreement
- 8:07 - Inclusive language
- 11:05 - Demo
- 17:31 - Wrap-up
리소스
관련 비디오
WWDC23
WWDC22
WWDC21
-
다운로드
♪ ♪
안녕하세요 저는 알라 샤시키나입니다 국제화 팀 엔지니어죠 오늘의 주제는 언어입니다 문법적 일치의 힘을 체험해 보세요 소프트웨어 언어는 상호 작용에 큰 영향을 미치죠 앱에서 쓰는 말은 중요합니다 소프트웨어 언어를 다루기는 쉽지 않죠 해당 언어를 모를 때는 더욱 그래요 2021년 공개된 Foundation의 새로운 API는 앱의 문법적 일치를 돕습니다 오늘 소개할 Foundation의 새로운 기능은 앱에서 사용자 경험을 한 차원 높여줍니다 문법적으로 더 정확하고 듣기 좋고 포용적인 자연어를 사용하기 때문입니다 그럼 시작해 보죠
문법적 일치를 잘 처리해야 하는 이유를 간단히 살펴보고 시작하겠습니다 2021년부터 지원을 시작한 몇 가지 언어를 예시로 보여드리죠 문법적 일치 스페이스에서 새로운 API의 역할을 알아보고 의존성 일치도 소개하겠습니다 저희는 여기서 멈추지 않고 스스로에게 물었죠 앱 언어가 문법적으로 올바르기만 한 것이 아니라 더 포용적이게까지 하려면 어떻게 해야 할까요? 앱을 만들 때 문법이 방해가 되어서는 안 됩니다 잘 만들어진 API는 언어적 복잡성을 줄여서 간소화에 도움이 되죠 UI가 문법적으로 정확하고 풍부한 어휘를 갖추면 사용자 경험도 매끄럽고 쾌적해집니다 언어에 따라 발생할 수 있는 문제도 다르죠 새로운 API를 설계할 때는 이런 언어적 복잡성을 반드시 고려해야 합니다 간단하면서도 사용하기 편한 통합 인터페이스가 필요하겠죠 문법적 일치가 다양한 언어 시스템에서 사용자 경험을 어떻게 개선하는지 보여드릴게요 2021년 공개된 새 API는 사용자가 선호하는 지칭어에 따라 바뀌어야 하는 단어의 범위를 특정하고 어형 변화 대상인 단어의 범위도 특정했습니다 사용자가 여성형 지칭어를 선택하면 iPhone은 사용자가 처음 휴대폰을 설정할 때 여성에게 하는 스페인어로 인사를 합니다 지난해에는 스페인어 외에도 세 언어가 추가되었죠 프랑스어 사용자들도 지칭어를 선택할 때 더 개인화된 경험을 즐길 수 있게 되었습니다 이 단어의 변화는 시스템 전체 소프트웨어에 반영됩니다 메모 앱을 예로 들겠습니다 개인화된 문자열이 시스템 전반에 반영되어 있죠 휴대폰을 설정할 때나 공유 메모를 사용할 때 캘린더를 관리할 때도 여러분의 설정에 따라 언어가 바뀝니다 이탈리아어와 브라질 포르투갈어로도 가능해요
올해 문법적 일치 지원에 저희가 추가한 언어는 두 가지입니다 유럽 포르투갈어와 독일어입니다 이번에는 올해 Foundation에 새롭게 추가된 문법적 일치 기능을 알아보죠 언어는 복잡하지만 좋은 API는 복잡하지 않아요 UI 속 단어가 다른 단어에 맞춰 형태를 바꾸는 일은 흔합니다 이해하기 쉽도록 음식 주문 앱을 통해 예시를 보여드리겠습니다 이건 스페인어예요 스페인어에서 형용사는 서술하는 명사와 일치해야 하죠 음식의 크기를 나타내는 'pequeño'는 서술 대상인 음식 'ensalada'와 일치해야 합니다 이런 현상은 다른 언어에서도 흔히 나타납니다 문장의 서로 다른 부분에서 단어 일치가 일어나죠 단어들이 UI 안에서 서로 떨어져 있기 때문에 일치시키는 것도 쉽지 않습니다 그래서 이런 의존성 일치를 쉽게 해결하는 새 API를 개발했죠 방법은 아주 간단하고 코드 수정도 최소화했습니다
여기서는 음식의 크기를 말하는 문자열 'pequeño'를 음식 이름 'ensalada'와 일치시켜야 하죠 올해 공개된 LocalizationOptions의 새 프로퍼티 concept는 문법적 일치에 영향을 미치는 객체를 명시하지만 인수처럼 문자열에 포함되지는 않습니다 일치시켜야 하는 문자열값에 localizedPhrase concept를 사용하죠 여기서는 'ensalada'입니다 마지막으로 어형 변화가 필요한 단어에 agreeWithConcept로 주석을 표시합니다 여기 입력한 숫자 1은 concept 어레이 첫 번째 객체와 문법적 일치를 요청한다는 뜻입니다 인덱스는 1에서 시작합니다 agreeWithConcept 속성도 올해 처음 도입됐지만 이전 버전의 기기 앱에서도 사용할 수 있습니다 그런 경우에는 해당 속성을 무시하면 됩니다 달라진 점을 소개했으니 이제 UI를 살펴보죠
'pequeño'가 'pequeña'로 바뀐 점에 주목하세요 이것이 스페인어 'ensalada'를 서술하는 올바른 형태입니다 이제 언어적 개선이 필요한 다른 부분을 보겠습니다
'샐러드에는 상추, 치즈 토마토, 햄이 들어 있습니다' 이 문장에서 스페인어 단어 'nuestro'와 'hecho'는 명사 'ensalada'와 일치해야 해요 다행히 문법적 일치는 문자열 안에서만 이루어지니 코드까지 바꿀 필요는 없습니다 먼저 'nuestro'에 어형 변화 속성을 붙여서 음식과 일치하게 만들어 보죠 인수가 있는 블록에서 inflect 속성을 사용하면 인수 내 모든 단어에 문법적 일치를 시도합니다 하지만 여기서는 'hecho'에도 어형 변화가 필요하죠 inflect 블록이 짧아야 모호함이 줄어들기 때문에 'hecho'에는 inflect: true 주석을 달 수 없습니다 올해 저희는 새로운 속성 agreeWithArgument를 추가했어요
agreeWithConcept처럼 음식 이름값을 입력해서 코드 베이스를 수정하는 것이 아닙니다 agreeWithArgument 속성은 inflect 속성만으로는 불가능했던 일치 기능을 코드 수정을 하지 않고도 활성화할 수 있습니다 'hecho'와 문자열 내 다른 곳의 인수가 일치한다는 것을 agreeWithArgument를 사용해 표시할 수 있습니다 여기서 숫잣값 1은 문자열의 첫 번째 인수와 이 단어가 일치해야 한다는 의미죠 이런 변화가 이루어진 뒤에 UI를 다시 한번 보시죠
이제 두 단어가 'ensalada'와 문법적으로 일치합니다 올바른 스페인어로 현지화가 이루어졌습니다 비슷하면서도 다른 예시를 더 살펴보시죠
이번에는 프랑스어입니다 프랑스어에서 지시형용사는 서술하는 명사와 일치해야 하죠 보시다시피 크기와 양 설정 버튼은 이미 스페인어로 바뀌어 있어요 agreeWithConcept와 inflect 속성을 적용했으니까요 그럼 프랑스어 지시사를 수정해 보죠 수정 방법은 간단합니다 형용사와 인수를 모두 inflect: true 블록으로 래핑하고 나머지는 엔진에 맡기면 되죠 짠, 문법적으로 올바른 음식이 맛도 더 좋아요 의존하는 다른 단어에 맞춰 단어를 바꿔주는 것이 의존성 일치의 기능입니다 같은 문장 안에 존재하지 않는 다른 단어나 문구와 단어를 일치시켜야 할 때 agreeWithConcept 속성을 쓰죠 일치시켜야 할 단어나 문구가 같은 문자열 안에 있다면 agreeWithArgument 속성을 사용하세요
이번에는 포용적 언어를 위한 새로운 API를 소개하죠 카페 앱을 다시 보시겠습니다
점심으로 작은 샌드위치 한 개와 작은 주스를 선택해 주문했다고 가정하죠 배가 많이 고프니 배달 상태를 확인해 보겠습니다 토니가 곧 음식을 배달해 줄 것 같군요 사용자 인터페이스 현지화에서는 성 중립적 언어가 바람직하죠 다만 UI에서 성별을 표현하는 언어는 더 개인적이고 자연스럽게 느껴지기도 합니다 토니에게 맞게 이 문자열을 개인화해 보죠 토니는 남성 대명사를 사용합니다
먼저 선호하는 지칭어가 포함되도록 배달원 모델을 수정하곘습니다 이 기능을 위해 올해 새로 추가된 것이 바로 TermOfAddress 타입 프로퍼티입니다 이제 지칭어를 남성이나 여성 또는 중립으로 설정할 수 있죠 토니는 남성 대명사를 사용하니 남성을 선택하면 됩니다
이어서 대명사를 바꿔야 하는 문자열에 주석을 추가합니다 새로운 referentConcept 속성을 쓰면 됩니다
여기서 숫잣값 1은 대명사의 지시 대상이 LocalizationOptions의 첫 번째 concept라는 뜻이죠 어느 3인칭 대명사에 referentConcept를 적용해도 엔진은 대체해야 할 대상을 알아서 파악합니다 termsOfAddress 변형 concept를 문자열에 적용해 보겠습니다 LocalizationOptions concept 프로퍼티의 기능입니다 앞서 문법적 일치를 적용할 때와 같습니다 영어 UI에서는 어떻게 바뀌는지 보시죠
'their'와 'they'가 'his'와 'he'로 바뀌었습니다 다른 사람을 지칭할 때도 이 현지화 문자열을 쓸 수 있죠 여성 대명사를 사용하는 사람을 지칭할 때는 지칭어를 여성으로 설정하시면 됩니다 성 중립 대명사를 사용하는 사람은 성 중립적 지칭어로 부르시면 되고요 현지화된 지칭어를 사용하면 대명사를 더 개인화할 수 있죠 현지화된 지칭어를 쓸 때는 어떤 언어를 적용할지 선택해야 합니다 이 예시에서는 영어예요 사용 가능한 대명사 형태를 목록으로 나타낼 때는 새로운 타입인 Morphology.Pronoun을 씁니다 영어에서 이 목록에는 대명사가 다섯 개 있어요
각 Pronoun은 대상 언어의 대명사 형태와 언제 쓰일지를 나타내는 Morphology로 구성됩니다 대명사 구성에 대한 더 상세한 안내는 문서를 참조해 주세요 이 API를 사용하면 앱의 개인화가 크게 개선됩니다 iOS의 현지화된 문자열에서 사용되는 언어를 다듬을 때 이 기술을 사용하죠 새로운 기능이 작동하는 모습을 예시를 통해 직접 보여드릴게요 저희 카페 앱에는 맛있는 음식이 정말 많답니다 스페인어로 실행해 볼게요
메뉴에 뭐가 있는지 보겠습니다
이번에는 피자를 주문해 보죠
조금 전 이야기했던 문법 문제가 발생했습니다 스페인어에서는 한정사와 형용사가 명사와 일치해야 해요 두 단어가 서로 일치하게 하려면 inflect: true 속성을 사용합니다 'nuestro'와 'pizza'에 이 간단한 해결책을 적용하죠 먼저 String Catalog에서 이 문자열을 찾습니다
'nuestro'가 인수 'pizza'와 일치하게 하려면 inflect: true 블록 안에 두 단어를 다 넣습니다
이번에는 같은 문장에 있는 'pizza'와 일치해야 하는 형용사 'hecho'도 수정해 보죠 여기서는 agreeWithArgument 속성을 사용할게요 저희는 일반적으로 inflect: true 블록을 최대한 짧게 해서 모호함을 줄이고자 합니다 'hecho'가 inflect 블록과 떨어져 있기 때문에 이번에는 agreeWithArgument 속성을 사용해야 합니다
여기서 숫잣값 1은 'hecho'가 이 문자열의 첫 번째 인수인 'pizza'와 일치해야 한다는 의미입니다 앱을 다시 실행해 볼게요
스페인어 현지화를 경험하기에 아주 좋은 예시예요 이번에는 새로운 agreeWithConcept 속성을 사용해 음식의 크기를 수정해 보겠습니다 피자는 여성 명사이니 형용사도 'pequeña'로 바뀌어야 하죠
음식 크기 localizedNames는 이미 정의했습니다 일치를 수정하려면 localizedNames를 특정 음식과 일치하는 메서드로 바꿔야 합니다 이어서 음식 이름을 적용해 SIZE_BUTTON을 만들고 LocalizationOptions의 새 프로퍼티 concept를 정의합니다 concept는 문법적 변화에 영향을 미치는 객체지만 인수처럼 문자열에 삽입되지는 않습니다 여기서는 localizedPhrase concept를 사용해서 문법적으로 일치시키고 싶은 문자열을 삽입합니다
옵션 사용도 잊지 마세요 옵션은 문자열을 초기화할 때 정의됩니다
이번에는 스페인어 String Catalog를 수정해 보죠
여기에 주석을 달 때는 새 속성 agreeWithConcept를 씁니다
여기서 숫잣값 1은 우리가 이 인수와 일치시키려는 대상이 LocalizationOptions로 전달한 첫 번째 concept라는 뜻입니다 마지막으로 FoodSizeView를 업데이트하죠 사용자는 새로운 메서드를 이용해 원하는 피자의 크기를 선택합니다
앱을 다시 실행해서 피자를 주문해 볼게요
보시다시피 피자의 크기가 피자와 정확히 일치합니다 이번에는 스페인어로 남성인 샌드위치를 주문해 볼게요 아주 자연스러워 보이네요 이번에는 앱을 영어로 실행해서 마지막으로 피자를 주문해 보겠습니다
이번에는 큰 피자로 할게요 두 판을 주문하는 게 좋겠어요
토니가 저희 음식을 곧 배달해 주겠네요 성 중립적 언어 표현은 훌륭하지만 우리는 토니가 대명사를 남성으로 설정했다는 걸 압니다 이건 간단하게 수정할 수 있죠 먼저 배달원의 모델을 확장해서 preferredTermsofAddress를 추가합니다
토니의 인스턴스를 확장해 토니가 선호하는 대명사가 남성이라는 것을 표시하고요
다음은 문자열 자체를 바꿀 차례입니다
'they'를 다른 대명사로 대체할 때는 배달원의 termsOfAddress를 따릅니다 이때 새로운 referentConcept 속성을 쓰죠
여기서 숫잣값 1은 대명사의 지시 대상인 'they'가 LocalizationOptions에서 전달된 첫 번째 concept라는 뜻입니다
이 문장의 모든 3인칭 대명사에 모두 적용할 수 있습니다
이번에는 termsOfAddress를 LocalizationOptions의 concept로 전달하고자 합니다 deliveryMessage의 LocalizationOptions를 초기화하죠
여기서는 termsOfAddress concept를 사용해서 문법적 일치에 이용할 termsOfAddress를 제공합니다
마지막으로 새로운 LocalizationOptions를 이용해 문자열을 초기화해 볼게요
이제 앱을 다시 실행해 보죠
큰 피자, 두 판 세 판으로 바꿀게요
이제 일치를 적용했기 때문에 훨씬 더 개인적으로 보입니다
올해 Foundation에는 멋진 새 기능이 아주 많습니다 지금 바로 여러분의 앱에서 시험해 보실 수 있어요 올해 Inflect: true는 더 많은 언어를 지원합니다 새로운 의존성 일치 API는 같은 문자열에서만이 아니라 아예 다른 콘텍스트 속 단어까지 일치시켜 줍니다 마지막으로 Markdown에 추가된 termsOfAddress 어형 변화 concept와 referentConcept 속성은 여러분의 언어를 한층 개인화해 줄 것입니다 언어 수준 지원에 대한 정보는 문서를 참조해 주세요 새로운 기능이 도움이 되길 바랍니다 여러분의 앱 언어를 더 아름답게 만들어 줄 거예요 감사합니다 제 피자가 도착했어요 고마워요, 토니 ♪ ♪
-
-
4:08 - agreeWithConcept
// Formatting the string var options = AttributedString.LocalizationOptions() options.concepts = [.localizedPhrase(food.localizedName)] let size = AttributedString(localized: "small", options: options)
-
8:45 - Preferred terms of address
// A person who is delivering the food order struct DeliveryPerson { // The person's preferred name var name: String // An avatar for the delivery person var avatar: Image // The person's preferred terms of address. This list may contain more than // one option, we will use the first applicable one for the language that's // used in the UI. var preferredTermsOfAddress: [TermOfAddress] } // Formatting the message in Swift var options = AttributedString.LocalizationOptions() options.concepts = [.termsOfAddress(person.preferredTermsOfAddress)] let message = AttributedString(localized: "\(person.name) is on ^[their](referentConcept: 1) way.”, options: options)
-
-
찾고 계신 콘텐츠가 있나요? 위에 주제를 입력하고 원하는 내용을 바로 검색해 보세요.
쿼리를 제출하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도해 주세요.