• MS CRM 2011 如何获得当前用户使用的界面语言


    原创地址:http://www.cnblogs.com/jfzhu/archive/2012/12/10/2812040.html

    转载请注明出处

    我在之前的博客中介绍过如何为Microsoft Dynamics CRM 2011 安装语言包,安装了不同的语言包后,用户可以选择使用不同的界面语言。我在本文中介绍一下如何获得当前用户使用的界面语言。

    (一) 前端

    如果是使用JScript获得当前用户使用的界面语言,比如在Form的OnLoad事件处理器中,可以用

    context.getUserLcid()

    该方法返回一个数字,即为Language ID,比如美国英语是1033,中文简体为2052。完整的Locale ID Values表,大家可以参见http://msdn.microsoft.com/en-us/library/ms912047(WinEmbedded.10).aspx

    下面在account form的OnLoad事件中测试一下:

    if (typeof (AccountLibrary) == "undefined") { 
        AccountLibrary = { __namespace: true }; 
    }
    
    
    AccountLibrary = { 
        Name: "AccountLibrary", 
        OnLoad: function () { 
            var languageid = Xrm.Page.context.getUserLcid(); 
            alert(languageid); 
        } 
    } 

    打开一个account,我们能看到弹出的languageid的对话框:

    image

    (二) 后端

    运行在服务器上的代码(C#或者VB)该如何获得当前用户的界面语言呢?

    首先要获得当前用户的ID,我们以插件(plugin)为例,当前用户为context.UserId。获得当前用户的ID之后该怎么办,在CRM 4中,我们使用RetrieveUserSettingsSystemUserRequest来获得用户设置(User Settings),但是在CRM 2011中,虽然这个Message还被支持,但这只是基于向后兼容的考虑,在SDK中清楚地写着该Message已经是Deprecated,我们应该使用RetrieveMultiple方法来获得相应的usersettings Entity,所以还在使用RetrieveUserSettingsSystemUserRequest的同学,最好改用RetrieveMultiple方法。下面我们在一个测试插件中来演示一下:

    public class Plugin : IPlugin 
    { 
        #region IPlugin Members 
        private int? GetCurrentUserLanguageId(IOrganizationService service, ITracingService tracingService, Guid userid) 
        { 
            QueryExpression mySavedQuery = new QueryExpression 
            { 
                ColumnSet = new ColumnSet("systemuserid", "uilanguageid"), 
                EntityName = "usersettings", 
                Criteria = new FilterExpression() 
                { 
                    FilterOperator = Microsoft.Xrm.Sdk.Query.LogicalOperator.And, 
                    Conditions = 
                    {       
                        new ConditionExpression 
                        { 
                            AttributeName = "systemuserid", 
                            Operator = ConditionOperator.Equal, 
                            Values = {userid} 
                        } 
                    } 
                } 
            };
    
            EntityCollection ec = service.RetrieveMultiple(mySavedQuery); 
            tracingService.Trace("Debug: usersettings is retrieved"); 
            if (ec != null && ec.Entities != null && ec.Entities.Count > 0 && ec.Entities[0].Contains("uilanguageid")) 
            { 
                tracingService.Trace("Debug: usersettings contains uilanguageid"); 
                return (int)(ec.Entities[0]["uilanguageid"]); 
            } 
            else 
            { 
                tracingService.Trace("Debug: usersettings does not contain uilanguageid"); 
                return null; 
            } 
        }
    
        public void Execute(IServiceProvider serviceProvider) 
        { 
            // Obtain the execution context from the service provider. 
            IPluginExecutionContext context = 
                (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
    
            // Get a reference to the organization service. 
            IOrganizationServiceFactory factory = 
                (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); 
            IOrganizationService service = factory.CreateOrganizationService(context.UserId);
    
            // Get a reference to the tracing service. 
            ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
    
            try 
            { 
                if (context.MessageName == "Create") 
                { 
                    Entity entity = (Entity)context.InputParameters["Target"]; 
                    int? languageid = GetCurrentUserLanguageId(service, tracingService, context.UserId);                    
                    throw new InvalidPluginExecutionException(string.Format("languageid = {0}", languageid.ToString())); 
                } 
            } 
            catch (FaultException<OrganizationServiceFault> ex) 
            { 
                tracingService.Trace("Error: {0}", ex.ToString()); 
                throw new InvalidPluginExecutionException("An error occurred in the plug-in.", ex); 
            } 
            catch (Exception ex) 
            { 
                tracingService.Trace("Error: {0}", ex.ToString()); 
                throw; 
            } 
        }
    
        #endregion 
    } 

    创建一个account,可以看到抛处的异常,错误信息中包含了language id

    image

    总结:如果在前端获得当前用户的界面语言,可以用context.getUserLcid(),在后端可以用RetrieveMultiple方法来获得systemuserid为当前用户ID的usersettings Entity,然后获得usersettings Entity的uilanguageid。

  • 相关阅读:
    PowerDesigner 12小技巧-pd小技巧-pd工具栏不见了-pd修改外键命名规则-pd添加外键
    支付宝支付开发——当面付条码支付和扫码支付
    C#开发微信门户及应用(41)--基于微信开放平台的扫码登录处理
    ***微信 该连接无法访问问题解决办法
    JQuery 导入导出 Excel
    用PowerDesigner对现有的数据库反向工程建立E-R图
    js 停止事件冒泡 阻止浏览器的默认行为(阻止超连接 #)
    微信网页第三方登录原理
    C# 添加Windows服务,定时任务
    微信公众平台开发(104) 自定义菜单扫一扫、发图片、发地理位置
  • 原文地址:https://www.cnblogs.com/jfzhu/p/2812040.html
Copyright © 2020-2023  润新知