示例#1
0
        public IEnumerable <object> GetLanguages(int id, int parentId, Guid dtdguid)
        {
            var dtd            = Services.DataTypeService.GetDataTypeDefinitionById(dtdguid);
            var preValues      = Services.DataTypeService.GetPreValuesCollectionByDataTypeId(dtd.Id).PreValuesAsDictionary;
            var languageSource = preValues.ContainsKey("languageSource") ? preValues["languageSource"].Value : "";

            var languages = new List <Language>();

            if (languageSource == "inuse")
            {
                var xpath = preValues.ContainsKey("xpath") ? preValues["xpath"].Value : "";

                // Grab languages
                if (!string.IsNullOrWhiteSpace(xpath))
                {
                    xpath = xpath.Replace("$currentPage",
                                          string.Format("//*[@id={0} and @isDoc]", id)).Replace("$parentPage",
                                                                                                string.Format("//*[@id={0} and @isDoc]", parentId)).Replace("$ancestorOrSelf",
                                                                                                                                                            string.Format("//*[@id={0} and @isDoc]", id != 0 ? id : parentId));

                    // Lookup language nodes
                    var nodeIds = uQuery.GetNodesByXPath(xpath).Select(x => x.Id).ToArray();
                    if (nodeIds.Any())
                    {
                        var db = ApplicationContext.Current.DatabaseContext.Database;
                        languages.AddRange(db.Query <string>(
                                               string.Format(
                                                   "SELECT DISTINCT [languageISOCode] FROM [umbracoLanguage] JOIN [umbracoDomains] ON [umbracoDomains].[domainDefaultLanguage] = [umbracoLanguage].[id] WHERE [umbracoDomains].[domainRootStructureID] in ({0})",
                                                   string.Join(",", nodeIds)))
                                           .Select(CultureInfo.GetCultureInfo)
                                           .Select(x => new Language
                        {
                            IsoCode    = x.Name,
                            Name       = x.DisplayName,
                            NativeName = x.NativeName
                        }));
                    }
                }
                else
                {
                    // No language node xpath so just return a list of all languages in use
                    var db = ApplicationContext.Current.DatabaseContext.Database;
                    languages.AddRange(
                        db.Query <string>(
                            "SELECT [languageISOCode] FROM [umbracoLanguage] WHERE EXISTS(SELECT 1 FROM [umbracoDomains] WHERE [umbracoDomains].[domainDefaultLanguage] = [umbracoLanguage].[id])")
                        .Select(CultureInfo.GetCultureInfo)
                        .Select(x => new Language
                    {
                        IsoCode    = x.Name,
                        Name       = x.DisplayName,
                        NativeName = x.NativeName
                    }));
                }
            }
            else
            {
                languages.AddRange(umbraco.cms.businesslogic.language.Language.GetAllAsList()
                                   .Select(x => CultureInfo.GetCultureInfo(x.CultureAlias))
                                   .Select(x => new Language
                {
                    IsoCode    = x.Name,
                    Name       = x.DisplayName,
                    NativeName = x.NativeName
                }));
            }

            // Raise event to allow for further filtering
            var args = new FilterLanguagesEventArgs
            {
                CurrentPageId = id,
                ParentPageId  = parentId,
                Languages     = languages
            };

            Vorto.CallFilterLanguages(args);

            // Set active language
            var currentCulture = Thread.CurrentThread.CurrentUICulture.Name;

            // See if one has already been set via the event handler
            var activeLanguage = args.Languages.FirstOrDefault(x => x.IsDefault);

            // Try settings to exact match of current culture
            if (activeLanguage == null)
            {
                activeLanguage = args.Languages.FirstOrDefault(x => x.IsoCode == currentCulture);
            }

            // Try setting to nearest match
            if (activeLanguage == null)
            {
                activeLanguage = args.Languages.FirstOrDefault(x => x.IsoCode.Contains(currentCulture));
            }

            // Try setting to nearest match
            if (activeLanguage == null)
            {
                activeLanguage = args.Languages.FirstOrDefault(x => currentCulture.Contains(x.IsoCode));
            }

            // Couldn't find a good enough match, just select the first language
            if (activeLanguage == null)
            {
                activeLanguage = args.Languages.FirstOrDefault();
            }

            if (activeLanguage != null)
            {
                activeLanguage.IsDefault = true;
            }

            // Return results
            return(args.Languages);
        }
