﻿<?xml version="1.0" encoding="utf-8"?>
<!--

Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements.  See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License.  You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

-->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" initialize="init();">
	<mx:Script>
		<![CDATA[

			import com.adobe.linguistics.spelling.SpellUI;
				
			public function init():void
			{
				// This is just for example code purpose, we recommend using this with resource bundle rather than using hard coded string.
				var spanishEntries:Object = {enable:"Revisar ortografía", disable:"Ignorar ortografía", add:"Añadir al diccionario"};
				var result:Boolean = SpellUI.setSpellingMenuEntries(spanishEntries);
				if (result == false) trace("Error customizing contextMenu, default menu will be used");
				
				SpellUI.enableSpelling(ta, "en_US");
			}	
		]]>
    </mx:Script>
    
	<mx:Label text="Example for Spanish contextMenu" fontSize="30"/>
	<mx:TextArea id="ta" width="50%" height="50%" fontSize="30" y="50"/>
</mx:Application>
