/// <summary> /// Creates a new writing system. /// </summary> /// <param name="languageSubtag">The language subtag.</param> /// <param name="scriptSubtag">The script subtag.</param> /// <param name="regionSubtag">The region subtag.</param> /// <param name="variantSubtag">The variant subtag.</param> /// <returns></returns> public IWritingSystem Create(LanguageSubtag languageSubtag, ScriptSubtag scriptSubtag, RegionSubtag regionSubtag, VariantSubtag variantSubtag) { if (!languageSubtag.IsValid) { throw new ArgumentException("Can not create a new writing system with an invalid language tag."); } PalasoWritingSystem ws; lock (m_syncRoot) ws = (PalasoWritingSystem)m_localStore.CreateNew(); ws.LanguageSubtag = languageSubtag; ws.ScriptSubtag = scriptSubtag; ws.RegionSubtag = regionSubtag; ws.VariantSubtag = variantSubtag; if (!string.IsNullOrEmpty(languageSubtag.Name)) { ws.Abbreviation = languageSubtag.Name.Length > 3 ? languageSubtag.Name.Substring(0, 3) : languageSubtag.Name; } else { ws.Abbreviation = ws.Id; } CultureInfo ci = MiscUtils.GetCultureForWs(ws.Id); if (ci != null) { ws.SortUsing = WritingSystemDefinition.SortRulesType.OtherLanguage; ws.SortRules = ci.Name; } ws.Modified = false; return(ws); }
/// <summary> /// Creates a new writing system. /// </summary> /// <param name="languageSubtag">The language subtag.</param> /// <param name="scriptSubtag">The script subtag.</param> /// <param name="regionSubtag">The region subtag.</param> /// <param name="variantSubtags">The variant subtags.</param> /// <returns></returns> public CoreWritingSystemDefinition Create(LanguageSubtag languageSubtag, ScriptSubtag scriptSubtag, RegionSubtag regionSubtag, IEnumerable <VariantSubtag> variantSubtags) { lock (m_syncRoot) { VariantSubtag[] variantSubtagsArray = variantSubtags.ToArray(); string langTag = IetfLanguageTag.Create(languageSubtag, scriptSubtag, regionSubtag, variantSubtagsArray); CoreWritingSystemDefinition ws; m_repo.WritingSystemFactory.Create(langTag, out ws); if (ws.Language != null && languageSubtag != null && ws.Language.Name != languageSubtag.Name) { ws.Language = new LanguageSubtag(ws.Language, languageSubtag.Name); } if (ws.Script != null && scriptSubtag != null && ws.Script.Name != scriptSubtag.Name) { ws.Script = new ScriptSubtag(ws.Script, scriptSubtag.Name); } if (ws.Region != null && regionSubtag != null && ws.Region.Name != regionSubtag.Name) { ws.Region = new RegionSubtag(ws.Region, regionSubtag.Name); } for (int i = 0; i < Math.Min(ws.Variants.Count, variantSubtagsArray.Length); i++) { if (ws.Variants[i].Code == variantSubtagsArray[i].Code && ws.Variants[i].Name != variantSubtagsArray[i].Name) { ws.Variants[i] = new VariantSubtag(ws.Variants[i], variantSubtagsArray[i].Name); } } if (ws.Language != null && !string.IsNullOrEmpty(ws.Language.Name)) { ws.Abbreviation = ws.Language.Name.Length > 3 ? ws.Language.Name.Substring(0, 3) : ws.Language.Name; } else { ws.Abbreviation = ws.LanguageTag; } if (ws.DefaultCollation == null) { string message; if (SystemCollator.ValidateLanguageTag(ws.LanguageTag, out message)) { ws.DefaultCollation = new SystemCollationDefinition { LanguageTag = ws.LanguageTag } } ; else { ws.DefaultCollation = new IcuRulesCollationDefinition("standard"); } } if (ws.DefaultFont == null) { ws.DefaultFont = new FontDefinition("Charis SIL"); } ws.AcceptChanges(); return(ws); } }
/// <summary> /// Load the controls from the writing system, if it is not null. If it is null, clear all controls. /// If the combo boxes are not populated, do nothing...the method will get called again /// when the form loads. /// </summary> private void LoadControlsFromWritingSystem() { m_enableLangTagSideEffects = false; if (m_ws == null) { return; // Probably in design mode; can't populate. } m_origVariantSubtag = m_ws.VariantSubtag; m_origRegionSubtag = m_ws.RegionSubtag; m_origScriptSubtag = m_ws.ScriptSubtag; m_scriptName.ClearItems(); m_scriptName.Items.AddRange(LangTagUtils.ScriptSubtags.ToArray()); ScriptSubtag = m_origScriptSubtag; m_regionName.ClearItems(); m_regionName.Items.AddRange(LangTagUtils.RegionSubtags.ToArray()); RegionSubtag = m_origRegionSubtag; PopulateVariantCombo(false); VariantSubtag = m_origVariantSubtag; m_enableLangTagSideEffects = true; }
public bool CheckValid() { CheckDisposed(); string caption = FwCoreDlgControls.kstidError; ScriptSubtag scriptSubtag = ScriptSubtag; // Can't allow a script name without an abbreviation. if (scriptSubtag == null && !string.IsNullOrEmpty(m_scriptName.Text.Trim())) { MessageBox.Show(FindForm(), FwCoreDlgControls.kstidMissingScrAbbr, caption); return(false); } if (scriptSubtag != null && scriptSubtag.IsPrivateUse) { if (!LangTagUtils.GetScriptSubtag(scriptSubtag.Code).IsPrivateUse) { MessageBox.Show(FindForm(), FwCoreDlgControls.kstidDupScrAbbr, caption); return(false); } if (!scriptSubtag.IsValid) { MessageBox.Show(FindForm(), FwCoreDlgControls.kstidInvalidScrAbbr, caption); return(false); } } RegionSubtag regionSubtag = RegionSubtag; // Can't allow a country name without an abbreviation. if (regionSubtag == null && !string.IsNullOrEmpty(m_regionName.Text.Trim())) { MessageBox.Show(FindForm(), FwCoreDlgControls.kstidMissingRgnAbbr, caption); return(false); } if (regionSubtag != null && regionSubtag.IsPrivateUse) { if (!LangTagUtils.GetRegionSubtag(regionSubtag.Code).IsPrivateUse) { MessageBox.Show(FindForm(), FwCoreDlgControls.kstidDupRgnAbbr, caption); return(false); } if (!regionSubtag.IsValid) { MessageBox.Show(FindForm(), FwCoreDlgControls.kstidInvalidRgnAbbr, caption); return(false); } } VariantSubtag variantSubtag = VariantSubtag; // Can't allow a variant name without an abbreviation. if (variantSubtag == null && !string.IsNullOrEmpty(m_variantName.Text.Trim())) { MessageBox.Show(FindForm(), FwCoreDlgControls.kstidMissingVarAbbr, caption); return(false); } if (variantSubtag != null && variantSubtag.IsPrivateUse) { if (!LangTagUtils.GetVariantSubtag(variantSubtag.Code).IsPrivateUse) { MessageBox.Show(FindForm(), FwCoreDlgControls.kstidDupVarAbbr, caption); return(false); } if (!variantSubtag.IsValid) { MessageBox.Show(FindForm(), FwCoreDlgControls.kstidInvalidVarAbbr, caption); return(false); } } if (variantSubtag != null) { var parts = variantSubtag.Code.Split('-').ToList(); // If these subtags are private use, the first element of each must also be distinct. if (m_ws.LanguageSubtag.IsPrivateUse) { parts.Add(m_ws.LanguageSubtag.Code.Split('-').First()); } if (scriptSubtag != null && scriptSubtag.IsPrivateUse) { parts.Add(scriptSubtag.Code.Split('-').First()); } if (regionSubtag != null && regionSubtag.IsPrivateUse) { parts.Add(regionSubtag.Code.Split('-').First()); } var uniqueParts = new HashSet <string>(StringComparer.OrdinalIgnoreCase); foreach (var part in parts) { if (uniqueParts.Contains(part)) { MessageBox.Show(FindForm(), String.Format(FwCoreDlgControls.kstidDuplicateParts, part), caption); return(false); } uniqueParts.Add(part); } } return(true); }
/// <summary/> public ScriptListItem(ScriptSubtag script) { _script = script; }
public ScriptSubtag(ScriptSubtag subtag, string name) : this(subtag.Code, name, subtag.IsPrivateUse) { }
/// <summary></summary> public IWritingSystem Create(LanguageSubtag languageSubtag, ScriptSubtag scriptSubtag, RegionSubtag regionSubtag, VariantSubtag variantSubtag) { throw new NotImplementedException(); }
public ScriptSubtag(ScriptSubtag subtag, string name) : this(subtag.Code, name, subtag.IsPrivateUse, subtag.IsDeprecated) { }
/// <summary> /// Check that the contents of the control are valid. If not, report the error /// to the user and return false. This should prevent the user from closing the /// containing form using OK, but not from cancelling. /// </summary> public bool CheckValid() { CheckDisposed(); string caption = FwCoreDlgControls.kstidError; ScriptSubtag scriptSubtag = ScriptSubtag; // Can't allow a script name without an abbreviation. if (scriptSubtag == null && !string.IsNullOrEmpty(m_scriptName.Text.Trim())) { MessageBox.Show(FindForm(), FwCoreDlgControls.kstidMissingScrAbbr, caption); return(false); } if (scriptSubtag != null && scriptSubtag.IsPrivateUse) { if (StandardSubtags.RegisteredScripts.Contains(scriptSubtag.Code)) { MessageBox.Show(FindForm(), FwCoreDlgControls.kstidDupScrAbbr, caption); return(false); } if (!IetfLanguageTag.IsValidScriptCode(scriptSubtag.Code)) { MessageBox.Show(FindForm(), FwCoreDlgControls.kstidInvalidScrAbbr, caption); return(false); } } RegionSubtag regionSubtag = RegionSubtag; // Can't allow a country name without an abbreviation. if (regionSubtag == null && !string.IsNullOrEmpty(m_regionName.Text.Trim())) { MessageBox.Show(FindForm(), FwCoreDlgControls.kstidMissingRgnAbbr, caption); return(false); } if (regionSubtag != null && regionSubtag.IsPrivateUse) { if (StandardSubtags.RegisteredRegions.Contains(regionSubtag.Code)) { MessageBox.Show(FindForm(), FwCoreDlgControls.kstidDupRgnAbbr, caption); return(false); } if (!IetfLanguageTag.IsValidRegionCode(regionSubtag.Code)) { MessageBox.Show(FindForm(), FwCoreDlgControls.kstidInvalidRgnAbbr, caption); return(false); } } VariantSubtag[] variantSubtags = VariantSubtags.ToArray(); // Can't allow a variant name without an abbreviation. if (string.IsNullOrEmpty(m_variantAbbrev.Text.Trim()) && !string.IsNullOrEmpty(m_variantName.Text.Trim())) { MessageBox.Show(FindForm(), FwCoreDlgControls.kstidMissingVarAbbr, caption); return(false); } if (variantSubtags.Length > 0) { foreach (VariantSubtag variantSubtag in variantSubtags) { if (variantSubtag.IsPrivateUse) { if (StandardSubtags.RegisteredVariants.Contains(variantSubtag.Code)) { MessageBox.Show(FindForm(), FwCoreDlgControls.kstidDupVarAbbr, caption); return(false); } if (!IetfLanguageTag.IsValidPrivateUseCode(variantSubtag.Code)) { MessageBox.Show(FindForm(), FwCoreDlgControls.kstidInvalidVarAbbr, caption); return(false); } } } List <string> parts = variantSubtags.Select(v => v.Code).ToList(); // If these subtags are private use, the first element of each must also be distinct. if (m_ws.Language.IsPrivateUse) { parts.Add(m_ws.Language.Code.Split('-').First()); } if (scriptSubtag != null && scriptSubtag.IsPrivateUse) { parts.Add(scriptSubtag.Code.Split('-').First()); } if (regionSubtag != null && regionSubtag.IsPrivateUse) { parts.Add(regionSubtag.Code.Split('-').First()); } var uniqueParts = new HashSet <string>(StringComparer.OrdinalIgnoreCase); foreach (string part in parts) { if (uniqueParts.Contains(part)) { MessageBox.Show(FindForm(), String.Format(FwCoreDlgControls.kstidDuplicateParts, part), caption); return(false); } uniqueParts.Add(part); } } return(true); }