티스토리 뷰

반응형

과거에도 이런 내용으로 포스트를 한 적이 있었는데..이번에 유니버셜 앱 만들면서 수정한 내용으로 업데이트 한다. 아마 UWP에서도 가능하지 않을까 생각한다...딱히 다른건 없을 듯..

 

셈플 소스는 만들게되면 올릴 예정이다.

 

1. DynamicResource.cs 추가

 

    /// <summary>
    ///     다이나믹 리소스
    /// </summary>
    public class DynamicResource : DynamicObject
    {
        /// <summary>
        ///     윈도우 리소스로더
        /// </summary>
        private ResourceLoader _rl;

        /// <summary>
        ///     프로퍼티로 호출
        /// </summary>
        /// <param Name="Id"></param>
        /// <returns></returns>
        public string this[string Id]
        {
            get
            {
                string str = string.Empty;
                if (DesignMode.DesignModeEnabled == false)
                {
                    if (_rl == null)
                    {
                        _rl = new ResourceLoader();
                    }

                    str = _rl.GetString(Id);
                    if (string.IsNullOrEmpty(str))
                    {
                        str = string.Empty;
                    }
                }
                else
                {
                    //디자인 타임에서는 키값을 반환
                    str = Id;
                }
                return str;
            }
        }

        /// <summary>
        ///     이름으로 호출
        /// </summary>
        /// <param Name="binder"></param>
        /// <param Name="result"></param>
        /// <returns></returns>
        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            string str = string.Empty;
            if (DesignMode.DesignModeEnabled == false)
            {
                if (_rl == null)
                {
                    _rl = new ResourceLoader();
                }

                str = _rl.GetString(binder.Name);
                if (string.IsNullOrEmpty(str))
                {
                    str = string.Empty;
                }
            }
            else
            {
                str = binder.Name;
            }
            result = str;
            return true;
        }
    }

 

일단 위에 클래스를 만들기

 

 

2. App.xaml 수정

 

<Application.Resources>

    <ResourceDictionary>

        <local:DynamicResource x:Key="DResource"/>

    </ResourceDictionary>

</Application.Resources>

 

 

App.xaml에 대략 위와 같이 DynamicResource 클래스를 한개 인스턴스

 

 

3. App.xaml.cs 수정

OnLaunched 이벤트 내부에

 

            //인스턴스된 리소스 로더를 스테틱 객체에 입력
            if (StaticFunctions.DResource == null)
                StaticFunctions.DResource = Application.Current.Resources["DResource"];

생성된 인스턴스를 Static 프로퍼티에 추가

 

 

4. StaticFunctions

 

    public static class StaticFunctions
    {
        /// <summary>
        ///     DynamicResource object set
        /// </summary>
        public static dynamic DResource;

    }

 

 

5. 여기까지 하면 이제부터는 사용가능합니다.

 

수동으로 언어 설정을 변경하려면 아래 코드를 App.xaml.cs - OnLaunched 이벤트에 추가하면 됩니다.

 

            //언어 설정 변경
            Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = "en-US";

 

6. XAML에서 사용하기

 

     <!--TextBlock에서 Text 프로퍼티에 사용-->

    <TextBlock Text="{Binding [txt_properties], Source={StaticResource DResource}}"/>

    <!--Button에서 Content 프로퍼티에 사용-->

    <Button Content="{Binding [txt_view], Source={StaticResource DResource}}"/>

 

 

위와 같이 디자인 타임에서는 리소스 키 이름이 보임

 

영어인 경우

 

한글인 경우

 

 

7. 코드에서 텍스트 리소스 사용

 

StaticFunctions.DResource에는 DynamicResource의 인스턴스가 들어가 있음

 

                var confirm =
                    await
                        EtcHelper.Instance.ConfirmAsync(
                            StaticFunctions.DResource.msg_delete_move_recycle_bin,
                            StaticFunctions.DResource.qst_delete_selected_items);

리소스 키를 일반 프로퍼티 처럼 사용해서 호출

 

영문

 

한글

 

 

8. 추가 적으로 텍스트 리소스를 사용할 때 Multilingual App Toolkit을 이용하면 다른 언어지원하는 것을 쉽게 작업 할 수 있다.

 

 

 

반응형
댓글