示例#2
0
        public IEnumerable<object> GetLanguages(int id, int parentId, Guid dtdguid)
        {
            var dtd = Services.DataTypeService.GetDataTypeDefinitionById(dtdguid);
            var preValues = Services.DataTypeService.GetPreValuesCollectionByDataTypeId(dtd.Id).PreValuesAsDictionary;
            var languageSource = preValues.ContainsKey("languageSource") ? preValues["languageSource"].Value : "";

            var languages = new List<Language>();

            if (languageSource == "inuse")
            {
                var xpath = preValues.ContainsKey("xpath") ? preValues["xpath"].Value : "";

                // Grab languages
                if (!string.IsNullOrWhiteSpace(xpath))
                {
                    xpath = xpath.Replace("$currentPage",
                        string.Format("//*[@id={0} and @isDoc]", id)).Replace("$parentPage",
                            string.Format("//*[@id={0} and @isDoc]", parentId)).Replace("$ancestorOrSelf",
                                string.Format("//*[@id={0} and @isDoc]", id != 0 ? id : parentId));

                    // Lookup language nodes
                    var nodeIds = uQuery.GetNodesByXPath(xpath).Select(x => x.Id).ToArray();
                    if (nodeIds.Any())
                    {
                        var db = ApplicationContext.Current.DatabaseContext.Database;
                        languages.AddRange(db.Query<string>(
                            string.Format(
                                "SELECT DISTINCT [languageISOCode] FROM [umbracoLanguage] JOIN [umbracoDomains] ON [umbracoDomains].[domainDefaultLanguage] = [umbracoLanguage].[id] WHERE [umbracoDomains].[domainRootStructureID] in ({0})",
                                string.Join(",", nodeIds)))
                            .Select(CultureInfo.GetCultureInfo)
                            .Select(x => new Language
                            {
                                IsoCode = x.Name,
                                Name = x.DisplayName,
                                NativeName = x.NativeName
                            }));
                    }
                }
                else
                {
                    // No language node xpath so just return a list of all languages in use
                    var db = ApplicationContext.Current.DatabaseContext.Database;
                    languages.AddRange(
                        db.Query<string>(
                            "SELECT [languageISOCode] FROM [umbracoLanguage] WHERE EXISTS(SELECT 1 FROM [umbracoDomains] WHERE [umbracoDomains].[domainDefaultLanguage] = [umbracoLanguage].[id])")
                            .Select(CultureInfo.GetCultureInfo)
                            .Select(x => new Language
                            {
                                IsoCode = x.Name,
                                Name = x.DisplayName,
                                NativeName = x.NativeName
                            }));
                }
            }
            else
            {
                languages.AddRange(umbraco.cms.businesslogic.language.Language.GetAllAsList()
                    .Select(x => CultureInfo.GetCultureInfo(x.CultureAlias))
                    .Select(x => new Language
                    {
                        IsoCode = x.Name,
                        Name = x.DisplayName,
                        NativeName = x.NativeName
                    }));
            }

            // Raise event to allow for further filtering
            var args = new FilterLanguagesEventArgs
            {
                CurrentPageId = id,
                ParentPageId = parentId,
                Languages = languages
            };

            Vorto.CallFilterLanguages(args);

            // Set active language
            var currentCulture = Thread.CurrentThread.CurrentUICulture.Name;

            // See if one has already been set via the event handler
            var activeLanguage = args.Languages.FirstOrDefault(x => x.IsDefault);

            // Try settings to exact match of current culture
            if (activeLanguage == null)
                activeLanguage = args.Languages.FirstOrDefault(x => x.IsoCode == currentCulture);

            // Try setting to nearest match
            if (activeLanguage == null)
                activeLanguage = args.Languages.FirstOrDefault(x => x.IsoCode.Contains(currentCulture));

            // Try setting to nearest match
            if (activeLanguage == null)
                activeLanguage = args.Languages.FirstOrDefault(x => currentCulture.Contains(x.IsoCode));

            // Couldn't find a good enough match, just select the first language
            if (activeLanguage == null)
                activeLanguage = args.Languages.FirstOrDefault();

            if (activeLanguage != null)
                activeLanguage.IsDefault = true;

            // Return results
            return args.Languages;
        }