diff --git a/api/3.xml b/api/3.xml index e13cfdecf9601..9d9ce98b41a04 100644 --- a/api/3.xml +++ b/api/3.xml @@ -88575,7 +88575,7 @@ deprecated="not deprecated" visibility="public" > - + - + diff --git a/api/current.xml b/api/current.xml index 13ca37036b72a..f6fa67d385343 100644 --- a/api/current.xml +++ b/api/current.xml @@ -3100,6 +3100,17 @@ visibility="public" > + + + + + + + + + + + + @@ -96698,7 +96737,7 @@ deprecated="not deprecated" visibility="public" > - + + + + + + + - - + + - + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + - + diff --git a/cmds/runtime/Android.mk b/cmds/runtime/Android.mk index 00fa8a2b392fa..521eb2b2863ea 100644 --- a/cmds/runtime/Android.mk +++ b/cmds/runtime/Android.mk @@ -14,7 +14,7 @@ LOCAL_SHARED_LIBRARIES := \ libcutils \ libui \ libsystem_server \ - libhardware + libhardware_legacy LOCAL_C_INCLUDES := \ $(JNI_H_INCLUDE) diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 3d448a6201abc..a98e29594aacf 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -1072,6 +1072,7 @@ public final class ActivityThread { List pendingIntents; boolean startsNotResumed; + boolean isForward; ActivityRecord() { parent = null; @@ -1225,8 +1226,8 @@ public final class ActivityThread { token); } - public final void scheduleResumeActivity(IBinder token) { - queueOrSendMessage(H.RESUME_ACTIVITY, token); + public final void scheduleResumeActivity(IBinder token, boolean isForward) { + queueOrSendMessage(H.RESUME_ACTIVITY, token, isForward ? 1 : 0); } public final void scheduleSendResult(IBinder token, List results) { @@ -1240,7 +1241,7 @@ public final class ActivityThread { // activity itself back to the activity manager. (matters more with ipc) public final void scheduleLaunchActivity(Intent intent, IBinder token, ActivityInfo info, Bundle state, List pendingResults, - List pendingNewIntents, boolean notResumed) { + List pendingNewIntents, boolean notResumed, boolean isForward) { ActivityRecord r = new ActivityRecord(); r.token = token; @@ -1252,6 +1253,7 @@ public final class ActivityThread { r.pendingIntents = pendingNewIntents; r.startsNotResumed = notResumed; + r.isForward = isForward; queueOrSendMessage(H.LAUNCH_ACTIVITY, r); } @@ -1604,7 +1606,8 @@ public final class ActivityThread { handleWindowVisibility((IBinder)msg.obj, false); break; case RESUME_ACTIVITY: - handleResumeActivity((IBinder)msg.obj, true); + handleResumeActivity((IBinder)msg.obj, true, + msg.arg1 != 0); break; case SEND_RESULT: handleSendResult((ResultData)msg.obj); @@ -2167,7 +2170,7 @@ public final class ActivityThread { Activity a = performLaunchActivity(r); if (a != null) { - handleResumeActivity(r.token, false); + handleResumeActivity(r.token, false, r.isForward); if (!r.activity.mFinished && r.startsNotResumed) { // The activity manager actually wants this one to start out @@ -2522,7 +2525,7 @@ public final class ActivityThread { return r; } - final void handleResumeActivity(IBinder token, boolean clearHide) { + final void handleResumeActivity(IBinder token, boolean clearHide, boolean isForward) { // If we are getting ready to gc after going to the background, well // we are back active so skip it. unscheduleGcIdler(); @@ -2537,6 +2540,9 @@ public final class ActivityThread { a.mStartedActivity + ", hideForNow: " + r.hideForNow + ", finished: " + a.mFinished); + final int forwardBit = isForward ? + WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION : 0; + // If the window hasn't yet been added to the window manager, // and this guy didn't finish itself or start another activity, // then go ahead and add the window. @@ -2548,6 +2554,7 @@ public final class ActivityThread { WindowManager.LayoutParams l = r.window.getAttributes(); a.mDecor = decor; l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION; + l.softInputMode |= forwardBit; wm.addView(decor, l); // If the window has already been added, but during resume @@ -2567,6 +2574,18 @@ public final class ActivityThread { performConfigurationChanged(r.activity, r.newConfig); r.newConfig = null; } + Log.v(TAG, "Resuming " + r + " with isForward=" + isForward); + WindowManager.LayoutParams l = r.window.getAttributes(); + if ((l.softInputMode + & WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) + != forwardBit) { + l.softInputMode = (l.softInputMode + & (~WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION)) + | forwardBit; + ViewManager wm = a.getWindowManager(); + View decor = r.window.getDecorView(); + wm.updateViewLayout(decor, l); + } r.activity.mDecor.setVisibility(View.VISIBLE); mNumVisibleActivities++; } diff --git a/core/java/android/app/AlertDialog.java b/core/java/android/app/AlertDialog.java index a6981a5c95999..f2b89c371e8ee 100644 --- a/core/java/android/app/AlertDialog.java +++ b/core/java/android/app/AlertDialog.java @@ -24,6 +24,7 @@ import android.os.Bundle; import android.os.Message; import android.view.KeyEvent; import android.view.View; +import android.view.WindowManager; import android.widget.AdapterView; import android.widget.Button; import android.widget.ListAdapter; @@ -41,6 +42,15 @@ import com.android.internal.app.AlertController; * FrameLayout fl = (FrameLayout) findViewById(R.id.body); * fl.add(myView, new LayoutParams(FILL_PARENT, WRAP_CONTENT)); * + * + *

The AlertDialog class takes care of automatically setting + * {@link WindowManager.LayoutParams#FLAG_ALT_FOCUSABLE_IM + * WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM} for you based on whether + * any views in the dialog return true from {@link View#onCheckIsTextEditor() + * View.onCheckIsTextEditor()}. Generally you want this set for a Dialog + * without text editors, so that it will be placed on top of the current + * input method UI. You can modify this behavior by forcing the flag to your + * desired mode after calling {@link #onCreate}. */ public class AlertDialog extends Dialog implements DialogInterface { private AlertController mAlert; diff --git a/core/java/android/app/ApplicationThreadNative.java b/core/java/android/app/ApplicationThreadNative.java index 6a703291ddd28..54237aea53d8c 100644 --- a/core/java/android/app/ApplicationThreadNative.java +++ b/core/java/android/app/ApplicationThreadNative.java @@ -97,7 +97,8 @@ public abstract class ApplicationThreadNative extends Binder { data.enforceInterface(IApplicationThread.descriptor); IBinder b = data.readStrongBinder(); - scheduleResumeActivity(b); + boolean isForward = data.readInt() != 0; + scheduleResumeActivity(b, isForward); return true; } @@ -120,7 +121,8 @@ public abstract class ApplicationThreadNative extends Binder List ri = data.createTypedArrayList(ResultInfo.CREATOR); List pi = data.createTypedArrayList(Intent.CREATOR); boolean notResumed = data.readInt() != 0; - scheduleLaunchActivity(intent, b, info, state, ri, pi, notResumed); + boolean isForward = data.readInt() != 0; + scheduleLaunchActivity(intent, b, info, state, ri, pi, notResumed, isForward); return true; } @@ -376,11 +378,12 @@ class ApplicationThreadProxy implements IApplicationThread { data.recycle(); } - public final void scheduleResumeActivity(IBinder token) + public final void scheduleResumeActivity(IBinder token, boolean isForward) throws RemoteException { Parcel data = Parcel.obtain(); data.writeInterfaceToken(IApplicationThread.descriptor); data.writeStrongBinder(token); + data.writeInt(isForward ? 1 : 0); mRemote.transact(SCHEDULE_RESUME_ACTIVITY_TRANSACTION, data, null, IBinder.FLAG_ONEWAY); data.recycle(); @@ -399,7 +402,7 @@ class ApplicationThreadProxy implements IApplicationThread { public final void scheduleLaunchActivity(Intent intent, IBinder token, ActivityInfo info, Bundle state, List pendingResults, - List pendingNewIntents, boolean notResumed) + List pendingNewIntents, boolean notResumed, boolean isForward) throws RemoteException { Parcel data = Parcel.obtain(); data.writeInterfaceToken(IApplicationThread.descriptor); @@ -410,6 +413,7 @@ class ApplicationThreadProxy implements IApplicationThread { data.writeTypedList(pendingResults); data.writeTypedList(pendingNewIntents); data.writeInt(notResumed ? 1 : 0); + data.writeInt(isForward ? 1 : 0); mRemote.transact(SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION, data, null, IBinder.FLAG_ONEWAY); data.recycle(); diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java index f1d2e65880eae..951b48d5fad6d 100644 --- a/core/java/android/app/Dialog.java +++ b/core/java/android/app/Dialog.java @@ -48,13 +48,23 @@ import java.lang.ref.WeakReference; /** * Base class for Dialogs. * - * Note: Activities provide a facility to manage the creation, saving and + *

Note: Activities provide a facility to manage the creation, saving and * restoring of dialogs. See {@link Activity#onCreateDialog(int)}, * {@link Activity#onPrepareDialog(int, Dialog)}, * {@link Activity#showDialog(int)}, and {@link Activity#dismissDialog(int)}. If * these methods are used, {@link #getOwnerActivity()} will return the Activity * that managed this dialog. * + *

Often you will want to have a Dialog display on top of the current + * input method, because there is no reason for it to accept text. You can + * do this by setting the {@link WindowManager.LayoutParams#FLAG_ALT_FOCUSABLE_IM + * WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM} window flag (assuming + * your Dialog takes input focus, as it the default) with the following code: + * + *

+ *     getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
+ *             WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
+ * 
*/ public class Dialog implements DialogInterface, Window.Callback, KeyEvent.Callback, OnCreateContextMenuListener { @@ -209,7 +219,16 @@ public class Dialog implements DialogInterface, Window.Callback, onStart(); mDecor = mWindow.getDecorView(); - mWindowManager.addView(mDecor, mWindow.getAttributes()); + WindowManager.LayoutParams l = mWindow.getAttributes(); + if ((l.softInputMode + & WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) == 0) { + WindowManager.LayoutParams nl = new WindowManager.LayoutParams(); + nl.copyFrom(l); + nl.softInputMode |= + WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION; + l = nl; + } + mWindowManager.addView(mDecor, l); mShowing = true; } diff --git a/core/java/android/app/IApplicationThread.java b/core/java/android/app/IApplicationThread.java index ecd993a24436b..a35158136422c 100644 --- a/core/java/android/app/IApplicationThread.java +++ b/core/java/android/app/IApplicationThread.java @@ -45,11 +45,11 @@ public interface IApplicationThread extends IInterface { void scheduleStopActivity(IBinder token, boolean showWindow, int configChanges) throws RemoteException; void scheduleWindowVisibility(IBinder token, boolean showWindow) throws RemoteException; - void scheduleResumeActivity(IBinder token) throws RemoteException; + void scheduleResumeActivity(IBinder token, boolean isForward) throws RemoteException; void scheduleSendResult(IBinder token, List results) throws RemoteException; void scheduleLaunchActivity(Intent intent, IBinder token, ActivityInfo info, Bundle state, List pendingResults, - List pendingNewIntents, boolean notResumed) + List pendingNewIntents, boolean notResumed, boolean isForward) throws RemoteException; void scheduleRelaunchActivity(IBinder token, List pendingResults, List pendingNewIntents, int configChanges, diff --git a/core/java/android/app/SearchDialog.java b/core/java/android/app/SearchDialog.java index f1c604cd247e9..495156e280e27 100644 --- a/core/java/android/app/SearchDialog.java +++ b/core/java/android/app/SearchDialog.java @@ -38,6 +38,7 @@ import android.text.Editable; import android.text.InputType; import android.text.TextUtils; import android.text.TextWatcher; +import android.util.AttributeSet; import android.util.Log; import android.view.Gravity; import android.view.KeyEvent; @@ -538,7 +539,7 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS } updateWidgetState(); // Only do suggestions if actually typed by user - if (mSuggestionsAdapter.getNonUserQuery()) { + if (!mSuggestionsAdapter.getNonUserQuery()) { mPreviousSuggestionQuery = s.toString(); mUserQuery = mSearchTextField.getText().toString(); mUserQuerySelStart = mSearchTextField.getSelectionStart(); @@ -640,6 +641,12 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS if (DBG_LOG_TIMING == 1) { dbgLogTiming("doTextKey()"); } + // dispatch "typing in the list" first + if (mSearchTextField.isPopupShowing() && + mSearchTextField.getListSelection() != ListView.INVALID_POSITION) { + return onSuggestionsKey(v, keyCode, event); + } + // otherwise, dispatch an "edit view" key switch (keyCode) { case KeyEvent.KEYCODE_ENTER: case KeyEvent.KEYCODE_DPAD_CENTER: @@ -649,6 +656,13 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS return true; } break; + case KeyEvent.KEYCODE_DPAD_DOWN: + // capture the EditText state, so we can restore the user entry later + mUserQuery = mSearchTextField.getText().toString(); + mUserQuerySelStart = mSearchTextField.getSelectionStart(); + mUserQuerySelEnd = mSearchTextField.getSelectionEnd(); + // pass through - we're just watching here + break; default: if (event.getAction() == KeyEvent.ACTION_DOWN) { SearchableInfo.ActionKeyInfo actionKey = mSearchable.findActionKey(keyCode); @@ -668,24 +682,18 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS * React to the user typing while the suggestions are focused. First, check for action * keys. If not handled, try refocusing regular characters into the EditText. In this case, * replace the query text (start typing fresh text). - * - * TODO: Move this code into mTextKeyListener, testing for a list entry being hilited */ - /* - View.OnKeyListener mSuggestionsKeyListener = new View.OnKeyListener() { - public boolean onKey(View v, int keyCode, KeyEvent event) { - boolean handled = false; - // also guard against possible race conditions (late arrival after dismiss) - if (mSearchable != null) { - handled = doSuggestionsKey(v, keyCode, event); - if (!handled) { - handled = refocusingKeyListener(v, keyCode, event); - } + private boolean onSuggestionsKey(View v, int keyCode, KeyEvent event) { + boolean handled = false; + // also guard against possible race conditions (late arrival after dismiss) + if (mSearchable != null) { + handled = doSuggestionsKey(v, keyCode, event); + if (!handled) { + handled = refocusingKeyListener(v, keyCode, event); } - return handled; } - }; - */ + return handled; + } /** * Per UI design, we're going to "steer" any typed keystrokes back into the EditText @@ -821,26 +829,26 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS // First, check for enter or search (both of which we'll treat as a "click") if (keyCode == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_SEARCH) { - AdapterView av = (AdapterView) v; - int position = av.getSelectedItemPosition(); - return launchSuggestion(av, position); + int position = mSearchTextField.getListSelection(); + return launchSuggestion(mSuggestionsAdapter, position); } - // Next, check for left/right moves while we'll manually grab and shift focus + // Next, check for left/right moves, which we use to "return" the user to the edit view if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT || keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) { - // give focus to text editor - // but don't restore the user's original query - mLeaveJammedQueryOnRefocus = true; - if (mSearchTextField.requestFocus()) { - mLeaveJammedQueryOnRefocus = false; - if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) { - mSearchTextField.setSelection(0); - } else { - mSearchTextField.setSelection(mSearchTextField.length()); - } - return true; - } - mLeaveJammedQueryOnRefocus = false; + // give "focus" to text editor, but don't restore the user's original query + int selPoint = (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) ? + 0 : mSearchTextField.length(); + mSearchTextField.setSelection(selPoint); + mSearchTextField.setListSelection(0); + mSearchTextField.clearListSelection(); + return true; + } + + // Next, check for an "up and out" move + if (keyCode == KeyEvent.KEYCODE_DPAD_UP && 0 == mSearchTextField.getListSelection()) { + jamSuggestionQuery(false, null, -1); + // let ACTV complete the move + return false; } // Next, check for an "action key" @@ -849,11 +857,9 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS ((actionKey.mSuggestActionMsg != null) || (actionKey.mSuggestActionMsgColumn != null))) { // launch suggestion using action key column - ListView lv = (ListView) v; - int position = lv.getSelectedItemPosition(); + int position = mSearchTextField.getListSelection(); if (position >= 0) { - CursorAdapter ca = getSuggestionsAdapter(lv); - Cursor c = ca.getCursor(); + Cursor c = mSuggestionsAdapter.getCursor(); if (c.moveToPosition(position)) { final String actionMsg = getActionKeyMessage(c, actionKey); if (actionMsg != null && (actionMsg.length() > 0)) { @@ -975,19 +981,6 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS getContext().startActivity(launcher); } - /** - * Shared code for launching a query from a suggestion. - * - * @param av The AdapterView (really a ListView) containing the suggestions - * @param position The suggestion we'll be launching from - * - * @return Returns true if a successful launch, false if could not (e.g. bad position) - */ - private boolean launchSuggestion(AdapterView av, int position) { - CursorAdapter ca = getSuggestionsAdapter(av); - return launchSuggestion(ca, position); - } - /** * Shared code for launching a query from a suggestion. * @param ca The cursor adapter containing the suggestions @@ -1115,6 +1108,36 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS return result; } + /** + * Local subclass for AutoCompleteTextView + * + * This exists entirely to override the threshold method. Otherwise we just use the class + * as-is. + */ + public static class SearchAutoComplete extends AutoCompleteTextView { + + public SearchAutoComplete(Context context) { + super(null); + } + + public SearchAutoComplete(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public SearchAutoComplete(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + /** + * We always return true, so that the effective threshold is "zero". This allows us + * to provide "null" suggestions such as "just show me some recent entries". + */ + @Override + public boolean enoughToFilter() { + return true; + } + } + /** * Support for AutoCompleteTextView-based suggestions */ @@ -1391,7 +1414,7 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS * Implements OnItemClickListener */ public void onItemClick(AdapterView parent, View view, int position, long id) { -// Log.d(LOG_TAG, "onItemClick() position " + position); + // Log.d(LOG_TAG, "onItemClick() position " + position); launchSuggestion(mSuggestionsAdapter, position); } @@ -1399,7 +1422,7 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS * Implements OnItemSelectedListener */ public void onItemSelected(AdapterView parent, View view, int position, long id) { -// Log.d(LOG_TAG, "onItemSelected() position " + position); + // Log.d(LOG_TAG, "onItemSelected() position " + position); jamSuggestionQuery(true, parent, position); } @@ -1407,7 +1430,7 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS * Implements OnItemSelectedListener */ public void onNothingSelected(AdapterView parent) { -// Log.d(LOG_TAG, "onNothingSelected()"); + // Log.d(LOG_TAG, "onNothingSelected()"); } /** diff --git a/core/java/android/content/AbstractSyncableContentProvider.java b/core/java/android/content/AbstractSyncableContentProvider.java new file mode 100644 index 0000000000000..ce6501c9f1476 --- /dev/null +++ b/core/java/android/content/AbstractSyncableContentProvider.java @@ -0,0 +1,601 @@ +package android.content; + +import android.database.sqlite.SQLiteOpenHelper; +import android.database.sqlite.SQLiteDatabase; +import android.database.Cursor; +import android.net.Uri; +import android.accounts.AccountMonitor; +import android.accounts.AccountMonitorListener; +import android.provider.SyncConstValue; +import android.util.Config; +import android.util.Log; +import android.os.Bundle; +import android.text.TextUtils; + +import java.util.Collections; +import java.util.Map; +import java.util.HashMap; +import java.util.Vector; +import java.util.ArrayList; + +/** + * A specialization of the ContentProvider that centralizes functionality + * used by ContentProviders that are syncable. It also wraps calls to the ContentProvider + * inside of database transactions. + * + * @hide + */ +public abstract class AbstractSyncableContentProvider extends SyncableContentProvider { + private static final String TAG = "SyncableContentProvider"; + protected SQLiteOpenHelper mOpenHelper; + protected SQLiteDatabase mDb; + private final String mDatabaseName; + private final int mDatabaseVersion; + private final Uri mContentUri; + private AccountMonitor mAccountMonitor; + + /** the account set in the last call to onSyncStart() */ + private String mSyncingAccount; + + private SyncStateContentProviderHelper mSyncState = null; + + private static final String[] sAccountProjection = new String[] {SyncConstValue._SYNC_ACCOUNT}; + + private boolean mIsTemporary; + + private AbstractTableMerger mCurrentMerger = null; + private boolean mIsMergeCancelled = false; + + private static final String SYNC_ACCOUNT_WHERE_CLAUSE = SyncConstValue._SYNC_ACCOUNT + "=?"; + + protected boolean isTemporary() { + return mIsTemporary; + } + + /** + * Indicates whether or not this ContentProvider contains a full + * set of data or just diffs. This knowledge comes in handy when + * determining how to incorporate the contents of a temporary + * provider into a real provider. + */ + private boolean mContainsDiffs; + + /** + * Initializes the AbstractSyncableContentProvider + * @param dbName the filename of the database + * @param dbVersion the current version of the database schema + * @param contentUri The base Uri of the syncable content in this provider + */ + public AbstractSyncableContentProvider(String dbName, int dbVersion, Uri contentUri) { + super(); + + mDatabaseName = dbName; + mDatabaseVersion = dbVersion; + mContentUri = contentUri; + mIsTemporary = false; + setContainsDiffs(false); + if (Config.LOGV) { + Log.v(TAG, "created SyncableContentProvider " + this); + } + } + + /** + * Close resources that must be closed. You must call this to properly release + * the resources used by the AbstractSyncableContentProvider. + */ + public void close() { + if (mOpenHelper != null) { + mOpenHelper.close(); // OK to call .close() repeatedly. + } + } + + /** + * Override to create your schema and do anything else you need to do with a new database. + * This is run inside a transaction (so you don't need to use one). + * This method may not use getDatabase(), or call content provider methods, it must only + * use the database handle passed to it. + */ + protected void bootstrapDatabase(SQLiteDatabase db) {} + + /** + * Override to upgrade your database from an old version to the version you specified. + * Don't set the DB version; this will automatically be done after the method returns. + * This method may not use getDatabase(), or call content provider methods, it must only + * use the database handle passed to it. + * + * @param oldVersion version of the existing database + * @param newVersion current version to upgrade to + * @return true if the upgrade was lossless, false if it was lossy + */ + protected abstract boolean upgradeDatabase(SQLiteDatabase db, int oldVersion, int newVersion); + + /** + * Override to do anything (like cleanups or checks) you need to do after opening a database. + * Does nothing by default. This is run inside a transaction (so you don't need to use one). + * This method may not use getDatabase(), or call content provider methods, it must only + * use the database handle passed to it. + */ + protected void onDatabaseOpened(SQLiteDatabase db) {} + + private class DatabaseHelper extends SQLiteOpenHelper { + DatabaseHelper(Context context, String name) { + // Note: context and name may be null for temp providers + super(context, name, null, mDatabaseVersion); + } + + @Override + public void onCreate(SQLiteDatabase db) { + bootstrapDatabase(db); + mSyncState.createDatabase(db); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + if (!upgradeDatabase(db, oldVersion, newVersion)) { + mSyncState.discardSyncData(db, null /* all accounts */); + getContext().getContentResolver().startSync(mContentUri, new Bundle()); + } + } + + @Override + public void onOpen(SQLiteDatabase db) { + onDatabaseOpened(db); + mSyncState.onDatabaseOpened(db); + } + } + + @Override + public boolean onCreate() { + if (isTemporary()) throw new IllegalStateException("onCreate() called for temp provider"); + mOpenHelper = new AbstractSyncableContentProvider.DatabaseHelper(getContext(), mDatabaseName); + mSyncState = new SyncStateContentProviderHelper(mOpenHelper); + + AccountMonitorListener listener = new AccountMonitorListener() { + public void onAccountsUpdated(String[] accounts) { + // Some providers override onAccountsChanged(); give them a database to work with. + mDb = mOpenHelper.getWritableDatabase(); + onAccountsChanged(accounts); + TempProviderSyncAdapter syncAdapter = (TempProviderSyncAdapter)getSyncAdapter(); + if (syncAdapter != null) { + syncAdapter.onAccountsChanged(accounts); + } + } + }; + mAccountMonitor = new AccountMonitor(getContext(), listener); + + return true; + } + + /** + * Get a non-persistent instance of this content provider. + * You must call {@link #close} on the returned + * SyncableContentProvider when you are done with it. + * + * @return a non-persistent content provider with the same layout as this + * provider. + */ + public AbstractSyncableContentProvider getTemporaryInstance() { + AbstractSyncableContentProvider temp; + try { + temp = getClass().newInstance(); + } catch (InstantiationException e) { + throw new RuntimeException("unable to instantiate class, " + + "this should never happen", e); + } catch (IllegalAccessException e) { + throw new RuntimeException( + "IllegalAccess while instantiating class, " + + "this should never happen", e); + } + + // Note: onCreate() isn't run for the temp provider, and it has no Context. + temp.mIsTemporary = true; + temp.setContainsDiffs(true); + temp.mOpenHelper = temp.new DatabaseHelper(null, null); + temp.mSyncState = new SyncStateContentProviderHelper(temp.mOpenHelper); + if (!isTemporary()) { + mSyncState.copySyncState( + mOpenHelper.getReadableDatabase(), + temp.mOpenHelper.getWritableDatabase(), + getSyncingAccount()); + } + return temp; + } + + public SQLiteDatabase getDatabase() { + if (mDb == null) mDb = mOpenHelper.getWritableDatabase(); + return mDb; + } + + public boolean getContainsDiffs() { + return mContainsDiffs; + } + + public void setContainsDiffs(boolean containsDiffs) { + if (containsDiffs && !isTemporary()) { + throw new IllegalStateException( + "only a temporary provider can contain diffs"); + } + mContainsDiffs = containsDiffs; + } + + /** + * Each subclass of this class should define a subclass of {@link + * android.content.AbstractTableMerger} for each table they wish to merge. It + * should then override this method and return one instance of + * each merger, in sequence. Their {@link + * android.content.AbstractTableMerger#merge merge} methods will be called, one at a + * time, in the order supplied. + * + *

The default implementation returns an empty list, so that no + * merging will occur. + * @return A sequence of subclasses of {@link + * android.content.AbstractTableMerger}, one for each table that should be merged. + */ + protected Iterable getMergers() { + return Collections.emptyList(); + } + + @Override + public final int update(final Uri url, final ContentValues values, + final String selection, final String[] selectionArgs) { + mDb = mOpenHelper.getWritableDatabase(); + mDb.beginTransaction(); + try { + if (isTemporary() && mSyncState.matches(url)) { + int numRows = mSyncState.asContentProvider().update( + url, values, selection, selectionArgs); + mDb.setTransactionSuccessful(); + return numRows; + } + + int result = updateInternal(url, values, selection, selectionArgs); + mDb.setTransactionSuccessful(); + + if (!isTemporary() && result > 0) { + getContext().getContentResolver().notifyChange(url, null /* observer */, + changeRequiresLocalSync(url)); + } + + return result; + } finally { + mDb.endTransaction(); + } + } + + @Override + public final int delete(final Uri url, final String selection, + final String[] selectionArgs) { + mDb = mOpenHelper.getWritableDatabase(); + mDb.beginTransaction(); + try { + if (isTemporary() && mSyncState.matches(url)) { + int numRows = mSyncState.asContentProvider().delete(url, selection, selectionArgs); + mDb.setTransactionSuccessful(); + return numRows; + } + int result = deleteInternal(url, selection, selectionArgs); + mDb.setTransactionSuccessful(); + if (!isTemporary() && result > 0) { + getContext().getContentResolver().notifyChange(url, null /* observer */, + changeRequiresLocalSync(url)); + } + return result; + } finally { + mDb.endTransaction(); + } + } + + @Override + public final Uri insert(final Uri url, final ContentValues values) { + mDb = mOpenHelper.getWritableDatabase(); + mDb.beginTransaction(); + try { + if (isTemporary() && mSyncState.matches(url)) { + Uri result = mSyncState.asContentProvider().insert(url, values); + mDb.setTransactionSuccessful(); + return result; + } + Uri result = insertInternal(url, values); + mDb.setTransactionSuccessful(); + if (!isTemporary() && result != null) { + getContext().getContentResolver().notifyChange(url, null /* observer */, + changeRequiresLocalSync(url)); + } + return result; + } finally { + mDb.endTransaction(); + } + } + + @Override + public final int bulkInsert(final Uri uri, final ContentValues[] values) { + int size = values.length; + int completed = 0; + final boolean isSyncStateUri = mSyncState.matches(uri); + mDb = mOpenHelper.getWritableDatabase(); + mDb.beginTransaction(); + try { + for (int i = 0; i < size; i++) { + Uri result; + if (isTemporary() && isSyncStateUri) { + result = mSyncState.asContentProvider().insert(uri, values[i]); + } else { + result = insertInternal(uri, values[i]); + mDb.yieldIfContended(); + } + if (result != null) { + completed++; + } + } + mDb.setTransactionSuccessful(); + } finally { + mDb.endTransaction(); + } + if (!isTemporary() && completed == size) { + getContext().getContentResolver().notifyChange(uri, null /* observer */, + changeRequiresLocalSync(uri)); + } + return completed; + } + + /** + * Check if changes to this URI can be syncable changes. + * @param uri the URI of the resource that was changed + * @return true if changes to this URI can be syncable changes, false otherwise + */ + public boolean changeRequiresLocalSync(Uri uri) { + return true; + } + + @Override + public final Cursor query(final Uri url, final String[] projection, + final String selection, final String[] selectionArgs, + final String sortOrder) { + mDb = mOpenHelper.getReadableDatabase(); + if (isTemporary() && mSyncState.matches(url)) { + return mSyncState.asContentProvider().query( + url, projection, selection, selectionArgs, sortOrder); + } + return queryInternal(url, projection, selection, selectionArgs, sortOrder); + } + + /** + * Called right before a sync is started. + * + * @param context the sync context for the operation + * @param account + */ + public void onSyncStart(SyncContext context, String account) { + if (TextUtils.isEmpty(account)) { + throw new IllegalArgumentException("you passed in an empty account"); + } + mSyncingAccount = account; + } + + /** + * Called right after a sync is completed + * + * @param context the sync context for the operation + * @param success true if the sync succeeded, false if an error occurred + */ + public void onSyncStop(SyncContext context, boolean success) { + } + + /** + * The account of the most recent call to onSyncStart() + * @return the account + */ + public String getSyncingAccount() { + return mSyncingAccount; + } + + /** + * Merge diffs from a sync source with this content provider. + * + * @param context the SyncContext within which this merge is taking place + * @param diffs A temporary content provider containing diffs from a sync + * source. + * @param result a MergeResult that contains information about the merge, including + * a temporary content provider with the same layout as this provider containing + * @param syncResult + */ + public void merge(SyncContext context, SyncableContentProvider diffs, + TempProviderSyncResult result, SyncResult syncResult) { + SQLiteDatabase db = mOpenHelper.getWritableDatabase(); + db.beginTransaction(); + try { + synchronized(this) { + mIsMergeCancelled = false; + } + Iterable mergers = getMergers(); + try { + for (AbstractTableMerger merger : mergers) { + synchronized(this) { + if (mIsMergeCancelled) break; + mCurrentMerger = merger; + } + merger.merge(context, getSyncingAccount(), diffs, result, syncResult, this); + } + if (mIsMergeCancelled) return; + if (diffs != null) { + mSyncState.copySyncState( + ((AbstractSyncableContentProvider)diffs).mOpenHelper.getReadableDatabase(), + mOpenHelper.getWritableDatabase(), + getSyncingAccount()); + } + } finally { + synchronized (this) { + mCurrentMerger = null; + } + } + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + } + + + /** + * Invoked when the active sync has been canceled. Sets the sync state of this provider and + * its merger to canceled. + */ + public void onSyncCanceled() { + synchronized (this) { + mIsMergeCancelled = true; + if (mCurrentMerger != null) { + mCurrentMerger.onMergeCancelled(); + } + } + } + + + public boolean isMergeCancelled() { + return mIsMergeCancelled; + } + + /** + * Subclasses should override this instead of update(). See update() + * for details. + * + *

This method is called within a acquireDbLock()/releaseDbLock() block, + * which means a database transaction will be active during the call; + */ + protected abstract int updateInternal(Uri url, ContentValues values, + String selection, String[] selectionArgs); + + /** + * Subclasses should override this instead of delete(). See delete() + * for details. + * + *

This method is called within a acquireDbLock()/releaseDbLock() block, + * which means a database transaction will be active during the call; + */ + protected abstract int deleteInternal(Uri url, String selection, String[] selectionArgs); + + /** + * Subclasses should override this instead of insert(). See insert() + * for details. + * + *

This method is called within a acquireDbLock()/releaseDbLock() block, + * which means a database transaction will be active during the call; + */ + protected abstract Uri insertInternal(Uri url, ContentValues values); + + /** + * Subclasses should override this instead of query(). See query() + * for details. + * + *

This method is *not* called within a acquireDbLock()/releaseDbLock() + * block for performance reasons. If an implementation needs atomic access + * to the database the lock can be acquired then. + */ + protected abstract Cursor queryInternal(Uri url, String[] projection, + String selection, String[] selectionArgs, String sortOrder); + + /** + * Make sure that there are no entries for accounts that no longer exist + * @param accountsArray the array of currently-existing accounts + */ + protected void onAccountsChanged(String[] accountsArray) { + Map accounts = new HashMap(); + for (String account : accountsArray) { + accounts.put(account, false); + } + accounts.put(SyncConstValue.NON_SYNCABLE_ACCOUNT, false); + + SQLiteDatabase db = mOpenHelper.getWritableDatabase(); + Map tableMap = db.getSyncedTables(); + Vector tables = new Vector(); + tables.addAll(tableMap.keySet()); + tables.addAll(tableMap.values()); + + db.beginTransaction(); + try { + mSyncState.onAccountsChanged(accountsArray); + for (String table : tables) { + deleteRowsForRemovedAccounts(accounts, table, + SyncConstValue._SYNC_ACCOUNT); + } + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + } + + /** + * A helper method to delete all rows whose account is not in the accounts + * map. The accountColumnName is the name of the column that is expected + * to hold the account. If a row has an empty account it is never deleted. + * + * @param accounts a map of existing accounts + * @param table the table to delete from + * @param accountColumnName the name of the column that is expected + * to hold the account. + */ + protected void deleteRowsForRemovedAccounts(Map accounts, + String table, String accountColumnName) { + SQLiteDatabase db = mOpenHelper.getWritableDatabase(); + Cursor c = db.query(table, sAccountProjection, null, null, + accountColumnName, null, null); + try { + while (c.moveToNext()) { + String account = c.getString(0); + if (TextUtils.isEmpty(account)) { + continue; + } + if (!accounts.containsKey(account)) { + int numDeleted; + numDeleted = db.delete(table, accountColumnName + "=?", new String[]{account}); + if (Config.LOGV) { + Log.v(TAG, "deleted " + numDeleted + + " records from table " + table + + " for account " + account); + } + } + } + } finally { + c.close(); + } + } + + /** + * Called when the sync system determines that this provider should no longer + * contain records for the specified account. + */ + public void wipeAccount(String account) { + SQLiteDatabase db = mOpenHelper.getWritableDatabase(); + Map tableMap = db.getSyncedTables(); + ArrayList tables = new ArrayList(); + tables.addAll(tableMap.keySet()); + tables.addAll(tableMap.values()); + + db.beginTransaction(); + + try { + // remove the SyncState data + mSyncState.discardSyncData(db, account); + + // remove the data in the synced tables + for (String table : tables) { + db.delete(table, SYNC_ACCOUNT_WHERE_CLAUSE, new String[]{account}); + } + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + } + + /** + * Retrieves the SyncData bytes for the given account. The byte array returned may be null. + */ + public byte[] readSyncDataBytes(String account) { + return mSyncState.readSyncDataBytes(mOpenHelper.getReadableDatabase(), account); + } + + /** + * Sets the SyncData bytes for the given account. The byte array may be null. + */ + public void writeSyncDataBytes(String account, byte[] data) { + mSyncState.writeSyncDataBytes(mOpenHelper.getWritableDatabase(), account, data); + } +} diff --git a/core/java/android/content/AbstractTableMerger.java b/core/java/android/content/AbstractTableMerger.java index 5511ff6931e7a..700f1d88241c1 100644 --- a/core/java/android/content/AbstractTableMerger.java +++ b/core/java/android/content/AbstractTableMerger.java @@ -21,12 +21,8 @@ import android.database.DatabaseUtils; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import android.os.Debug; -import static android.provider.SyncConstValue._SYNC_ACCOUNT; -import static android.provider.SyncConstValue._SYNC_DIRTY; -import static android.provider.SyncConstValue._SYNC_ID; -import static android.provider.SyncConstValue._SYNC_LOCAL_ID; -import static android.provider.SyncConstValue._SYNC_MARK; -import static android.provider.SyncConstValue._SYNC_VERSION; +import android.provider.BaseColumns; +import static android.provider.SyncConstValue.*; import android.text.TextUtils; import android.util.Log; @@ -53,7 +49,7 @@ public abstract class AbstractTableMerger private static final String TAG = "AbstractTableMerger"; private static final String[] syncDirtyProjection = - new String[] {_SYNC_DIRTY, "_id", _SYNC_ID, _SYNC_VERSION}; + new String[] {_SYNC_DIRTY, BaseColumns._ID, _SYNC_ID, _SYNC_VERSION}; private static final String[] syncIdAndVersionProjection = new String[] {_SYNC_ID, _SYNC_VERSION}; @@ -61,8 +57,9 @@ public abstract class AbstractTableMerger private static final String SELECT_MARKED = _SYNC_MARK + "> 0 and " + _SYNC_ACCOUNT + "=?"; - private static final String SELECT_BY_ID_AND_ACCOUNT = + private static final String SELECT_BY_SYNC_ID_AND_ACCOUNT = _SYNC_ID +"=? and " + _SYNC_ACCOUNT + "=?"; + private static final String SELECT_BY_ID = BaseColumns._ID +"=?"; private static final String SELECT_UNSYNCED = "" + _SYNC_DIRTY + " > 0 and (" + _SYNC_ACCOUNT + "=? or " + _SYNC_ACCOUNT + " is null)"; @@ -90,7 +87,8 @@ public abstract class AbstractTableMerger * This is called when it is determined that a row should be deleted from the * ContentProvider. The localCursor is on a table from the local ContentProvider * and its current position is of the row that should be deleted. The localCursor - * contains the complete projection of the table. + * is only guaranteed to contain the BaseColumns.ID column so the implementation + * of deleteRow() must query the database directly if other columns are needed. *

* It is the responsibility of the implementation of this method to ensure that the cursor * points to the next row when this method returns, either by calling Cursor.deleteRow() or @@ -153,7 +151,10 @@ public abstract class AbstractTableMerger if (Log.isLoggable(TAG, Log.VERBOSE)) Log.v(TAG, "merge complete"); } - private void mergeServerDiffs(SyncContext context, + /** + * @hide this is public for testing purposes only + */ + public void mergeServerDiffs(SyncContext context, String account, SyncableContentProvider serverDiffs, SyncResult syncResult) { boolean diffsArePartial = serverDiffs.getContainsDiffs(); // mark the current rows so that we can distinguish these from new @@ -202,7 +203,7 @@ public abstract class AbstractTableMerger mDb.yieldIfContended(); String serverSyncId = diffsCursor.getString(serverSyncIDColumn); String serverSyncVersion = diffsCursor.getString(serverSyncVersionColumn); - long localPersonID = 0; + long localRowId = 0; String localSyncVersion = null; diffsCount++; @@ -316,7 +317,7 @@ public abstract class AbstractTableMerger " that matches the server _sync_id"); } localSyncDirty = localCursor.getInt(0) != 0; - localPersonID = localCursor.getLong(1); + localRowId = localCursor.getLong(1); localSyncVersion = localCursor.getString(3); localCursor.moveToNext(); } @@ -345,23 +346,20 @@ public abstract class AbstractTableMerger continue; } - // If the _sync_local_id is set and > -1 in the diffsCursor + // If the _sync_local_id is present in the diffsCursor // then this record corresponds to a local record that was just // inserted into the server and the _sync_local_id is the row id // of the local record. Set these fields so that the next check // treats this record as an update, which will allow the // merger to update the record with the server's sync id - long serverLocalSyncId = - diffsCursor.isNull(serverSyncLocalIdColumn) - ? -1 - : diffsCursor.getLong(serverSyncLocalIdColumn); - if (serverLocalSyncId > -1) { - if (Log.isLoggable(TAG, Log.VERBOSE)) Log.v(TAG, "the remote record with sync id " - + serverSyncId + " has a local sync id, " - + serverLocalSyncId); + if (!diffsCursor.isNull(serverSyncLocalIdColumn)) { + localRowId = diffsCursor.getLong(serverSyncLocalIdColumn); + if (Log.isLoggable(TAG, Log.VERBOSE)) { + Log.v(TAG, "the remote record with sync id " + serverSyncId + + " has a local sync id, " + localRowId); + } localSyncID = serverSyncId; localSyncDirty = false; - localPersonID = serverLocalSyncId; localSyncVersion = null; } @@ -372,12 +370,9 @@ public abstract class AbstractTableMerger if (recordChanged) { if (localSyncDirty) { if (Log.isLoggable(TAG, Log.VERBOSE)) { - Log.v(TAG, - "remote record " + - serverSyncId + - " conflicts with local _sync_id " + - localSyncID + ", local _id " + - localPersonID); + Log.v(TAG, "remote record " + serverSyncId + + " conflicts with local _sync_id " + localSyncID + + ", local _id " + localRowId); } conflict = true; } else { @@ -387,7 +382,7 @@ public abstract class AbstractTableMerger serverSyncId + " updates local _sync_id " + localSyncID + ", local _id " + - localPersonID); + localRowId); } update = true; } @@ -395,18 +390,16 @@ public abstract class AbstractTableMerger } else { // the local db doesn't know about this record so add it if (Log.isLoggable(TAG, Log.VERBOSE)) { - Log.v(TAG, "remote record " - + serverSyncId + " is new, inserting"); + Log.v(TAG, "remote record " + serverSyncId + " is new, inserting"); } insert = true; } if (update) { - updateRow(localPersonID, serverDiffs, diffsCursor); + updateRow(localRowId, serverDiffs, diffsCursor); syncResult.stats.numUpdates++; } else if (conflict) { - resolveRow(localPersonID, serverSyncId, serverDiffs, - diffsCursor); + resolveRow(localRowId, serverSyncId, serverDiffs, diffsCursor); syncResult.stats.numUpdates++; } else if (insert) { insertRow(serverDiffs, diffsCursor); @@ -414,16 +407,16 @@ public abstract class AbstractTableMerger } } - if (Log.isLoggable(TAG, Log.VERBOSE)) Log.v(TAG, "processed " + diffsCount + - " server entries"); + if (Log.isLoggable(TAG, Log.VERBOSE)) { + Log.v(TAG, "processed " + diffsCount + " server entries"); + } // If tombstones aren't in use delete any remaining local rows that // don't have corresponding server rows. Keep the rows that don't // have a sync id since those were created locally and haven't been // synced to the server yet. if (!diffsArePartial) { - while (!localCursor.isAfterLast() && - !TextUtils.isEmpty(localCursor.getString(2))) { + while (!localCursor.isAfterLast() && !TextUtils.isEmpty(localCursor.getString(2))) { if (mIsMergeCancelled) { localCursor.deactivate(); deletedCursor.deactivate(); @@ -458,7 +451,6 @@ public abstract class AbstractTableMerger // Apply deletions from the server if (mDeletedTableURL != null) { diffsCursor = serverDiffs.query(mDeletedTableURL, null, null, null, null); - serverSyncIDColumn = diffsCursor.getColumnIndexOrThrow(_SYNC_ID); while (diffsCursor.moveToNext()) { if (mIsMergeCancelled) { @@ -466,19 +458,31 @@ public abstract class AbstractTableMerger return; } // delete all rows that match each element in the diffsCursor - fullyDeleteRowsWithSyncId(diffsCursor.getString(serverSyncIDColumn), account, - syncResult); + fullyDeleteMatchingRows(diffsCursor, account, syncResult); mDb.yieldIfContended(); } diffsCursor.deactivate(); } } - private void fullyDeleteRowsWithSyncId(String syncId, String account, SyncResult syncResult) { - final String[] selectionArgs = new String[]{syncId, account}; + private void fullyDeleteMatchingRows(Cursor diffsCursor, String account, + SyncResult syncResult) { + int serverSyncIdColumn = diffsCursor.getColumnIndexOrThrow(_SYNC_ID); + final boolean deleteBySyncId = !diffsCursor.isNull(serverSyncIdColumn); + // delete the rows explicitly so that the delete operation can be overridden - Cursor c = mDb.query(mTable, getDeleteRowProjection(), SELECT_BY_ID_AND_ACCOUNT, - selectionArgs, null, null, null); + final Cursor c; + final String[] selectionArgs; + if (deleteBySyncId) { + selectionArgs = new String[]{diffsCursor.getString(serverSyncIdColumn), account}; + c = mDb.query(mTable, new String[]{BaseColumns._ID}, SELECT_BY_SYNC_ID_AND_ACCOUNT, + selectionArgs, null, null, null); + } else { + int serverSyncLocalIdColumn = diffsCursor.getColumnIndexOrThrow(_SYNC_LOCAL_ID); + selectionArgs = new String[]{diffsCursor.getString(serverSyncLocalIdColumn)}; + c = mDb.query(mTable, new String[]{BaseColumns._ID}, SELECT_BY_ID, selectionArgs, + null, null, null); + } try { c.moveToFirst(); while (!c.isAfterLast()) { @@ -488,21 +492,11 @@ public abstract class AbstractTableMerger } finally { c.deactivate(); } - if (mDeletedTable != null) { - mDb.delete(mDeletedTable, SELECT_BY_ID_AND_ACCOUNT, selectionArgs); + if (deleteBySyncId && mDeletedTable != null) { + mDb.delete(mDeletedTable, SELECT_BY_SYNC_ID_AND_ACCOUNT, selectionArgs); } } - /** - * Provides the projection used by - * {@link AbstractTableMerger#deleteRow(android.database.Cursor)}. - * This should be overridden if the deleteRow implementation requires - * additional columns. - */ - protected String[] getDeleteRowProjection() { - return new String[]{"_id"}; - } - /** * Converts cursor into a Map, using the correct types for the values. */ diff --git a/core/java/android/content/SyncableContentProvider.java b/core/java/android/content/SyncableContentProvider.java index 1e55e274c909a..e0cd78643be64 100644 --- a/core/java/android/content/SyncableContentProvider.java +++ b/core/java/android/content/SyncableContentProvider.java @@ -16,23 +16,11 @@ package android.content; -import android.accounts.AccountMonitor; -import android.accounts.AccountMonitorListener; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteOpenHelper; import android.net.Uri; -import android.provider.SyncConstValue; -import android.text.TextUtils; -import android.util.Config; -import android.util.Log; -import android.os.Bundle; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; import java.util.Map; -import java.util.Vector; /** * A specialization of the ContentProvider that centralizes functionality @@ -42,68 +30,13 @@ import java.util.Vector; * @hide */ public abstract class SyncableContentProvider extends ContentProvider { - private static final String TAG = "SyncableContentProvider"; - protected SQLiteOpenHelper mOpenHelper; - protected SQLiteDatabase mDb; - private final String mDatabaseName; - private final int mDatabaseVersion; - private final Uri mContentUri; - private AccountMonitor mAccountMonitor; - - /** the account set in the last call to onSyncStart() */ - private String mSyncingAccount; - - private SyncStateContentProviderHelper mSyncState = null; - - private static final String[] sAccountProjection = new String[] {SyncConstValue._SYNC_ACCOUNT}; - - private boolean mIsTemporary; - - private AbstractTableMerger mCurrentMerger = null; - private boolean mIsMergeCancelled = false; - - private static final String SYNC_ACCOUNT_WHERE_CLAUSE = SyncConstValue._SYNC_ACCOUNT + "=?"; - - protected boolean isTemporary() { - return mIsTemporary; - } - - /** - * Indicates whether or not this ContentProvider contains a full - * set of data or just diffs. This knowledge comes in handy when - * determining how to incorporate the contents of a temporary - * provider into a real provider. - */ - private boolean mContainsDiffs; - - /** - * Initializes the SyncableContentProvider - * @param dbName the filename of the database - * @param dbVersion the current version of the database schema - * @param contentUri The base Uri of the syncable content in this provider - */ - public SyncableContentProvider(String dbName, int dbVersion, Uri contentUri) { - super(); - - mDatabaseName = dbName; - mDatabaseVersion = dbVersion; - mContentUri = contentUri; - mIsTemporary = false; - setContainsDiffs(false); - if (Config.LOGV) { - Log.v(TAG, "created SyncableContentProvider " + this); - } - } + protected abstract boolean isTemporary(); /** * Close resources that must be closed. You must call this to properly release * the resources used by the SyncableContentProvider. */ - public void close() { - if (mOpenHelper != null) { - mOpenHelper.close(); // OK to call .close() repeatedly. - } - } + public abstract void close(); /** * Override to create your schema and do anything else you need to do with a new database. @@ -111,7 +44,7 @@ public abstract class SyncableContentProvider extends ContentProvider { * This method may not use getDatabase(), or call content provider methods, it must only * use the database handle passed to it. */ - protected void bootstrapDatabase(SQLiteDatabase db) {} + protected abstract void bootstrapDatabase(SQLiteDatabase db); /** * Override to upgrade your database from an old version to the version you specified. @@ -131,56 +64,7 @@ public abstract class SyncableContentProvider extends ContentProvider { * This method may not use getDatabase(), or call content provider methods, it must only * use the database handle passed to it. */ - protected void onDatabaseOpened(SQLiteDatabase db) {} - - private class DatabaseHelper extends SQLiteOpenHelper { - DatabaseHelper(Context context, String name) { - // Note: context and name may be null for temp providers - super(context, name, null, mDatabaseVersion); - } - - @Override - public void onCreate(SQLiteDatabase db) { - bootstrapDatabase(db); - mSyncState.createDatabase(db); - } - - @Override - public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { - if (!upgradeDatabase(db, oldVersion, newVersion)) { - mSyncState.discardSyncData(db, null /* all accounts */); - getContext().getContentResolver().startSync(mContentUri, new Bundle()); - } - } - - @Override - public void onOpen(SQLiteDatabase db) { - onDatabaseOpened(db); - mSyncState.onDatabaseOpened(db); - } - } - - @Override - public boolean onCreate() { - if (isTemporary()) throw new IllegalStateException("onCreate() called for temp provider"); - mOpenHelper = new DatabaseHelper(getContext(), mDatabaseName); - mSyncState = new SyncStateContentProviderHelper(mOpenHelper); - - AccountMonitorListener listener = new AccountMonitorListener() { - public void onAccountsUpdated(String[] accounts) { - // Some providers override onAccountsChanged(); give them a database to work with. - mDb = mOpenHelper.getWritableDatabase(); - onAccountsChanged(accounts); - TempProviderSyncAdapter syncAdapter = (TempProviderSyncAdapter)getSyncAdapter(); - if (syncAdapter != null) { - syncAdapter.onAccountsChanged(accounts); - } - } - }; - mAccountMonitor = new AccountMonitor(getContext(), listener); - - return true; - } + protected abstract void onDatabaseOpened(SQLiteDatabase db); /** * Get a non-persistent instance of this content provider. @@ -190,49 +74,13 @@ public abstract class SyncableContentProvider extends ContentProvider { * @return a non-persistent content provider with the same layout as this * provider. */ - public SyncableContentProvider getTemporaryInstance() { - SyncableContentProvider temp; - try { - temp = getClass().newInstance(); - } catch (InstantiationException e) { - throw new RuntimeException("unable to instantiate class, " - + "this should never happen", e); - } catch (IllegalAccessException e) { - throw new RuntimeException( - "IllegalAccess while instantiating class, " - + "this should never happen", e); - } + public abstract SyncableContentProvider getTemporaryInstance(); - // Note: onCreate() isn't run for the temp provider, and it has no Context. - temp.mIsTemporary = true; - temp.setContainsDiffs(true); - temp.mOpenHelper = temp.new DatabaseHelper(null, null); - temp.mSyncState = new SyncStateContentProviderHelper(temp.mOpenHelper); - if (!isTemporary()) { - mSyncState.copySyncState( - mOpenHelper.getReadableDatabase(), - temp.mOpenHelper.getWritableDatabase(), - getSyncingAccount()); - } - return temp; - } + public abstract SQLiteDatabase getDatabase(); - public SQLiteDatabase getDatabase() { - if (mDb == null) mDb = mOpenHelper.getWritableDatabase(); - return mDb; - } + public abstract boolean getContainsDiffs(); - public boolean getContainsDiffs() { - return mContainsDiffs; - } - - public void setContainsDiffs(boolean containsDiffs) { - if (containsDiffs && !isTemporary()) { - throw new IllegalStateException( - "only a temporary provider can contain diffs"); - } - mContainsDiffs = containsDiffs; - } + public abstract void setContainsDiffs(boolean containsDiffs); /** * Each subclass of this class should define a subclass of {@link @@ -247,133 +95,14 @@ public abstract class SyncableContentProvider extends ContentProvider { * @return A sequence of subclasses of {@link * AbstractTableMerger}, one for each table that should be merged. */ - protected Iterable getMergers() { - return Collections.emptyList(); - } - - @Override - public final int update(final Uri url, final ContentValues values, - final String selection, final String[] selectionArgs) { - mDb = mOpenHelper.getWritableDatabase(); - mDb.beginTransaction(); - try { - if (isTemporary() && mSyncState.matches(url)) { - int numRows = mSyncState.asContentProvider().update( - url, values, selection, selectionArgs); - mDb.setTransactionSuccessful(); - return numRows; - } - - int result = updateInternal(url, values, selection, selectionArgs); - mDb.setTransactionSuccessful(); - - if (!isTemporary() && result > 0) { - getContext().getContentResolver().notifyChange(url, null /* observer */, - changeRequiresLocalSync(url)); - } - - return result; - } finally { - mDb.endTransaction(); - } - } - - @Override - public final int delete(final Uri url, final String selection, - final String[] selectionArgs) { - mDb = mOpenHelper.getWritableDatabase(); - mDb.beginTransaction(); - try { - if (isTemporary() && mSyncState.matches(url)) { - int numRows = mSyncState.asContentProvider().delete(url, selection, selectionArgs); - mDb.setTransactionSuccessful(); - return numRows; - } - int result = deleteInternal(url, selection, selectionArgs); - mDb.setTransactionSuccessful(); - if (!isTemporary() && result > 0) { - getContext().getContentResolver().notifyChange(url, null /* observer */, - changeRequiresLocalSync(url)); - } - return result; - } finally { - mDb.endTransaction(); - } - } - - @Override - public final Uri insert(final Uri url, final ContentValues values) { - mDb = mOpenHelper.getWritableDatabase(); - mDb.beginTransaction(); - try { - if (isTemporary() && mSyncState.matches(url)) { - Uri result = mSyncState.asContentProvider().insert(url, values); - mDb.setTransactionSuccessful(); - return result; - } - Uri result = insertInternal(url, values); - mDb.setTransactionSuccessful(); - if (!isTemporary() && result != null) { - getContext().getContentResolver().notifyChange(url, null /* observer */, - changeRequiresLocalSync(url)); - } - return result; - } finally { - mDb.endTransaction(); - } - } - - @Override - public final int bulkInsert(final Uri uri, final ContentValues[] values) { - int size = values.length; - int completed = 0; - final boolean isSyncStateUri = mSyncState.matches(uri); - mDb = mOpenHelper.getWritableDatabase(); - mDb.beginTransaction(); - try { - for (int i = 0; i < size; i++) { - Uri result; - if (isTemporary() && isSyncStateUri) { - result = mSyncState.asContentProvider().insert(uri, values[i]); - } else { - result = insertInternal(uri, values[i]); - mDb.yieldIfContended(); - } - if (result != null) { - completed++; - } - } - mDb.setTransactionSuccessful(); - } finally { - mDb.endTransaction(); - } - if (!isTemporary() && completed == values.length) { - getContext().getContentResolver().notifyChange(uri, null /* observer */, - changeRequiresLocalSync(uri)); - } - return completed; - } + protected abstract Iterable getMergers(); /** * Check if changes to this URI can be syncable changes. * @param uri the URI of the resource that was changed * @return true if changes to this URI can be syncable changes, false otherwise */ - public boolean changeRequiresLocalSync(Uri uri) { - return true; - } - - @Override - public final Cursor query(final Uri url, final String[] projection, - final String selection, final String[] selectionArgs, - final String sortOrder) { - mDb = mOpenHelper.getReadableDatabase(); - if (isTemporary() && mSyncState.matches(url)) { - return mSyncState.asContentProvider().query( - url, projection, selection, selectionArgs, sortOrder); - } - return queryInternal(url, projection, selection, selectionArgs, sortOrder); - } + public abstract boolean changeRequiresLocalSync(Uri uri); /** * Called right before a sync is started. @@ -381,12 +110,7 @@ public abstract class SyncableContentProvider extends ContentProvider { * @param context the sync context for the operation * @param account */ - public void onSyncStart(SyncContext context, String account) { - if (TextUtils.isEmpty(account)) { - throw new IllegalArgumentException("you passed in an empty account"); - } - mSyncingAccount = account; - } + public abstract void onSyncStart(SyncContext context, String account); /** * Called right after a sync is completed @@ -394,16 +118,13 @@ public abstract class SyncableContentProvider extends ContentProvider { * @param context the sync context for the operation * @param success true if the sync succeeded, false if an error occurred */ - public void onSyncStop(SyncContext context, boolean success) { - } + public abstract void onSyncStop(SyncContext context, boolean success); /** * The account of the most recent call to onSyncStart() * @return the account */ - public String getSyncingAccount() { - return mSyncingAccount; - } + public abstract String getSyncingAccount(); /** * Merge diffs from a sync source with this content provider. @@ -415,40 +136,8 @@ public abstract class SyncableContentProvider extends ContentProvider { * a temporary content provider with the same layout as this provider containing * @param syncResult */ - public void merge(SyncContext context, SyncableContentProvider diffs, - TempProviderSyncResult result, SyncResult syncResult) { - SQLiteDatabase db = mOpenHelper.getWritableDatabase(); - db.beginTransaction(); - try { - synchronized(this) { - mIsMergeCancelled = false; - } - Iterable mergers = getMergers(); - try { - for (AbstractTableMerger merger : mergers) { - synchronized(this) { - if (mIsMergeCancelled) break; - mCurrentMerger = merger; - } - merger.merge(context, getSyncingAccount(), diffs, result, syncResult, this); - } - if (mIsMergeCancelled) return; - if (diffs != null) { - mSyncState.copySyncState( - diffs.mOpenHelper.getReadableDatabase(), - mOpenHelper.getWritableDatabase(), - getSyncingAccount()); - } - } finally { - synchronized (this) { - mCurrentMerger = null; - } - } - db.setTransactionSuccessful(); - } finally { - db.endTransaction(); - } - } + public abstract void merge(SyncContext context, SyncableContentProvider diffs, + TempProviderSyncResult result, SyncResult syncResult); /** @@ -457,19 +146,10 @@ public abstract class SyncableContentProvider extends ContentProvider { * provider is syncable). Subclasses of ContentProvider * that support canceling of sync should override this. */ - public void onSyncCanceled() { - synchronized (this) { - mIsMergeCancelled = true; - if (mCurrentMerger != null) { - mCurrentMerger.onMergeCancelled(); - } - } - } + public abstract void onSyncCanceled(); - public boolean isMergeCancelled() { - return mIsMergeCancelled; - } + public abstract boolean isMergeCancelled(); /** * Subclasses should override this instead of update(). See update() @@ -514,31 +194,7 @@ public abstract class SyncableContentProvider extends ContentProvider { * Make sure that there are no entries for accounts that no longer exist * @param accountsArray the array of currently-existing accounts */ - protected void onAccountsChanged(String[] accountsArray) { - Map accounts = new HashMap(); - for (String account : accountsArray) { - accounts.put(account, false); - } - accounts.put(SyncConstValue.NON_SYNCABLE_ACCOUNT, false); - - SQLiteDatabase db = mOpenHelper.getWritableDatabase(); - Map tableMap = db.getSyncedTables(); - Vector tables = new Vector(); - tables.addAll(tableMap.keySet()); - tables.addAll(tableMap.values()); - - db.beginTransaction(); - try { - mSyncState.onAccountsChanged(accountsArray); - for (String table : tables) { - deleteRowsForRemovedAccounts(accounts, table, - SyncConstValue._SYNC_ACCOUNT); - } - db.setTransactionSuccessful(); - } finally { - db.endTransaction(); - } - } + protected abstract void onAccountsChanged(String[] accountsArray); /** * A helper method to delete all rows whose account is not in the accounts @@ -550,71 +206,23 @@ public abstract class SyncableContentProvider extends ContentProvider { * @param accountColumnName the name of the column that is expected * to hold the account. */ - protected void deleteRowsForRemovedAccounts(Map accounts, - String table, String accountColumnName) { - SQLiteDatabase db = mOpenHelper.getWritableDatabase(); - Cursor c = db.query(table, sAccountProjection, null, null, - accountColumnName, null, null); - try { - while (c.moveToNext()) { - String account = c.getString(0); - if (TextUtils.isEmpty(account)) { - continue; - } - if (!accounts.containsKey(account)) { - int numDeleted; - numDeleted = db.delete(table, accountColumnName + "=?", new String[]{account}); - if (Config.LOGV) { - Log.v(TAG, "deleted " + numDeleted - + " records from table " + table - + " for account " + account); - } - } - } - } finally { - c.close(); - } - } + protected abstract void deleteRowsForRemovedAccounts(Map accounts, + String table, String accountColumnName); /** * Called when the sync system determines that this provider should no longer * contain records for the specified account. */ - public void wipeAccount(String account) { - SQLiteDatabase db = mOpenHelper.getWritableDatabase(); - Map tableMap = db.getSyncedTables(); - ArrayList tables = new ArrayList(); - tables.addAll(tableMap.keySet()); - tables.addAll(tableMap.values()); - - db.beginTransaction(); - - try { - // remote the SyncState data - mSyncState.discardSyncData(db, account); - - // remove the data in the synced tables - for (String table : tables) { - db.delete(table, SYNC_ACCOUNT_WHERE_CLAUSE, new String[]{account}); - } - db.setTransactionSuccessful(); - } finally { - db.endTransaction(); - } - } + public abstract void wipeAccount(String account); /** * Retrieves the SyncData bytes for the given account. The byte array returned may be null. */ - public byte[] readSyncDataBytes(String account) { - return mSyncState.readSyncDataBytes(mOpenHelper.getReadableDatabase(), account); - } + public abstract byte[] readSyncDataBytes(String account); /** * Sets the SyncData bytes for the given account. The bytes array may be null. */ - public void writeSyncDataBytes(String account, byte[] data) { - mSyncState.writeSyncDataBytes(mOpenHelper.getWritableDatabase(), account, data); - } + public abstract void writeSyncDataBytes(String account, byte[] data); } diff --git a/core/java/android/inputmethodservice/IInputMethodWrapper.java b/core/java/android/inputmethodservice/IInputMethodWrapper.java index 4108bdd654d21..9abc23ba67032 100644 --- a/core/java/android/inputmethodservice/IInputMethodWrapper.java +++ b/core/java/android/inputmethodservice/IInputMethodWrapper.java @@ -105,7 +105,8 @@ class IInputMethodWrapper extends IInputMethod.Stub mInputMethod.revokeSession((InputMethodSession)msg.obj); return; case DO_SHOW_SOFT_INPUT: - mInputMethod.showSoftInput(); + mInputMethod.showSoftInput( + msg.arg1 != 0 ? InputMethod.SHOW_EXPLICIT : 0); return; case DO_HIDE_SOFT_INPUT: mInputMethod.hideSoftInput(); @@ -162,8 +163,9 @@ class IInputMethodWrapper extends IInputMethod.Stub } } - public void showSoftInput() { - mCaller.executeOrSendMessage(mCaller.obtainMessage(DO_SHOW_SOFT_INPUT)); + public void showSoftInput(boolean explicit) { + mCaller.executeOrSendMessage(mCaller.obtainMessageI(DO_SHOW_SOFT_INPUT, + explicit ? 1 : 0)); } public void hideSoftInput() { diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java index 0588beada6cf9..21bb38ec78e35 100644 --- a/core/java/android/inputmethodservice/InputMethodService.java +++ b/core/java/android/inputmethodservice/InputMethodService.java @@ -289,9 +289,9 @@ public class InputMethodService extends AbstractInputMethodService { /** * Handle a request by the system to show the soft input area. */ - public void showSoftInput() { + public void showSoftInput(int flags) { if (DEBUG) Log.v(TAG, "showSoftInput()"); - showWindow(true); + onShowRequested(flags); } } @@ -805,6 +805,27 @@ public class InputMethodService extends AbstractInputMethodService { } } + /** + * The system has decided that it may be time to show your input method. + * This is called due to a corresponding call to your + * {@link InputMethod#showSoftInput(int) InputMethod.showSoftInput(int)} + * method. The default implementation simply calls + * {@link #showWindow(boolean)}, except if the + * {@link InputMethod#SHOW_EXPLICIT InputMethod.SHOW_EXPLICIT} flag is + * not set and the input method is running in fullscreen mode. + * + * @param flags Provides additional information about the show request, + * as per {@link InputMethod#showSoftInput(int) InputMethod.showSoftInput(int)}. + */ + public void onShowRequested(int flags) { + if ((flags&InputMethod.SHOW_EXPLICIT) == 0 && onEvaluateFullscreenMode()) { + // Don't show if this is not explicit requested by the user and + // the input method is fullscreen. That would be too disruptive. + return; + } + showWindow(true); + } + public void showWindow(boolean showInput) { if (DEBUG) Log.v(TAG, "Showing window: showInput=" + showInput + " mShowInputRequested=" + mShowInputRequested @@ -943,10 +964,13 @@ public class InputMethodService extends AbstractInputMethodService { * Close this input method's soft input area, removing it from the display. * The input method will continue running, but the user can no longer use * it to generate input by touching the screen. + * @param flags Provides additional operating flags. Currently may be + * 0 or have the {@link InputMethodManager#HIDE_IMPLICIT_ONLY + * InputMethodManager.HIDE_IMPLICIT_ONLY} bit set. */ - public void dismissSoftInput() { + public void dismissSoftInput(int flags) { ((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)) - .hideSoftInputFromInputMethod(mToken); + .hideSoftInputFromInputMethod(mToken, flags); } public boolean onKeyDown(int keyCode, KeyEvent event) { @@ -955,7 +979,7 @@ public class InputMethodService extends AbstractInputMethodService { if (mShowInputRequested) { // If the soft input area is shown, back closes it and we // consume the back key. - dismissSoftInput(); + dismissSoftInput(0); return true; } if (mShowCandidatesRequested) { diff --git a/core/java/android/inputmethodservice/KeyboardView.java b/core/java/android/inputmethodservice/KeyboardView.java index 3b5d741aba5f3..6f044b61ada63 100755 --- a/core/java/android/inputmethodservice/KeyboardView.java +++ b/core/java/android/inputmethodservice/KeyboardView.java @@ -68,6 +68,24 @@ public class KeyboardView extends View implements View.OnClickListener { * Listener for virtual keyboard events. */ public interface OnKeyboardActionListener { + + /** + * Called when the user presses a key. This is sent before the {@link #onKey} is called. + * For keys that repeat, this is only called once. + * @param primaryCode the unicode of the key being pressed. If the touch is not on a valid + * key, the value will be zero. + * @hide Pending API Council approval + */ + void onPress(int primaryCode); + + /** + * Called when the user releases a key. This is sent after the {@link #onKey} is called. + * For keys that repeat, this is only called once. + * @param primaryCode the code of the key that was released + * @hide Pending API Council approval + */ + void onRelease(int primaryCode); + /** * Send a key press to the listener. * @param primaryCode this is the key that was pressed @@ -111,6 +129,9 @@ public class KeyboardView extends View implements View.OnClickListener { private int mLabelTextSize; private int mKeyTextSize; private int mKeyTextColor; + private float mShadowRadius; + private int mShadowColor; + private float mBackgroundDimAmount; private TextView mPreviewText; private PopupWindow mPreviewPopup; @@ -150,8 +171,6 @@ public class KeyboardView extends View implements View.OnClickListener { private int mStartX; private int mStartY; - private boolean mVibrateOn; - private boolean mSoundOn; private boolean mProximityCorrectOn; private Paint mPaint; @@ -172,20 +191,15 @@ public class KeyboardView extends View implements View.OnClickListener { private int mRepeatKeyIndex = NOT_A_KEY; private int mPopupLayout; private boolean mAbortKey; + private Key mInvalidatedKey; + private Rect mClipRegion = new Rect(0, 0, 0, 0); private Drawable mKeyBackground; - - private static final String PREF_VIBRATE_ON = "vibrate_on"; - private static final String PREF_SOUND_ON = "sound_on"; - private static final String PREF_PROXIMITY_CORRECTION = "hit_correction"; private static final int REPEAT_INTERVAL = 50; // ~20 keys per second private static final int REPEAT_START_DELAY = 400; private static final int LONGPRESS_TIMEOUT = ViewConfiguration.getLongPressTimeout(); - private Vibrator mVibrator; - private long[] mVibratePattern = new long[] {1, 20}; - private static int MAX_NEARBY_KEYS = 12; private int[] mDistances = new int[MAX_NEARBY_KEYS]; @@ -269,15 +283,19 @@ public class KeyboardView extends View implements View.OnClickListener { case com.android.internal.R.styleable.KeyboardView_popupLayout: mPopupLayout = a.getResourceId(attr, 0); break; + case com.android.internal.R.styleable.KeyboardView_shadowColor: + mShadowColor = a.getColor(attr, 0); + break; + case com.android.internal.R.styleable.KeyboardView_shadowRadius: + mShadowRadius = a.getFloat(attr, 0f); + break; } } - // Get the settings preferences - SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); - mVibrateOn = sp.getBoolean(PREF_VIBRATE_ON, mVibrateOn); - mSoundOn = sp.getBoolean(PREF_SOUND_ON, mSoundOn); - mProximityCorrectOn = sp.getBoolean(PREF_PROXIMITY_CORRECTION, true); - + a = mContext.obtainStyledAttributes( + com.android.internal.R.styleable.Theme); + mBackgroundDimAmount = a.getFloat(android.R.styleable.Theme_backgroundDimAmount, 0.5f); + mPreviewPopup = new PopupWindow(context); if (previewLayout != 0) { mPreviewText = (TextView) inflate.inflate(previewLayout, null); @@ -309,7 +327,7 @@ public class KeyboardView extends View implements View.OnClickListener { resetMultiTap(); initGestureDetector(); } - + private void initGestureDetector() { mGestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() { @Override @@ -440,7 +458,26 @@ public class KeyboardView extends View implements View.OnClickListener { mPreviewPopup.dismiss(); } } - + + /** + * Enables or disables proximity correction. When enabled, {@link OnKeyboardActionListener#onKey} + * gets called with key codes for adjacent keys. Otherwise only the primary code is returned. + * @param enabled whether or not the proximity correction is enabled + * @hide Pending API Council approval + */ + public void setProximityCorrectionEnabled(boolean enabled) { + mProximityCorrectOn = enabled; + } + + /** + * Returns the enabled state of the proximity correction. + * @return true if proximity correction is enabled, false otherwise + * @hide Pending API Council approval + */ + public boolean isProximityCorrectionEnabled() { + return mProximityCorrectOn; + } + /** * Popup keyboard close button clicked. * @hide @@ -498,19 +535,37 @@ public class KeyboardView extends View implements View.OnClickListener { if (mKeyboard == null) return; final Paint paint = mPaint; - //final int descent = (int) paint.descent(); final Drawable keyBackground = mKeyBackground; + final Rect clipRegion = mClipRegion; final Rect padding = mPadding; final int kbdPaddingLeft = mPaddingLeft; final int kbdPaddingTop = mPaddingTop; - List keys = mKeyboard.getKeys(); + final List keys = mKeyboard.getKeys(); + final Key invalidKey = mInvalidatedKey; //canvas.translate(0, mKeyboardPaddingTop); paint.setAlpha(255); paint.setColor(mKeyTextColor); - + boolean drawSingleKey = false; + if (invalidKey != null && canvas.getClipBounds(clipRegion)) { +// System.out.println("Key bounds = " + (invalidKey.x + mPaddingLeft) + "," +// + (invalidKey.y + mPaddingTop) + "," +// + (invalidKey.x + invalidKey.width + mPaddingLeft) + "," +// + (invalidKey.y + invalidKey.height + mPaddingTop)); +// System.out.println("Clip bounds =" + clipRegion.toShortString()); + // Is clipRegion completely contained within the invalidated key? + if (invalidKey.x + kbdPaddingLeft - 1 <= clipRegion.left && + invalidKey.y + kbdPaddingTop - 1 <= clipRegion.top && + invalidKey.x + invalidKey.width + kbdPaddingLeft + 1 >= clipRegion.right && + invalidKey.y + invalidKey.height + kbdPaddingTop + 1 >= clipRegion.bottom) { + drawSingleKey = true; + } + } final int keyCount = keys.size(); for (int i = 0; i < keyCount; i++) { final Key key = keys.get(i); + if (drawSingleKey && invalidKey != key) { + continue; + } int[] drawableState = key.getCurrentDrawableState(); keyBackground.setState(drawableState); @@ -535,7 +590,7 @@ public class KeyboardView extends View implements View.OnClickListener { paint.setTypeface(Typeface.DEFAULT); } // Draw a drop shadow for the text - paint.setShadowLayer(3f, 0, 0, 0xCC000000); + paint.setShadowLayer(mShadowRadius, 0, 0, mShadowColor); // Draw the text canvas.drawText(label, (key.width - padding.left - padding.right) / 2 @@ -558,10 +613,10 @@ public class KeyboardView extends View implements View.OnClickListener { } canvas.translate(-key.x - kbdPaddingLeft, -key.y - kbdPaddingTop); } - + mInvalidatedKey = null; // Overlay a dark rectangle to dim the keyboard if (mMiniKeyboardOnScreen) { - paint.setColor(0xA0000000); + paint.setColor((int) (mBackgroundDimAmount * 0xFF) << 24); canvas.drawRect(0, 0, getWidth(), getHeight(), paint); } @@ -577,22 +632,6 @@ public class KeyboardView extends View implements View.OnClickListener { } } - private void playKeyClick() { - if (mSoundOn) { - playSoundEffect(0); - } - } - - private void vibrate() { - if (!mVibrateOn) { - return; - } - if (mVibrator == null) { - mVibrator = new Vibrator(); - } - mVibrator.vibrate(mVibratePattern, -1); - } - private int getKeyIndices(int x, int y, int[] allKeys) { final List keys = mKeyboard.getKeys(); final boolean shifted = mKeyboard.isShifted(); @@ -650,12 +689,12 @@ public class KeyboardView extends View implements View.OnClickListener { private void detectAndSendKey(int x, int y, long eventTime) { int index = mCurrentKey; if (index != NOT_A_KEY) { - vibrate(); final Key key = mKeyboard.getKeys().get(index); if (key.text != null) { for (int i = 0; i < key.text.length(); i++) { mKeyboardActionListener.onKey(key.text.charAt(i), key.codes); } + mKeyboardActionListener.onRelease(NOT_A_KEY); } else { int code = key.codes[0]; //TextEntryState.keyPressedAt(key, x, y); @@ -672,6 +711,7 @@ public class KeyboardView extends View implements View.OnClickListener { code = key.codes[mTapCount]; } mKeyboardActionListener.onKey(code, codes); + mKeyboardActionListener.onRelease(code); } mLastSentIndex = index; mLastTapTime = eventTime; @@ -781,6 +821,7 @@ public class KeyboardView extends View implements View.OnClickListener { return; } final Key key = mKeyboard.getKeys().get(keyIndex); + mInvalidatedKey = key; invalidate(key.x + mPaddingLeft, key.y + mPaddingTop, key.x + key.width + mPaddingLeft, key.y + key.height + mPaddingTop); } @@ -834,6 +875,12 @@ public class KeyboardView extends View implements View.OnClickListener { public void swipeRight() { } public void swipeUp() { } public void swipeDown() { } + public void onPress(int primaryCode) { + mKeyboardActionListener.onPress(primaryCode); + } + public void onRelease(int primaryCode) { + mKeyboardActionListener.onRelease(primaryCode); + } }); //mInputView.setSuggest(mSuggest); Keyboard keyboard; @@ -913,6 +960,8 @@ public class KeyboardView extends View implements View.OnClickListener { mDownTime = me.getEventTime(); mLastMoveTime = mDownTime; checkMultiTap(eventTime, keyIndex); + mKeyboardActionListener.onPress(keyIndex != NOT_A_KEY ? + mKeyboard.getKeys().get(keyIndex).codes[0] : 0); if (mCurrentKey >= 0 && mKeyboard.getKeys().get(mCurrentKey).repeatable) { mRepeatKeyIndex = mCurrentKey; repeatKey(); @@ -924,8 +973,6 @@ public class KeyboardView extends View implements View.OnClickListener { mHandler.sendMessageDelayed(msg, LONGPRESS_TIMEOUT); } showPreview(keyIndex); - playKeyClick(); - vibrate(); break; case MotionEvent.ACTION_MOVE: diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java index c3bb967635d57..5f7f91f4b9b07 100644 --- a/core/java/android/os/Debug.java +++ b/core/java/android/os/Debug.java @@ -182,11 +182,11 @@ public final class Debug } /** - * Change the JDWP port -- this is a temporary measure. + * Change the JDWP port. * - * If a debugger is currently attached the change may not happen - * until after the debugger disconnects. + * @deprecated no longer needed or useful */ + @Deprecated public static void changeDebugPort(int port) {} /** diff --git a/core/java/android/provider/Calendar.java b/core/java/android/provider/Calendar.java index b137b34b33d1a..d75a25fe8a35d 100644 --- a/core/java/android/provider/Calendar.java +++ b/core/java/android/provider/Calendar.java @@ -16,19 +16,6 @@ package android.provider; -import com.google.android.gdata.client.AndroidGDataClient; -import com.google.android.gdata.client.AndroidXmlParserFactory; -import com.google.wireless.gdata.calendar.client.CalendarClient; -import com.google.wireless.gdata.calendar.data.EventEntry; -import com.google.wireless.gdata.calendar.data.Who; -import com.google.wireless.gdata.calendar.parser.xml.XmlCalendarGDataParserFactory; -import com.google.wireless.gdata.client.AuthenticationException; -import com.google.wireless.gdata.client.AllDeletedUnavailableException; -import com.google.wireless.gdata.data.Entry; -import com.google.wireless.gdata.data.StringUtils; -import com.google.wireless.gdata.parser.ParseException; -import com.android.internal.database.ArrayListCursor; - import android.app.AlarmManager; import android.app.PendingIntent; import android.content.ContentResolver; @@ -45,8 +32,15 @@ import android.text.format.DateUtils; import android.text.format.Time; import android.util.Config; import android.util.Log; +import com.android.internal.database.ArrayListCursor; +import com.google.android.gdata.client.AndroidGDataClient; +import com.google.android.gdata.client.AndroidXmlParserFactory; +import com.google.wireless.gdata.calendar.client.CalendarClient; +import com.google.wireless.gdata.calendar.data.EventEntry; +import com.google.wireless.gdata.calendar.data.Who; +import com.google.wireless.gdata.calendar.parser.xml.XmlCalendarGDataParserFactory; +import com.google.wireless.gdata.data.StringUtils; -import java.io.IOException; import java.util.ArrayList; import java.util.Vector; @@ -921,10 +915,31 @@ public final class Calendar { */ public static final String ALARM_TIME = "alarmTime"; + /** + * The creation time of this database entry, in UTC. + * (Useful for debugging missed reminders.) + *

Type: INTEGER (long; millis since epoch)

+ */ + public static final String CREATION_TIME = "creationTime"; + + /** + * The time that the alarm broadcast was received by the Calendar app, + * in UTC. (Useful for debugging missed reminders.) + *

Type: INTEGER (long; millis since epoch)

+ */ + public static final String RECEIVED_TIME = "receivedTime"; + + /** + * The time that the notification was created by the Calendar app, + * in UTC. (Useful for debugging missed reminders.) + *

Type: INTEGER (long; millis since epoch)

+ */ + public static final String NOTIFY_TIME = "notifyTime"; + /** * The state of this alert. It starts out as SCHEDULED, then when * the alarm goes off, it changes to FIRED, and then when the user - * sees and dismisses the alarm it changes to DISMISSED. + * dismisses the alarm it changes to DISMISSED. *

Type: INTEGER

*/ public static final String STATE = "state"; @@ -966,6 +981,10 @@ public final class Calendar { values.put(CalendarAlerts.BEGIN, begin); values.put(CalendarAlerts.END, end); values.put(CalendarAlerts.ALARM_TIME, alarmTime); + long currentTime = System.currentTimeMillis(); + values.put(CalendarAlerts.CREATION_TIME, currentTime); + values.put(CalendarAlerts.RECEIVED_TIME, 0); + values.put(CalendarAlerts.NOTIFY_TIME, 0); values.put(CalendarAlerts.STATE, SCHEDULED); values.put(CalendarAlerts.MINUTES, minutes); return cr.insert(CONTENT_URI, values); diff --git a/core/java/android/provider/Gmail.java b/core/java/android/provider/Gmail.java index 0b6a7588eaf14..1bbcc3342335b 100644 --- a/core/java/android/provider/Gmail.java +++ b/core/java/android/provider/Gmail.java @@ -1433,6 +1433,11 @@ public final class Gmail { return SORTED_USER_MEANINGFUL_SYSTEM_LABELS; } + /** + * If you are ever tempted to remove outbox or draft from this set make sure you have a + * way to stop draft and outbox messages from getting purged before they are sent to the + * server. + */ private static final Set FORCED_INCLUDED_LABELS = Sets.newHashSet(LABEL_OUTBOX, LABEL_DRAFT); diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java index 7b2f18ca9235d..0184db83ff7b6 100644 --- a/core/java/android/provider/MediaStore.java +++ b/core/java/android/provider/MediaStore.java @@ -1303,6 +1303,16 @@ public final class MediaStore *

Type: TEXT

*/ public static final String BUCKET_DISPLAY_NAME = "bucket_display_name"; + + /** + * The bookmark for the video. Time in ms. Represents the location in the video that the + * video should start playing at the next time it is opened. If the value is null or + * out of the range 0..DURATION-1 then the video should start playing from the + * beginning. + * @hide + *

Type: INTEGER

+ */ + public static final String BOOKMARK = "bookmark"; } public static final class Media implements VideoColumns { diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 91624adce91a6..7b64405177624 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -25,7 +25,10 @@ import android.annotation.SdkConstant.SdkConstantType; import android.content.ContentQueryMap; import android.content.ContentResolver; import android.content.ContentValues; +import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.content.res.Configuration; import android.content.res.Resources; import android.database.Cursor; @@ -37,6 +40,7 @@ import android.text.TextUtils; import android.util.AndroidException; import android.util.Log; +import java.net.URISyntaxException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.HashMap; @@ -854,6 +858,43 @@ public final class Settings { */ public static final String WIFI_IDLE_MS = "wifi_idle_ms"; + /** + * The policy for deciding when Wi-Fi should go to sleep (which will in + * turn switch to using the mobile data as an Internet connection). + *

+ * Set to one of {@link #WIFI_SLEEP_POLICY_DEFAULT}, + * {@link #WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED}, or + * {@link #WIFI_SLEEP_POLICY_NEVER}. + * + * @hide pending API council + */ + public static final String WIFI_SLEEP_POLICY = "wifi_sleep_policy"; + + /** + * Value for {@link #WIFI_SLEEP_POLICY} to use the default Wi-Fi sleep + * policy, which is to sleep shortly after the turning off + * according to the {@link #STAY_ON_WHILE_PLUGGED_IN} setting. + * + * @hide pending API council + */ + public static final int WIFI_SLEEP_POLICY_DEFAULT = 0; + + /** + * Value for {@link #WIFI_SLEEP_POLICY} to use the default policy when + * the device is on battery, and never go to sleep when the device is + * plugged in. + * + * @hide pending API council + */ + public static final int WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED = 1; + + /** + * Value for {@link #WIFI_SLEEP_POLICY} to never go to sleep. + * + * @hide pending API council + */ + public static final int WIFI_SLEEP_POLICY_NEVER = 2; + /** * Whether to use static IP and other static network attributes. *

@@ -2674,7 +2715,12 @@ public final class Settings { /** * Descriptive name of the bookmark that can be displayed to the user. - *

Type: TEXT

+ * If this is empty, the title should be resolved at display time (use + * {@link #getTitle(Context, Cursor)} any time you want to display the + * title of a bookmark.) + *

+ * Type: TEXT + *

*/ public static final String TITLE = "title"; @@ -2754,17 +2800,16 @@ public final class Settings { /** * Add a new bookmark to the system. - * + * * @param cr The ContentResolver to query. * @param intent The desired target of the bookmark. - * @param title Bookmark title that is shown to the user; null if none. + * @param title Bookmark title that is shown to the user; null if none + * or it should be resolved to the intent's title. * @param folder Folder in which to place the bookmark; null if none. - * @param shortcut Shortcut that will invoke the bookmark; 0 if none. - * If this is non-zero and there is an existing - * bookmark entry with this same shortcut, then that - * existing shortcut is cleared (the bookmark is not - * removed). - * + * @param shortcut Shortcut that will invoke the bookmark; 0 if none. If + * this is non-zero and there is an existing bookmark entry + * with this same shortcut, then that existing shortcut is + * cleared (the bookmark is not removed). * @return The unique content URL for the new bookmark entry. */ public static Uri add(ContentResolver cr, @@ -2813,9 +2858,49 @@ public final class Settings { * @return CharSequence The label for this folder that should be shown * to the user. */ - public static CharSequence labelForFolder(Resources r, String folder) { + public static CharSequence getLabelForFolder(Resources r, String folder) { return folder; } + + /** + * Return the title as it should be displayed to the user. This takes + * care of localizing bookmarks that point to activities. + * + * @param context A context. + * @param cursor A cursor pointing to the row whose title should be + * returned. The cursor must contain at least the + * {@link #TITLE} and {@link #INTENT} columns. + * @return A title that is localized and can be displayed to the user. + */ + public static CharSequence getTitle(Context context, Cursor cursor) { + int titleColumn = cursor.getColumnIndex(TITLE); + int intentColumn = cursor.getColumnIndex(INTENT); + if (titleColumn == -1 || intentColumn == -1) { + throw new IllegalArgumentException( + "The cursor must contain the TITLE and INTENT columns."); + } + + String title = cursor.getString(titleColumn); + if (!TextUtils.isEmpty(title)) { + return title; + } + + String intentUri = cursor.getString(intentColumn); + if (TextUtils.isEmpty(intentUri)) { + return ""; + } + + Intent intent; + try { + intent = Intent.getIntent(intentUri); + } catch (URISyntaxException e) { + return ""; + } + + PackageManager packageManager = context.getPackageManager(); + ResolveInfo info = packageManager.resolveActivity(intent, 0); + return info.loadLabel(packageManager); + } } /** diff --git a/core/java/android/server/BluetoothA2dpService.java b/core/java/android/server/BluetoothA2dpService.java index ded50e457aca0..90ef8f68a987b 100644 --- a/core/java/android/server/BluetoothA2dpService.java +++ b/core/java/android/server/BluetoothA2dpService.java @@ -53,6 +53,8 @@ public class BluetoothA2dpService extends IBluetoothA2dp.Stub { private static final String BLUETOOTH_ADMIN_PERM = android.Manifest.permission.BLUETOOTH_ADMIN; private static final String BLUETOOTH_PERM = android.Manifest.permission.BLUETOOTH; + private static final String A2DP_SINK_ADDRESS = "a2dp_sink_address"; + private final Context mContext; private final IntentFilter mIntentFilter; private HashMap mAudioDevices; @@ -251,6 +253,7 @@ public class BluetoothA2dpService extends IBluetoothA2dp.Stub { } } + mAudioManager.setParameter(A2DP_SINK_ADDRESS, lookupAddress(path)); mAudioManager.setBluetoothA2dpOn(true); updateState(path, BluetoothA2dp.STATE_CONNECTED); } @@ -302,13 +305,15 @@ public class BluetoothA2dpService extends IBluetoothA2dp.Stub { s.state = state; } - if (DBG) log("state " + address + " (" + path + ") " + prevState + "->" + state); - - Intent intent = new Intent(BluetoothA2dp.SINK_STATE_CHANGED_ACTION); - intent.putExtra(BluetoothIntent.ADDRESS, address); - intent.putExtra(BluetoothA2dp.SINK_PREVIOUS_STATE, prevState); - intent.putExtra(BluetoothA2dp.SINK_STATE, state); - mContext.sendBroadcast(intent, BLUETOOTH_PERM); + if (state != prevState) { + if (DBG) log("state " + address + " (" + path + ") " + prevState + "->" + state); + + Intent intent = new Intent(BluetoothA2dp.SINK_STATE_CHANGED_ACTION); + intent.putExtra(BluetoothIntent.ADDRESS, address); + intent.putExtra(BluetoothA2dp.SINK_PREVIOUS_STATE, prevState); + intent.putExtra(BluetoothA2dp.SINK_STATE, state); + mContext.sendBroadcast(intent, BLUETOOTH_PERM); + } } @Override diff --git a/core/java/android/speech/srec/WaveHeader.java b/core/java/android/speech/srec/WaveHeader.java new file mode 100644 index 0000000000000..0aa3cc22aa4d5 --- /dev/null +++ b/core/java/android/speech/srec/WaveHeader.java @@ -0,0 +1,267 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed 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. + */ + +package android.speech.srec; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +/** + * This class represents the header of a WAVE format audio file, which usually + * have a .wav suffix. The following integer valued fields are contained: + *
    + *
  • format - usually PCM, ALAW or ULAW. + *
  • numChannels - 1 for mono, 2 for stereo. + *
  • sampleRate - usually 8000, 11025, 16000, 22050, or 44100 hz. + *
  • bitsPerSample - usually 16 for PCM, 8 for ALAW, or 8 for ULAW. + *
  • numBytes - size of audio data after this header, in bytes. + *
+ * @hide pending API council approval + */ +public class WaveHeader { + + // follows WAVE format in http://ccrma.stanford.edu/courses/422/projects/WaveFormat + + private static final String TAG = "WaveHeader"; + + private static final int HEADER_LENGTH = 44; + + /** Indicates PCM format. */ + public static final short FORMAT_PCM = 1; + /** Indicates ALAW format. */ + public static final short FORMAT_ALAW = 6; + /** Indicates ULAW format. */ + public static final short FORMAT_ULAW = 7; + + private short mFormat; + private short mNumChannels; + private int mSampleRate; + private short mBitsPerSample; + private int mNumBytes; + + /** + * Construct a WaveHeader, with all fields defaulting to zero. + */ + public WaveHeader() { + } + + /** + * Construct a WaveHeader, with fields initialized. + * @param format format of audio data, + * one of {@link #FORMAT_PCM}, {@link #FORMAT_ULAW}, or {@link #FORMAT_ALAW}. + * @param numChannels 1 for mono, 2 for stereo. + * @param sampleRate typically 8000, 11025, 16000, 22050, or 44100 hz. + * @param bitsPerSample usually 16 for PCM, 8 for ULAW or 8 for ALAW. + * @param numBytes size of audio data after this header, in bytes. + */ + public WaveHeader(short format, short numChannels, int sampleRate, short bitsPerSample, int numBytes) { + mFormat = format; + mSampleRate = sampleRate; + mNumChannels = numChannels; + mBitsPerSample = bitsPerSample; + mNumBytes = numBytes; + } + + /** + * Get the format field. + * @return format field, + * one of {@link #FORMAT_PCM}, {@link #FORMAT_ULAW}, or {@link #FORMAT_ALAW}. + */ + public short getFormat() { + return mFormat; + } + + /** + * Set the format field. + * @param format + * one of {@link #FORMAT_PCM}, {@link #FORMAT_ULAW}, or {@link #FORMAT_ALAW}. + * @return reference to this WaveHeader instance. + */ + public WaveHeader setFormat(short format) { + mFormat = format; + return this; + } + + /** + * Get the number of channels. + * @return number of channels, 1 for mono, 2 for stereo. + */ + public short getNumChannels() { + return mNumChannels; + } + + /** + * Set the number of channels. + * @param numChannels 1 for mono, 2 for stereo. + * @return reference to this WaveHeader instance. + */ + public WaveHeader setNumChannels(short numChannels) { + mNumChannels = numChannels; + return this; + } + + /** + * Get the sample rate. + * @return sample rate, typically 8000, 11025, 16000, 22050, or 44100 hz. + */ + public int getSampleRate() { + return mSampleRate; + } + + /** + * Set the sample rate. + * @param sampleRate sample rate, typically 8000, 11025, 16000, 22050, or 44100 hz. + * @return reference to this WaveHeader instance. + */ + public WaveHeader setSampleRate(int sampleRate) { + mSampleRate = sampleRate; + return this; + } + + /** + * Get the number of bits per sample. + * @return number of bits per sample, + * usually 16 for PCM, 8 for ULAW or 8 for ALAW. + */ + public short getBitsPerSample() { + return mBitsPerSample; + } + + /** + * Set the number of bits per sample. + * @param bitsPerSample number of bits per sample, + * usually 16 for PCM, 8 for ULAW or 8 for ALAW. + * @return reference to this WaveHeader instance. + */ + public WaveHeader setBitsPerSample(short bitsPerSample) { + mBitsPerSample = bitsPerSample; + return this; + } + + /** + * Get the size of audio data after this header, in bytes. + * @return size of audio data after this header, in bytes. + */ + public int getNumBytes() { + return mNumBytes; + } + + /** + * Set the size of audio data after this header, in bytes. + * @param numBytes size of audio data after this header, in bytes. + * @return reference to this WaveHeader instance. + */ + public WaveHeader setNumBytes(int numBytes) { + mNumBytes = numBytes; + return this; + } + + /** + * Read and initialize a WaveHeader. + * @param in {@link java.io.InputStream} to read from. + * @return number of bytes consumed. + * @throws IOException + */ + public int read(InputStream in) throws IOException { + /* RIFF header */ + readId(in, "RIFF"); + int numBytes = readInt(in) - 36; + readId(in, "WAVE"); + + /* fmt chunk */ + readId(in, "fmt "); + if (16 != readInt(in)) throw new IOException("fmt chunk length not 16"); + mFormat = readShort(in); + mNumChannels = readShort(in); + mSampleRate = readInt(in); + int byteRate = readInt(in); + short blockAlign = readShort(in); + mBitsPerSample = readShort(in); + if (byteRate != mNumChannels * mSampleRate * mBitsPerSample / 8) { + throw new IOException("fmt.ByteRate field inconsistent"); + } + if (blockAlign != mNumChannels * mBitsPerSample / 8) { + throw new IOException("fmt.BlockAlign field inconsistent"); + } + + /* data chunk */ + readId(in, "data"); + mNumBytes = readInt(in); + + return HEADER_LENGTH; + } + + private static void readId(InputStream in, String id) throws IOException { + for (int i = 0; i < id.length(); i++) { + if (id.charAt(i) != in.read()) throw new IOException( id + " tag not present"); + } + } + + private static int readInt(InputStream in) throws IOException { + return in.read() | (in.read() << 8) | (in.read() << 16) | (in.read() << 24); + } + + private static short readShort(InputStream in) throws IOException { + return (short)(in.read() | (in.read() << 8)); + } + + /** + * Write a WAVE file header. + * @param out {@link java.io.OutputStream} to receive the header. + * @return number of bytes written. + * @throws IOException + */ + public int write(OutputStream out) throws IOException { + /* RIFF header */ + writeId(out, "RIFF"); + writeInt(out, 36 + mNumBytes); + writeId(out, "WAVE"); + + /* fmt chunk */ + writeId(out, "fmt "); + writeInt(out, 16); + writeShort(out, mFormat); + writeShort(out, mNumChannels); + writeInt(out, mSampleRate); + writeInt(out, mNumChannels * mSampleRate * mBitsPerSample / 8); + writeShort(out, (short)(mNumChannels * mBitsPerSample / 8)); + writeShort(out, mBitsPerSample); + + /* data chunk */ + writeId(out, "data"); + writeInt(out, mNumBytes); + + return HEADER_LENGTH; + } + + private static void writeId(OutputStream out, String id) throws IOException { + for (int i = 0; i < id.length(); i++) out.write(id.charAt(i)); + } + + private static void writeInt(OutputStream out, int val) throws IOException { + out.write(val >> 0); + out.write(val >> 8); + out.write(val >> 16); + out.write(val >> 24); + } + + private static void writeShort(OutputStream out, short val) throws IOException { + out.write(val >> 0); + out.write(val >> 8); + } + +} diff --git a/core/java/android/text/format/DateFormat.java b/core/java/android/text/format/DateFormat.java index 34379781dcedf..73adedf4229ae 100644 --- a/core/java/android/text/format/DateFormat.java +++ b/core/java/android/text/format/DateFormat.java @@ -70,7 +70,7 @@ import java.text.SimpleDateFormat; "MMMM dd, yyyy h:mmaa" -> "April 6, 1970 3:23am"
"E, MMMM dd, yyyy h:mmaa" -> "Mon, April 6, 1970 3:23am&
"EEEE, MMMM dd, yyyy h:mmaa" -> "Monday, April 6, 1970 3:23am"
- "'Best day evar: 'M/d/yy" -> "Best day evar: 4/6/70" + "'Noteworthy day: 'M/d/yy" -> "Noteworthy day: 4/6/70" */ public class DateFormat { diff --git a/core/java/android/util/DayOfMonthCursor.java b/core/java/android/util/DayOfMonthCursor.java index 52ee00e6f5743..393b98e324d3e 100644 --- a/core/java/android/util/DayOfMonthCursor.java +++ b/core/java/android/util/DayOfMonthCursor.java @@ -68,6 +68,20 @@ public class DayOfMonthCursor extends MonthDisplayHelper { public int getSelectedDayOfMonth() { return getDayAt(mRow, mColumn); } + + /** + * @return 0 if the selection is in the current month, otherwise -1 or +1 + * depending on whether the selection is in the first or last row. + */ + public int getSelectedMonthOffset() { + if (isWithinCurrentMonth(mRow, mColumn)) { + return 0; + } + if (mRow == 0) { + return -1; + } + return 1; + } public void setSelectedDayOfMonth(int dayOfMonth) { mRow = getRowOf(dayOfMonth); diff --git a/core/java/android/util/Log.java b/core/java/android/util/Log.java index 24f67cd0bf226..257267924cc3e 100644 --- a/core/java/android/util/Log.java +++ b/core/java/android/util/Log.java @@ -86,7 +86,7 @@ public final class Log { /** * Send a {@link #VERBOSE} log message. - * @param tag Used to identify the source of a log message. It usually identfies + * @param tag Used to identify the source of a log message. It usually identifies * the class or activity where the log call occurs. * @param msg The message you would like logged. */ @@ -96,7 +96,7 @@ public final class Log { /** * Send a {@link #VERBOSE} log message and log the exception. - * @param tag Used to identify the source of a log message. It usually identfies + * @param tag Used to identify the source of a log message. It usually identifies * the class or activity where the log call occurs. * @param msg The message you would like logged. * @param tr An exception to log @@ -107,7 +107,7 @@ public final class Log { /** * Send a {@link #DEBUG} log message. - * @param tag Used to identify the source of a log message. It usually identfies + * @param tag Used to identify the source of a log message. It usually identifies * the class or activity where the log call occurs. * @param msg The message you would like logged. */ @@ -117,7 +117,7 @@ public final class Log { /** * Send a {@link #DEBUG} log message and log the exception. - * @param tag Used to identify the source of a log message. It usually identfies + * @param tag Used to identify the source of a log message. It usually identifies * the class or activity where the log call occurs. * @param msg The message you would like logged. * @param tr An exception to log @@ -128,7 +128,7 @@ public final class Log { /** * Send an {@link #INFO} log message. - * @param tag Used to identify the source of a log message. It usually identfies + * @param tag Used to identify the source of a log message. It usually identifies * the class or activity where the log call occurs. * @param msg The message you would like logged. */ @@ -138,7 +138,7 @@ public final class Log { /** * Send a {@link #INFO} log message and log the exception. - * @param tag Used to identify the source of a log message. It usually identfies + * @param tag Used to identify the source of a log message. It usually identifies * the class or activity where the log call occurs. * @param msg The message you would like logged. * @param tr An exception to log @@ -149,7 +149,7 @@ public final class Log { /** * Send a {@link #WARN} log message. - * @param tag Used to identify the source of a log message. It usually identfies + * @param tag Used to identify the source of a log message. It usually identifies * the class or activity where the log call occurs. * @param msg The message you would like logged. */ @@ -159,7 +159,7 @@ public final class Log { /** * Send a {@link #WARN} log message and log the exception. - * @param tag Used to identify the source of a log message. It usually identfies + * @param tag Used to identify the source of a log message. It usually identifies * the class or activity where the log call occurs. * @param msg The message you would like logged. * @param tr An exception to log @@ -190,7 +190,7 @@ public final class Log { /* * Send a {@link #WARN} log message and log the exception. - * @param tag Used to identify the source of a log message. It usually identfies + * @param tag Used to identify the source of a log message. It usually identifies * the class or activity where the log call occurs. * @param tr An exception to log */ @@ -200,7 +200,7 @@ public final class Log { /** * Send an {@link #ERROR} log message. - * @param tag Used to identify the source of a log message. It usually identfies + * @param tag Used to identify the source of a log message. It usually identifies * the class or activity where the log call occurs. * @param msg The message you would like logged. */ @@ -210,7 +210,7 @@ public final class Log { /** * Send a {@link #ERROR} log message and log the exception. - * @param tag Used to identify the source of a log message. It usually identfies + * @param tag Used to identify the source of a log message. It usually identifies * the class or activity where the log call occurs. * @param msg The message you would like logged. * @param tr An exception to log @@ -238,7 +238,7 @@ public final class Log { /** * Low-level logging call. * @param priority The priority/type of this log message - * @param tag Used to identify the source of a log message. It usually identfies + * @param tag Used to identify the source of a log message. It usually identifies * the class or activity where the log call occurs. * @param msg The message you would like logged. * @return The number of bytes written. diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index d89c7b45f9393..40251dbbd2445 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -67,6 +67,7 @@ interface IWindowManager int getAppOrientation(IApplicationToken token); void setFocusedApp(IBinder token, boolean moveFocusNow); void prepareAppTransition(int transit); + int getPendingAppTransition(); void executeAppTransition(); void setAppStartingWindow(IBinder token, String pkg, int theme, CharSequence nonLocalizedLabel, int labelRes, diff --git a/core/java/android/view/RawInputEvent.java b/core/java/android/view/RawInputEvent.java index 580a80d70bf6b..30da83ecd08ee 100644 --- a/core/java/android/view/RawInputEvent.java +++ b/core/java/android/view/RawInputEvent.java @@ -10,8 +10,9 @@ package android.view; public class RawInputEvent { // Event class as defined by EventHub. public static final int CLASS_KEYBOARD = 0x00000001; - public static final int CLASS_TOUCHSCREEN = 0x00000002; - public static final int CLASS_TRACKBALL = 0x00000004; + public static final int CLASS_ALPHAKEY = 0x00000002; + public static final int CLASS_TOUCHSCREEN = 0x00000004; + public static final int CLASS_TRACKBALL = 0x00000008; // More special classes for QueuedEvent below. public static final int CLASS_CONFIGURATION_CHANGED = 0x10000000; diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 1cc7b60ac8ead..85f482c61cf9c 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -1670,6 +1670,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback { int viewFlagValues = 0; int viewFlagMasks = 0; + boolean setScrollContainer = false; + int x = 0; int y = 0; @@ -1796,6 +1798,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback { viewFlagMasks |= SCROLLBARS_STYLE_MASK; } break; + case R.styleable.View_isScrollContainer: + setScrollContainer = true; + if (a.getBoolean(attr, false)) { + setScrollContainer(true); + } + break; case com.android.internal.R.styleable.View_keepScreenOn: if (a.getBoolean(attr, false)) { viewFlagValues |= KEEP_SCREEN_ON; @@ -1856,6 +1864,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback { scrollTo(x, y); } + if (!setScrollContainer && (viewFlagValues&SCROLLBARS_VERTICAL) != 0) { + setScrollContainer(true); + } + a.recycle(); } @@ -3554,11 +3566,29 @@ public class View implements Drawable.Callback, KeyEvent.Callback { return false; } + /** + * Check whether the called view is a text editor, in which case it + * would make sense to automatically display a soft input window for + * it. Subclasses should override this if they implement + * {@link #onCreateInputConnection(EditorInfo)} to return true if + * a call on that method would return a non-null InputConnection. The + * default implementation always returns false. + * + * @return Returns true if this view is a text editor, else false. + */ + public boolean onCheckIsTextEditor() { + return false; + } + /** * Create a new InputConnection for an InputMethod to interact * with the view. The default implementation returns null, since it doesn't * support input methods. You can override this to implement such support. * This is only needed for views that take focus and text input. + * + *

When implementing this, you probably also want to implement + * {@link #onCheckIsTextEditor()} to indicate you will return a + * non-null InputConnection. * * @param outAttrs Fill in with attribute information about the connection. */ diff --git a/core/java/android/view/ViewRoot.java b/core/java/android/view/ViewRoot.java index a254edb987770..9d7a124cb01ab 100644 --- a/core/java/android/view/ViewRoot.java +++ b/core/java/android/view/ViewRoot.java @@ -1579,9 +1579,16 @@ public final class ViewRoot extends Handler implements ViewParent, InputMethodManager imm = InputMethodManager.peekInstance(); if (imm != null) { imm.onWindowFocus(mView.findFocus(), - mWindowAttributes.softInputMode, !mHasHadWindowFocus, - mWindowAttributes.flags); + mWindowAttributes.softInputMode, + !mHasHadWindowFocus, mWindowAttributes.flags); } + // Clear the forward bit. We can just do this directly, since + // the window manager doesn't care about it. + mWindowAttributes.softInputMode &= + ~WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION; + ((WindowManager.LayoutParams)mView.getLayoutParams()) + .softInputMode &= + ~WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION; mHasHadWindowFocus = true; } } @@ -2030,14 +2037,20 @@ public final class ViewRoot extends Handler implements ViewParent, } return; } - InputMethodManager imm = InputMethodManager.peekInstance(); - if (imm != null && mView != null && imm.isActive()) { - int seq = enqueuePendingEvent(event, sendDone); - if (DEBUG_IMF) Log.v(TAG, "Sending key event to IME: seq=" - + seq + " event=" + event); - imm.dispatchKeyEvent(mView.getContext(), seq, event, - mInputMethodCallback); - return; + // If it is possible for this window to interact with the input + // method window, then we want to first dispatch our key events + // to the input method. + if (WindowManager.LayoutParams.mayUseInputMethod( + mWindowAttributes.flags)) { + InputMethodManager imm = InputMethodManager.peekInstance(); + if (imm != null && mView != null && imm.isActive()) { + int seq = enqueuePendingEvent(event, sendDone); + if (DEBUG_IMF) Log.v(TAG, "Sending key event to IME: seq=" + + seq + " event=" + event); + imm.dispatchKeyEvent(mView.getContext(), seq, event, + mInputMethodCallback); + return; + } } deliverKeyEventToViewHierarchy(event, sendDone); } diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index 7d202aac7e6f7..7e47ad1748a30 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -466,18 +466,35 @@ public interface WindowManager extends ViewManager { */ public static final int FLAG_WATCH_OUTSIDE_TOUCH = 0x00040000; - /** Window flag: set when this window was created from the restored - * state of a previous window, indicating this is not the first time - * the user has navigated to it. - */ - public static final int FLAG_RESTORED_STATE = 0x00080000; - /** Window flag: a special option intended for system dialogs. When * this flag is set, the window will demand focus unconditionally when * it is created. * {@hide} */ public static final int FLAG_SYSTEM_ERROR = 0x40000000; + /** + * Given a particular set of window manager flags, determine whether + * such a window may be a target for an input method when it has + * focus. In particular, this checks the + * {@link #FLAG_NOT_FOCUSABLE} and {@link #FLAG_ALT_FOCUSABLE_IM} + * flags and returns true if the combination of the two corresponds + * to a window that needs to be behind the input method so that the + * user can type into it. + * + * @param flags The current window manager flags. + * + * @return Returns true if such a window should be behind/interact + * with an input method, false if not. + */ + public static boolean mayUseInputMethod(int flags) { + switch (flags&(FLAG_NOT_FOCUSABLE|FLAG_ALT_FOCUSABLE_IM)) { + case 0: + case FLAG_NOT_FOCUSABLE|FLAG_ALT_FOCUSABLE_IM: + return true; + } + return false; + } + /** * Mask for {@link #softInputMode} of the bits that determine the * desired visibility state of the soft input area for this window. @@ -502,16 +519,17 @@ public interface WindowManager extends ViewManager { public static final int SOFT_INPUT_STATE_HIDDEN = 2; /** - * Visibility state for {@link #softInputMode}: please show the soft input area - * the first time the window is shown. + * Visibility state for {@link #softInputMode}: please show the soft + * input area when normally appropriate (when the user is navigating + * forward to your window). */ - public static final int SOFT_INPUT_STATE_FIRST_VISIBLE = 3; + public static final int SOFT_INPUT_STATE_VISIBLE = 3; /** - * Visibility state for {@link #softInputMode}: please always show the soft - * input area. + * Visibility state for {@link #softInputMode}: please always make the + * soft input area visible when this window receives input focus. */ - public static final int SOFT_INPUT_STATE_VISIBLE = 4; + public static final int SOFT_INPUT_STATE_ALWAYS_VISIBLE = 4; /** * Mask for {@link #softInputMode} of the bits that determine the @@ -546,6 +564,15 @@ public interface WindowManager extends ViewManager { */ public static final int SOFT_INPUT_ADJUST_PAN = 0x20; + /** + * Bit for {@link #softInputMode}: set when the user has navigated + * forward to the window. This is normally set automatically for + * you by the system, though you may want to set it in certain cases + * when you are displaying a window yourself. This flag will always + * be cleared automatically after the window is displayed. + */ + public static final int SOFT_INPUT_IS_FORWARD_NAVIGATION = 0x100; + /** * Desired operating mode for any soft input area. May any combination * of: @@ -553,7 +580,7 @@ public interface WindowManager extends ViewManager { *

    *
  • One of the visibility states * {@link #SOFT_INPUT_STATE_UNSPECIFIED}, {@link #SOFT_INPUT_STATE_UNCHANGED}, - * {@link #SOFT_INPUT_STATE_HIDDEN}, {@link #SOFT_INPUT_STATE_FIRST_VISIBLE}, or + * {@link #SOFT_INPUT_STATE_HIDDEN}, {@link #SOFT_INPUT_STATE_ALWAYS_VISIBLE}, or * {@link #SOFT_INPUT_STATE_VISIBLE}. *
  • One of the adjustment options * {@link #SOFT_INPUT_ADJUST_UNSPECIFIED}, diff --git a/core/java/android/view/animation/Animation.java b/core/java/android/view/animation/Animation.java index d1d549c76a274..92643989e6128 100644 --- a/core/java/android/view/animation/Animation.java +++ b/core/java/android/view/animation/Animation.java @@ -118,7 +118,12 @@ public abstract class Animation { * Indicates whether the animation transformation should be applied after the * animation ends. */ - boolean mFillAfter = true; + boolean mFillAfter = false; + + /** + * Indicates whether fillAfter should be taken into account. + */ + boolean mFillEnabled = false; /** * The time in milliseconds at which the animation must start; @@ -193,6 +198,7 @@ public abstract class Animation { setDuration((long) a.getInt(com.android.internal.R.styleable.Animation_duration, 0)); setStartOffset((long) a.getInt(com.android.internal.R.styleable.Animation_startOffset, 0)); + setFillEnabled(a.getBoolean(com.android.internal.R.styleable.Animation_fillEnabled, mFillEnabled)); setFillBefore(a.getBoolean(com.android.internal.R.styleable.Animation_fillBefore, mFillBefore)); setFillAfter(a.getBoolean(com.android.internal.R.styleable.Animation_fillAfter, mFillAfter)); @@ -405,6 +411,31 @@ public abstract class Animation { mRepeatCount = repeatCount; } + /** + * If fillEnabled is true, this animation will apply fillBefore and fillAfter. + * + * @return true if the animation will take fillBefore and fillAfter into account + * @attr ref android.R.styleable#Animation_fillEnabled + */ + public boolean isFillEnabled() { + return mFillEnabled; + } + + /** + * If fillEnabled is true, the animation will apply the value of fillBefore and + * fillAfter. Otherwise, fillBefore and fillAfter are ignored and the animation + * transformation is always applied. + * + * @param fillEnabled true if the animation should take fillBefore and fillAfter into account + * @attr ref android.R.styleable#Animation_fillEnabled + * + * @see #setFillBefore(boolean) + * @see #setFillAfter(boolean) + */ + public void setFillEnabled(boolean fillEnabled) { + mFillEnabled = fillEnabled; + } + /** * If fillBefore is true, this animation will apply its transformation * before the start time of the animation. Defaults to true if not set. @@ -415,6 +446,8 @@ public abstract class Animation { * * @param fillBefore true if the animation should apply its transformation before it starts * @attr ref android.R.styleable#Animation_fillBefore + * + * @see #setFillEnabled(boolean) */ public void setFillBefore(boolean fillBefore) { mFillBefore = fillBefore; @@ -422,7 +455,7 @@ public abstract class Animation { /** * If fillAfter is true, the transformation that this animation performed - * will persist when it is finished. Defaults to true if not set. + * will persist when it is finished. Defaults to false if not set. * Note that this applies when using an {@link * android.view.animation.AnimationSet AnimationSet} to chain * animations. The transformation is not applied before the AnimationSet @@ -430,6 +463,8 @@ public abstract class Animation { * * @param fillAfter true if the animation should apply its transformation after it ends * @attr ref android.R.styleable#Animation_fillAfter + * + * @see #setFillEnabled(boolean) */ public void setFillAfter(boolean fillAfter) { mFillAfter = fillAfter; @@ -623,9 +658,11 @@ public abstract class Animation { normalizedTime = currentTime < mStartTime ? 0.0f : 1.0f; } - boolean expired = normalizedTime >= 1.0f; + final boolean expired = normalizedTime >= 1.0f; mMore = !expired; + if (!mFillEnabled) normalizedTime = Math.max(Math.min(normalizedTime, 1.0f), 0.0f); + if ((normalizedTime >= 0.0f || mFillBefore) && (normalizedTime <= 1.0f || mFillAfter)) { if (!mStarted) { if (mListener != null) { @@ -634,8 +671,7 @@ public abstract class Animation { mStarted = true; } - // Pin time to 0.0 to 1.0 range - normalizedTime = Math.max(Math.min(normalizedTime, 1.0f), 0.0f); + if (mFillEnabled) normalizedTime = Math.max(Math.min(normalizedTime, 1.0f), 0.0f); if (mCycleFlip) { normalizedTime = 1.0f - normalizedTime; diff --git a/core/java/android/view/inputmethod/DefaultInputMethod.java b/core/java/android/view/inputmethod/DefaultInputMethod.java index e92cbadf9f91d..073b01c7b9ce6 100644 --- a/core/java/android/view/inputmethod/DefaultInputMethod.java +++ b/core/java/android/view/inputmethod/DefaultInputMethod.java @@ -98,7 +98,7 @@ public class DefaultInputMethod implements InputMethod, InputMethodSession { public void hideSoftInput() { } - public void showSoftInput() { + public void showSoftInput(int flags) { } } @@ -231,7 +231,7 @@ class SimpleInputMethod extends IInputMethod.Stub { } } - public void showSoftInput() { + public void showSoftInput(boolean blah) { } public void hideSoftInput() { diff --git a/core/java/android/view/inputmethod/InputMethod.java b/core/java/android/view/inputmethod/InputMethod.java index ad61f945deae5..c0e6590c71102 100644 --- a/core/java/android/view/inputmethod/InputMethod.java +++ b/core/java/android/view/inputmethod/InputMethod.java @@ -165,9 +165,20 @@ public interface InputMethod { public void revokeSession(InputMethodSession session); /** - * Request that any soft input part of the input method be shown to the user. + * Flag for {@link #showSoftInput(int)}: this show has been explicitly + * requested by the user. If not set, the system has decided it may be + * a good idea to show the input method based on a navigation operation + * in the UI. */ - public void showSoftInput(); + public static final int SHOW_EXPLICIT = 0x00001; + + /** + * Request that any soft input part of the input method be shown to the user. + * + * @param flags Provide additional information about the show request. + * Currently may be 0 or have the bit {@link #SHOW_EXPLICIT} set. + */ + public void showSoftInput(int flags); /** * Request that any soft input part of the input method be hidden from the user. diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java index a9c46c388e890..a676234435a7a 100644 --- a/core/java/android/view/inputmethod/InputMethodManager.java +++ b/core/java/android/view/inputmethod/InputMethodManager.java @@ -644,6 +644,13 @@ public final class InputMethodManager { } } + /** + * Flag for {@link #showSoftInput} to indicate that the this is an implicit + * request to show the input window, not as the result of a direct request + * by the user. The window may not be shown in this case. + */ + public static final int SHOW_IMPLICIT = 0x0001; + /** * Explicitly request that the current input method's soft input area be * shown to the user, if needed. Call this if the user interacts with @@ -652,20 +659,29 @@ public final class InputMethodManager { * * @param view The currently focused view, which would like to receive * soft keyboard input. + * @param flags Provides additional operating flags. Currently may be + * 0 or have the {@link #SHOW_IMPLICIT} bit set. */ - public void showSoftInput(View view) { + public void showSoftInput(View view, int flags) { synchronized (mH) { if (mServedView != view) { return; } try { - mService.showSoftInput(mClient); + mService.showSoftInput(mClient, flags); } catch (RemoteException e) { } } } + /** + * Flag for {@link #hideSoftInputFromWindow} to indicate that the soft + * input window should only be hidden if it was not explicitly shown + * by the user. + */ + public static final int HIDE_IMPLICIT_ONLY = 0x0001; + /** * Request to hide the soft input window from the context of the window * that is currently accepting input. This should be called as a result @@ -674,15 +690,17 @@ public final class InputMethodManager { * * @param windowToken The token of the window that is making the request, * as returned by {@link View#getWindowToken() View.getWindowToken()}. + * @param flags Provides additional operating flags. Currently may be + * 0 or have the {@link #HIDE_IMPLICIT_ONLY} bit set. */ - public void hideSoftInputFromWindow(IBinder windowToken) { + public void hideSoftInputFromWindow(IBinder windowToken, int flags) { synchronized (mH) { if (mServedView == null || mServedView.getWindowToken() != windowToken) { return; } try { - mService.hideSoftInput(mClient); + mService.hideSoftInput(mClient, flags); } catch (RemoteException e) { } } @@ -880,13 +898,14 @@ public final class InputMethodManager { void closeCurrentInput() { try { - mService.hideSoftInput(mClient); + mService.hideSoftInput(mClient, 0); } catch (RemoteException e) { } } /** * Called by ViewRoot the first time it gets window focus. + * @hide */ public void onWindowFocus(View focusedView, int softInputMode, boolean first, int windowFlags) { @@ -896,8 +915,10 @@ public final class InputMethodManager { + " first=" + first + " flags=#" + Integer.toHexString(windowFlags)); try { + final boolean isTextEditor = focusedView != null && + focusedView.onCheckIsTextEditor(); mService.windowGainedFocus(mClient, focusedView != null, - softInputMode, first, windowFlags); + isTextEditor, softInputMode, first, windowFlags); } catch (RemoteException e) { } } @@ -987,13 +1008,16 @@ public final class InputMethodManager { * Close/hide the input method's soft input area, so the user no longer * sees it or can interact with it. This can only be called * from the currently active input method, as validated by the given token. + * * @param token Supplies the identifying token given to an input method * when it was started, which allows it to perform this operation on * itself. + * @param flags Provides additional operating flags. Currently may be + * 0 or have the {@link #HIDE_IMPLICIT_ONLY} bit set. */ - public void hideSoftInputFromInputMethod(IBinder token) { + public void hideSoftInputFromInputMethod(IBinder token, int flags) { try { - mService.hideMySoftInput(token); + mService.hideMySoftInput(token, flags); } catch (RemoteException e) { throw new RuntimeException(e); } diff --git a/core/java/android/webkit/MimeTypeMap.java b/core/java/android/webkit/MimeTypeMap.java index 85cb8c0a37774..685e3528f7fac 100644 --- a/core/java/android/webkit/MimeTypeMap.java +++ b/core/java/android/webkit/MimeTypeMap.java @@ -430,8 +430,9 @@ public /* package */ class MimeTypeMap { sMimeTypeMap.loadEntry("text/h323", "323", true); sMimeTypeMap.loadEntry("text/iuls", "uls", true); sMimeTypeMap.loadEntry("text/mathml", "mml", true); - sMimeTypeMap.loadEntry("text/plain", "asc", true); + // add it first so it will be the default for ExtensionFromMimeType sMimeTypeMap.loadEntry("text/plain", "txt", true); + sMimeTypeMap.loadEntry("text/plain", "asc", true); sMimeTypeMap.loadEntry("text/plain", "text", true); sMimeTypeMap.loadEntry("text/plain", "diff", true); sMimeTypeMap.loadEntry("text/plain", "pot", true); @@ -469,6 +470,8 @@ public /* package */ class MimeTypeMap { sMimeTypeMap.loadEntry("text/x-tex", "cls", true); sMimeTypeMap.loadEntry("text/x-vcalendar", "vcs", true); sMimeTypeMap.loadEntry("text/x-vcard", "vcf", true); + sMimeTypeMap.loadEntry("video/3gpp", "3gp", false); + sMimeTypeMap.loadEntry("video/3gpp", "3g2", false); sMimeTypeMap.loadEntry("video/dl", "dl", false); sMimeTypeMap.loadEntry("video/dv", "dif", false); sMimeTypeMap.loadEntry("video/dv", "dv", false); diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index bd910b5a61283..f00238d79eb44 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -2694,7 +2694,7 @@ public class WebView extends AbsoluteLayout private void displaySoftKeyboard() { InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); - imm.showSoftInput(mTextEntry); + imm.showSoftInput(mTextEntry, 0); } // Used to register the global focus change listener one time to avoid @@ -3066,6 +3066,13 @@ public class WebView extends AbsoluteLayout // Bubble up the key event as WebView doesn't handle it return false; } + + /** + * @hide + */ + public void emulateShiftHeld() { + mShiftIsPressed = true; + } private boolean commitCopy() { boolean copiedSomething = false; diff --git a/core/java/android/webkit/gears/ApacheHttpRequestAndroid.java b/core/java/android/webkit/gears/ApacheHttpRequestAndroid.java new file mode 100644 index 0000000000000..05692557b7c0e --- /dev/null +++ b/core/java/android/webkit/gears/ApacheHttpRequestAndroid.java @@ -0,0 +1,1122 @@ +// Copyright 2008, The Android Open Source Project +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// 3. Neither the name of Google Inc. nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package android.webkit.gears; + +import android.net.http.Headers; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.util.Config; +import android.util.Log; +import android.webkit.CacheManager; +import android.webkit.CacheManager.CacheResult; +import android.webkit.CookieManager; + +import java.io.InputStream; +import java.io.OutputStream; +import java.io.IOException; +import java.lang.StringBuilder; +import java.util.Date; +import java.util.Map; +import java.util.HashMap; +import java.util.Iterator; + +import org.apache.http.Header; +import org.apache.http.HttpEntity; +import org.apache.http.client.params.HttpClientParams; +import org.apache.http.params.HttpParams; +import org.apache.http.params.HttpConnectionParams; +import org.apache.http.params.HttpProtocolParams; +import org.apache.http.HttpResponse; +import org.apache.http.entity.AbstractHttpEntity; +import org.apache.http.client.*; +import org.apache.http.client.methods.*; +import org.apache.http.impl.client.AbstractHttpClient; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.impl.client.DefaultHttpRequestRetryHandler; +import org.apache.http.conn.ssl.StrictHostnameVerifier; +import org.apache.http.impl.cookie.DateUtils; +import org.apache.http.util.CharArrayBuffer; + +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +/** + * Performs the underlying HTTP/HTTPS GET, POST, HEAD, PUT, DELETE requests. + *

    These are performed synchronously (blocking). The caller should + * ensure that it is in a background thread if asynchronous behavior + * is required. All data is pushed, so there is no need for JNI native + * callbacks. + *

    This uses Apache's HttpClient framework to perform most + * of the underlying network activity. The Android brower's cache, + * android.webkit.CacheManager, is also used when caching is enabled, + * and updated with new data. The android.webkit.CookieManager is also + * queried and updated as necessary. + *

    The public interface is designed to be called by native code + * through JNI, and to simplify coding none of the public methods will + * surface a checked exception. Unchecked exceptions may still be + * raised but only if the system is in an ill state, such as out of + * memory. + *

    TODO: This isn't plumbed into LocalServer yet. Mutually + * dependent on LocalServer - will attach the two together once both + * are submitted. + */ +public final class ApacheHttpRequestAndroid { + /** Debug logging tag. */ + private static final String LOG_TAG = "Gears-J"; + /** HTTP response header line endings are CR-LF style. */ + private static final String HTTP_LINE_ENDING = "\r\n"; + /** Safe MIME type to use whenever it isn't specified. */ + private static final String DEFAULT_MIME_TYPE = "text/plain"; + /** Case-sensitive header keys */ + public static final String KEY_CONTENT_LENGTH = "Content-Length"; + public static final String KEY_EXPIRES = "Expires"; + public static final String KEY_LAST_MODIFIED = "Last-Modified"; + public static final String KEY_ETAG = "ETag"; + public static final String KEY_LOCATION = "Location"; + public static final String KEY_CONTENT_TYPE = "Content-Type"; + /** Number of bytes to send and receive on the HTTP connection in + * one go. */ + private static final int BUFFER_SIZE = 4096; + + /** The first element of the String[] value in a headers map is the + * unmodified (case-sensitive) key. */ + public static final int HEADERS_MAP_INDEX_KEY = 0; + /** The second element of the String[] value in a headers map is the + * associated value. */ + public static final int HEADERS_MAP_INDEX_VALUE = 1; + + /** Request headers, as key -> value map. */ + // TODO: replace this design by a simpler one (the C++ side has to + // be modified too), where we do not store both the original header + // and the lowercase one. + private Map mRequestHeaders = + new HashMap(); + /** Response headers, as a lowercase key -> value map. */ + private Map mResponseHeaders = + new HashMap(); + /** The URL used for createCacheResult() */ + private String mCacheResultUrl; + /** CacheResult being saved into, if inserting a new cache entry. */ + private CacheResult mCacheResult; + /** Initialized by initChildThread(). Used to target abort(). */ + private Thread mBridgeThread; + + /** Our HttpClient */ + private AbstractHttpClient mClient; + /** The HttpMethod associated with this request */ + private HttpRequestBase mMethod; + /** The complete response line e.g "HTTP/1.0 200 OK" */ + private String mResponseLine; + /** HTTP body stream, setup after connection. */ + private InputStream mBodyInputStream; + + /** HTTP Response Entity */ + private HttpResponse mResponse; + + /** Post Entity, used to stream the request to the server */ + private StreamEntity mPostEntity = null; + /** Content lenght, mandatory when using POST */ + private long mContentLength; + + /** The request executes in a parallel thread */ + private Thread mHttpThread = null; + /** protect mHttpThread, if interrupt() is called concurrently */ + private Lock mHttpThreadLock = new ReentrantLock(); + /** Flag set to true when the request thread is joined */ + private boolean mConnectionFinished = false; + /** Flag set to true by interrupt() and/or connection errors */ + private boolean mConnectionFailed = false; + /** Lock protecting the access to mConnectionFailed */ + private Lock mConnectionFailedLock = new ReentrantLock(); + + /** Lock on the loop in StreamEntity */ + private Lock mStreamingReadyLock = new ReentrantLock(); + /** Condition variable used to signal the loop is ready... */ + private Condition mStreamingReady = mStreamingReadyLock.newCondition(); + + /** Used to pass around the block of data POSTed */ + private Buffer mBuffer = new Buffer(); + /** Used to signal that the block of data has been written */ + private SignalConsumed mSignal = new SignalConsumed(); + + // inner classes + + /** + * Implements the http request + */ + class Connection implements Runnable { + public void run() { + boolean problem = false; + try { + if (Config.LOGV) { + Log.i(LOG_TAG, "REQUEST : " + mMethod.getRequestLine()); + } + mResponse = mClient.execute(mMethod); + if (mResponse != null) { + if (Config.LOGV) { + Log.i(LOG_TAG, "response (status line): " + + mResponse.getStatusLine()); + } + mResponseLine = "" + mResponse.getStatusLine(); + } else { + if (Config.LOGV) { + Log.i(LOG_TAG, "problem, response == null"); + } + problem = true; + } + } catch (IOException e) { + Log.e(LOG_TAG, "Connection IO exception ", e); + problem = true; + } catch (RuntimeException e) { + Log.e(LOG_TAG, "Connection runtime exception ", e); + problem = true; + } + + if (!problem) { + if (Config.LOGV) { + Log.i(LOG_TAG, "Request complete (" + + mMethod.getRequestLine() + ")"); + } + } else { + mConnectionFailedLock.lock(); + mConnectionFailed = true; + mConnectionFailedLock.unlock(); + if (Config.LOGV) { + Log.i(LOG_TAG, "Request FAILED (" + + mMethod.getRequestLine() + ")"); + } + // We abort the execution in order to shutdown and release + // the underlying connection + mMethod.abort(); + if (mPostEntity != null) { + // If there is a post entity, we need to wake it up from + // a potential deadlock + mPostEntity.signalOutputStream(); + } + } + } + } + + /** + * simple buffer class implementing a producer/consumer model + */ + class Buffer { + private DataPacket mPacket; + private boolean mEmpty = true; + public synchronized void put(DataPacket packet) { + while (!mEmpty) { + try { + wait(); + } catch (InterruptedException e) { + if (Config.LOGV) { + Log.i(LOG_TAG, "InterruptedException while putting " + + "a DataPacket in the Buffer: " + e); + } + } + } + mPacket = packet; + mEmpty = false; + notify(); + } + public synchronized DataPacket get() { + while (mEmpty) { + try { + wait(); + } catch (InterruptedException e) { + if (Config.LOGV) { + Log.i(LOG_TAG, "InterruptedException while getting " + + "a DataPacket in the Buffer: " + e); + } + } + } + mEmpty = true; + notify(); + return mPacket; + } + } + + /** + * utility class used to block until the packet is signaled as being + * consumed + */ + class SignalConsumed { + private boolean mConsumed = false; + public synchronized void waitUntilPacketConsumed() { + while (!mConsumed) { + try { + wait(); + } catch (InterruptedException e) { + if (Config.LOGV) { + Log.i(LOG_TAG, "InterruptedException while waiting " + + "until a DataPacket is consumed: " + e); + } + } + } + mConsumed = false; + notify(); + } + public synchronized void packetConsumed() { + while (mConsumed) { + try { + wait(); + } catch (InterruptedException e) { + if (Config.LOGV) { + Log.i(LOG_TAG, "InterruptedException while indicating " + + "that the DataPacket has been consumed: " + e); + } + } + } + mConsumed = true; + notify(); + } + } + + /** + * Utility class encapsulating a packet of data + */ + class DataPacket { + private byte[] mContent; + private int mLength; + public DataPacket(byte[] content, int length) { + mContent = content; + mLength = length; + } + public byte[] getBytes() { + return mContent; + } + public int getLength() { + return mLength; + } + } + + /** + * HttpEntity class to write the bytes received by the C++ thread + * on the connection outputstream, in a streaming way. + * This entity is executed in the request thread. + * The writeTo() method is automatically called by the + * HttpPost execution; upon reception, we loop while receiving + * the data packets from the main thread, until completion + * or error. When done, we flush the outputstream. + * The main thread (sendPostData()) also blocks until the + * outputstream is made available (or an error happens) + */ + class StreamEntity implements HttpEntity { + private OutputStream mOutputStream; + + // HttpEntity interface methods + + public boolean isRepeatable() { + return false; + } + + public boolean isChunked() { + return false; + } + + public long getContentLength() { + return mContentLength; + } + + public Header getContentType() { + return null; + } + + public Header getContentEncoding() { + return null; + } + + public InputStream getContent() throws IOException { + return null; + } + + public void writeTo(final OutputStream out) throws IOException { + // We signal that the outputstream is available + mStreamingReadyLock.lock(); + mOutputStream = out; + mStreamingReady.signal(); + mStreamingReadyLock.unlock(); + + // We then loop waiting on messages to process. + boolean finished = false; + while (!finished) { + DataPacket packet = mBuffer.get(); + if (packet == null) { + finished = true; + } else { + write(packet); + } + mSignal.packetConsumed(); + mConnectionFailedLock.lock(); + if (mConnectionFailed) { + if (Config.LOGV) { + Log.i(LOG_TAG, "stopping loop on error"); + } + finished = true; + } + mConnectionFailedLock.unlock(); + } + if (Config.LOGV) { + Log.i(LOG_TAG, "flushing the outputstream..."); + } + mOutputStream.flush(); + } + + public boolean isStreaming() { + return true; + } + + public void consumeContent() throws IOException { + // Nothing to release + } + + // local methods + + private void write(DataPacket packet) { + try { + if (mOutputStream == null) { + if (Config.LOGV) { + Log.i(LOG_TAG, "NO OUTPUT STREAM !!!"); + } + return; + } + mOutputStream.write(packet.getBytes(), 0, packet.getLength()); + mOutputStream.flush(); + } catch (IOException e) { + if (Config.LOGV) { + Log.i(LOG_TAG, "exc: " + e); + } + mConnectionFailedLock.lock(); + mConnectionFailed = true; + mConnectionFailedLock.unlock(); + } + } + + public boolean isReady() { + mStreamingReadyLock.lock(); + try { + if (mOutputStream == null) { + mStreamingReady.await(); + } + } catch (InterruptedException e) { + if (Config.LOGV) { + Log.i(LOG_TAG, "InterruptedException in " + + "StreamEntity::isReady() : ", e); + } + } finally { + mStreamingReadyLock.unlock(); + } + if (mOutputStream == null) { + return false; + } + return true; + } + + public void signalOutputStream() { + mStreamingReadyLock.lock(); + mStreamingReady.signal(); + mStreamingReadyLock.unlock(); + } + } + + /** + * Initialize mBridgeThread using the TLS value of + * Thread.currentThread(). Called on start up of the native child + * thread. + */ + public synchronized void initChildThread() { + mBridgeThread = Thread.currentThread(); + } + + public void setContentLength(long length) { + mContentLength = length; + } + + /** + * Analagous to the native-side HttpRequest::open() function. This + * initializes an underlying HttpClient method, but does + * not go to the wire. On success, this enables a call to send() to + * initiate the transaction. + * + * @param method The HTTP method, e.g GET or POST. + * @param url The URL to open. + * @return True on success with a complete HTTP response. + * False on failure. + */ + public synchronized boolean open(String method, String url) { + if (Config.LOGV) { + Log.i(LOG_TAG, "open " + method + " " + url); + } + // Create the client + if (mConnectionFailed) { + // interrupt() could have been called even before open() + return false; + } + mClient = new DefaultHttpClient(); + mClient.setHttpRequestRetryHandler( + new DefaultHttpRequestRetryHandler(0, false)); + mBodyInputStream = null; + mResponseLine = null; + mResponseHeaders = null; + mPostEntity = null; + mHttpThread = null; + mConnectionFailed = false; + mConnectionFinished = false; + + // Create the method. We support everything that + // Apache HttpClient supports, apart from TRACE. + if ("GET".equalsIgnoreCase(method)) { + mMethod = new HttpGet(url); + } else if ("POST".equalsIgnoreCase(method)) { + mMethod = new HttpPost(url); + mPostEntity = new StreamEntity(); + ((HttpPost)mMethod).setEntity(mPostEntity); + } else if ("HEAD".equalsIgnoreCase(method)) { + mMethod = new HttpHead(url); + } else if ("PUT".equalsIgnoreCase(method)) { + mMethod = new HttpPut(url); + } else if ("DELETE".equalsIgnoreCase(method)) { + mMethod = new HttpDelete(url); + } else { + if (Config.LOGV) { + Log.i(LOG_TAG, "Method " + method + " not supported"); + } + return false; + } + HttpParams params = mClient.getParams(); + // We handle the redirections C++-side + HttpClientParams.setRedirecting(params, false); + HttpProtocolParams.setUseExpectContinue(params, false); + return true; + } + + /** + * We use this to start the connection thread (doing the method execute). + * We usually always return true here, as the connection will run its + * course in the thread. + * We only return false if interrupted beforehand -- if a connection + * problem happens, we will thus fail in either sendPostData() or + * parseHeaders(). + */ + public synchronized boolean connectToRemote() { + boolean ret = false; + applyRequestHeaders(); + mConnectionFailedLock.lock(); + if (!mConnectionFailed) { + mHttpThread = new Thread(new Connection()); + mHttpThread.start(); + } + ret = mConnectionFailed; + mConnectionFailedLock.unlock(); + return !ret; + } + + /** + * Get the complete response line of the HTTP request. Only valid on + * completion of the transaction. + * @return The complete HTTP response line, e.g "HTTP/1.0 200 OK". + */ + public synchronized String getResponseLine() { + return mResponseLine; + } + + /** + * Wait for the request thread completion + * (unless already finished) + */ + private void waitUntilConnectionFinished() { + if (Config.LOGV) { + Log.i(LOG_TAG, "waitUntilConnectionFinished(" + + mConnectionFinished + ")"); + } + if (!mConnectionFinished) { + if (mHttpThread != null) { + try { + mHttpThread.join(); + mConnectionFinished = true; + if (Config.LOGV) { + Log.i(LOG_TAG, "http thread joined"); + } + } catch (InterruptedException e) { + if (Config.LOGV) { + Log.i(LOG_TAG, "interrupted: " + e); + } + } + } else { + Log.e(LOG_TAG, ">>> Trying to join on mHttpThread " + + "when it does not exist!"); + } + } + } + + // Headers handling + + /** + * Receive all headers from the server and populate + * mResponseHeaders. + * @return True if headers are successfully received, False on + * connection error. + */ + public synchronized boolean parseHeaders() { + mConnectionFailedLock.lock(); + if (mConnectionFailed) { + mConnectionFailedLock.unlock(); + return false; + } + mConnectionFailedLock.unlock(); + waitUntilConnectionFinished(); + mResponseHeaders = new HashMap(); + if (mResponse == null) + return false; + + Header[] headers = mResponse.getAllHeaders(); + for (int i = 0; i < headers.length; i++) { + Header header = headers[i]; + if (Config.LOGV) { + Log.i(LOG_TAG, "header " + header.getName() + + " -> " + header.getValue()); + } + setResponseHeader(header.getName(), header.getValue()); + } + + return true; + } + + /** + * Set a header to send with the HTTP request. Will not take effect + * on a transaction already in progress. The key is associated + * case-insensitive, but stored case-sensitive. + * @param name The name of the header, e.g "Set-Cookie". + * @param value The value for this header, e.g "text/html". + */ + public synchronized void setRequestHeader(String name, String value) { + String[] mapValue = { name, value }; + if (Config.LOGV) { + Log.i(LOG_TAG, "setRequestHeader: " + name + " => " + value); + } + if (name.equalsIgnoreCase(KEY_CONTENT_LENGTH)) { + setContentLength(Long.parseLong(value)); + } else { + mRequestHeaders.put(name.toLowerCase(), mapValue); + } + } + + /** + * Returns the value associated with the given request header. + * @param name The name of the request header, non-null, case-insensitive. + * @return The value associated with the request header, or null if + * not set, or error. + */ + public synchronized String getRequestHeader(String name) { + String[] value = mRequestHeaders.get(name.toLowerCase()); + if (value != null) { + return value[HEADERS_MAP_INDEX_VALUE]; + } else { + return null; + } + } + + private void applyRequestHeaders() { + if (mMethod == null) + return; + Iterator it = mRequestHeaders.values().iterator(); + while (it.hasNext()) { + // Set the key case-sensitive. + String[] entry = it.next(); + if (Config.LOGV) { + Log.i(LOG_TAG, "apply header " + entry[HEADERS_MAP_INDEX_KEY] + + " => " + entry[HEADERS_MAP_INDEX_VALUE]); + } + mMethod.setHeader(entry[HEADERS_MAP_INDEX_KEY], + entry[HEADERS_MAP_INDEX_VALUE]); + } + } + + /** + * Returns the value associated with the given response header. + * @param name The name of the response header, non-null, case-insensitive. + * @return The value associated with the response header, or null if + * not set or error. + */ + public synchronized String getResponseHeader(String name) { + if (mResponseHeaders != null) { + String[] value = mResponseHeaders.get(name.toLowerCase()); + if (value != null) { + return value[HEADERS_MAP_INDEX_VALUE]; + } else { + return null; + } + } else { + if (Config.LOGV) { + Log.i(LOG_TAG, "getResponseHeader() called but " + + "response not received"); + } + return null; + } + } + + /** + * Return all response headers, separated by CR-LF line endings, and + * ending with a trailing blank line. This mimics the format of the + * raw response header up to but not including the body. + * @return A string containing the entire response header. + */ + public synchronized String getAllResponseHeaders() { + if (mResponseHeaders == null) { + if (Config.LOGV) { + Log.i(LOG_TAG, "getAllResponseHeaders() called but " + + "response not received"); + } + return null; + } + StringBuilder result = new StringBuilder(); + Iterator it = mResponseHeaders.values().iterator(); + while (it.hasNext()) { + String[] entry = it.next(); + // Output the "key: value" lines. + result.append(entry[HEADERS_MAP_INDEX_KEY]); + result.append(": "); + result.append(entry[HEADERS_MAP_INDEX_VALUE]); + result.append(HTTP_LINE_ENDING); + } + result.append(HTTP_LINE_ENDING); + return result.toString(); + } + + + /** + * Set a response header and associated value. The key is associated + * case-insensitively, but stored case-sensitively. + * @param name Case sensitive request header key. + * @param value The associated value. + */ + private void setResponseHeader(String name, String value) { + if (Config.LOGV) { + Log.i(LOG_TAG, "Set response header " + name + ": " + value); + } + String mapValue[] = { name, value }; + mResponseHeaders.put(name.toLowerCase(), mapValue); + } + + // Cookie handling + + /** + * Get the cookie for the given URL. + * @param url The fully qualified URL. + * @return A string containing the cookie for the URL if it exists, + * or null if not. + */ + public static String getCookieForUrl(String url) { + // Get the cookie for this URL, set as a header + return CookieManager.getInstance().getCookie(url); + } + + /** + * Set the cookie for the given URL. + * @param url The fully qualified URL. + * @param cookie The new cookie value. + * @return A string containing the cookie for the URL if it exists, + * or null if not. + */ + public static void setCookieForUrl(String url, String cookie) { + // Get the cookie for this URL, set as a header + CookieManager.getInstance().setCookie(url, cookie); + } + + // Cache handling + + /** + * Perform a request using LocalServer if possible. Initializes + * class members so that receive() will obtain data from the stream + * provided by the response. + * @param url The fully qualified URL to try in LocalServer. + * @return True if the url was found and is now setup to receive. + * False if not found, with no side-effect. + */ + public synchronized boolean useLocalServerResult(String url) { + UrlInterceptHandlerGears handler = + UrlInterceptHandlerGears.getInstance(); + if (handler == null) { + return false; + } + UrlInterceptHandlerGears.ServiceResponse serviceResponse = + handler.getServiceResponse(url, mRequestHeaders); + if (serviceResponse == null) { + if (Config.LOGV) { + Log.i(LOG_TAG, "No response in LocalServer"); + } + return false; + } + // LocalServer will handle this URL. Initialize stream and + // response. + mBodyInputStream = serviceResponse.getInputStream(); + mResponseLine = serviceResponse.getStatusLine(); + mResponseHeaders = serviceResponse.getResponseHeaders(); + if (Config.LOGV) { + Log.i(LOG_TAG, "Got response from LocalServer: " + mResponseLine); + } + return true; + } + + /** + * Perform a request using the cache result if present. Initializes + * class members so that receive() will obtain data from the cache. + * @param url The fully qualified URL to try in the cache. + * @return True is the url was found and is now setup to receive + * from cache. False if not found, with no side-effect. + */ + public synchronized boolean useCacheResult(String url) { + // Try the browser's cache. CacheManager wants a Map. + Map cacheRequestHeaders = new HashMap(); + Iterator> it = + mRequestHeaders.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry entry = it.next(); + cacheRequestHeaders.put( + entry.getKey(), + entry.getValue()[HEADERS_MAP_INDEX_VALUE]); + } + CacheResult mCacheResult = + CacheManager.getCacheFile(url, cacheRequestHeaders); + if (mCacheResult == null) { + if (Config.LOGV) { + Log.i(LOG_TAG, "No CacheResult for " + url); + } + return false; + } + if (Config.LOGV) { + Log.i(LOG_TAG, "Got CacheResult from browser cache"); + } + // Check for expiry. -1 is "never", otherwise milliseconds since 1970. + // Can be compared to System.currentTimeMillis(). + long expires = mCacheResult.getExpires(); + if (expires >= 0 && System.currentTimeMillis() >= expires) { + if (Config.LOGV) { + Log.i(LOG_TAG, "CacheResult expired " + + (System.currentTimeMillis() - expires) + + " milliseconds ago"); + } + // Cache hit has expired. Do not return it. + return false; + } + // Setup the mBodyInputStream to come from the cache. + mBodyInputStream = mCacheResult.getInputStream(); + if (mBodyInputStream == null) { + // Cache result may have gone away. + if (Config.LOGV) { + Log.i(LOG_TAG, "No mBodyInputStream for CacheResult " + url); + } + return false; + } + // Cache hit. Parse headers. + synthesizeHeadersFromCacheResult(mCacheResult); + return true; + } + + /** + * Take the limited set of headers in a CacheResult and synthesize + * response headers. + * @param cacheResult A CacheResult to populate mResponseHeaders with. + */ + private void synthesizeHeadersFromCacheResult(CacheResult cacheResult) { + int statusCode = cacheResult.getHttpStatusCode(); + // The status message is informal, so we can greatly simplify it. + String statusMessage; + if (statusCode >= 200 && statusCode < 300) { + statusMessage = "OK"; + } else if (statusCode >= 300 && statusCode < 400) { + statusMessage = "MOVED"; + } else { + statusMessage = "UNAVAILABLE"; + } + // Synthesize the response line. + mResponseLine = "HTTP/1.1 " + statusCode + " " + statusMessage; + if (Config.LOGV) { + Log.i(LOG_TAG, "Synthesized " + mResponseLine); + } + // Synthesize the returned headers from cache. + mResponseHeaders = new HashMap(); + String contentLength = Long.toString(cacheResult.getContentLength()); + setResponseHeader(KEY_CONTENT_LENGTH, contentLength); + long expires = cacheResult.getExpires(); + if (expires >= 0) { + // "Expires" header is valid and finite. Milliseconds since 1970 + // epoch, formatted as RFC-1123. + String expiresString = DateUtils.formatDate(new Date(expires)); + setResponseHeader(KEY_EXPIRES, expiresString); + } + String lastModified = cacheResult.getLastModified(); + if (lastModified != null) { + // Last modification time of the page. Passed end-to-end, but + // not used by us. + setResponseHeader(KEY_LAST_MODIFIED, lastModified); + } + String eTag = cacheResult.getETag(); + if (eTag != null) { + // Entity tag. A kind of GUID to identify identical resources. + setResponseHeader(KEY_ETAG, eTag); + } + String location = cacheResult.getLocation(); + if (location != null) { + // If valid, refers to the location of a redirect. + setResponseHeader(KEY_LOCATION, location); + } + String mimeType = cacheResult.getMimeType(); + if (mimeType == null) { + // Use a safe default MIME type when none is + // specified. "text/plain" is safe to render in the browser + // window (even if large) and won't be intepreted as anything + // that would cause execution. + mimeType = DEFAULT_MIME_TYPE; + } + String encoding = cacheResult.getEncoding(); + // Encoding may not be specified. No default. + String contentType = mimeType; + if (encoding != null) { + if (encoding.length() > 0) { + contentType += "; charset=" + encoding; + } + } + setResponseHeader(KEY_CONTENT_TYPE, contentType); + } + + /** + * Create a CacheResult for this URL. This enables the repsonse body + * to be sent in calls to appendCacheResult(). + * @param url The fully qualified URL to add to the cache. + * @param responseCode The response code returned for the request, e.g 200. + * @param mimeType The MIME type of the body, e.g "text/plain". + * @param encoding The encoding, e.g "utf-8". Use "" for unknown. + */ + public synchronized boolean createCacheResult( + String url, int responseCode, String mimeType, String encoding) { + if (Config.LOGV) { + Log.i(LOG_TAG, "Making cache entry for " + url); + } + // Take the headers and parse them into a format needed by + // CacheManager. + Headers cacheHeaders = new Headers(); + Iterator> it = + mResponseHeaders.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry entry = it.next(); + // Headers.parseHeader() expects lowercase keys. + String keyValue = entry.getKey() + ": " + + entry.getValue()[HEADERS_MAP_INDEX_VALUE]; + CharArrayBuffer buffer = new CharArrayBuffer(keyValue.length()); + buffer.append(keyValue); + // Parse it into the header container. + cacheHeaders.parseHeader(buffer); + } + mCacheResult = CacheManager.createCacheFile( + url, responseCode, cacheHeaders, mimeType, true); + if (mCacheResult != null) { + if (Config.LOGV) { + Log.i(LOG_TAG, "Saving into cache"); + } + mCacheResult.setEncoding(encoding); + mCacheResultUrl = url; + return true; + } else { + if (Config.LOGV) { + Log.i(LOG_TAG, "Couldn't create mCacheResult"); + } + return false; + } + } + + /** + * Add data from the response body to the CacheResult created with + * createCacheResult(). + * @param data A byte array of the next sequential bytes in the + * response body. + * @param bytes The number of bytes to write from the start of + * the array. + * @return True if all bytes successfully written, false on failure. + */ + public synchronized boolean appendCacheResult(byte[] data, int bytes) { + if (mCacheResult == null) { + if (Config.LOGV) { + Log.i(LOG_TAG, "appendCacheResult() called without a " + + "CacheResult initialized"); + } + return false; + } + try { + mCacheResult.getOutputStream().write(data, 0, bytes); + } catch (IOException ex) { + if (Config.LOGV) { + Log.i(LOG_TAG, "Got IOException writing cache data: " + ex); + } + return false; + } + return true; + } + + /** + * Save the completed CacheResult into the CacheManager. This must + * have been created first with createCacheResult(). + * @return Returns true if the entry has been successfully saved. + */ + public synchronized boolean saveCacheResult() { + if (mCacheResult == null || mCacheResultUrl == null) { + if (Config.LOGV) { + Log.i(LOG_TAG, "Tried to save cache result but " + + "createCacheResult not called"); + } + return false; + } + + if (Config.LOGV) { + Log.i(LOG_TAG, "Saving cache result"); + } + CacheManager.saveCacheFile(mCacheResultUrl, mCacheResult); + mCacheResult = null; + mCacheResultUrl = null; + return true; + } + + + /** + * Interrupt a blocking IO operation. This will cause the child + * thread to expediently return from an operation if it was stuck at + * the time. Note that this inherently races, and unfortunately + * requires the caller to loop. + */ + public synchronized void interrupt() { + if (Config.LOGV) { + Log.i(LOG_TAG, "INTERRUPT CALLED"); + } + mConnectionFailedLock.lock(); + mConnectionFailed = true; + mConnectionFailedLock.unlock(); + if (mMethod != null) { + mMethod.abort(); + } + if (mHttpThread != null) { + waitUntilConnectionFinished(); + } + } + + /** + * Receive the next sequential bytes of the response body after + * successful connection. This will receive up to the size of the + * provided byte array. If there is no body, this will return 0 + * bytes on the first call after connection. + * @param buf A pre-allocated byte array to receive data into. + * @return The number of bytes from the start of the array which + * have been filled, 0 on EOF, or negative on error. + */ + public synchronized int receive(byte[] buf) { + if (mBodyInputStream == null) { + // If this is the first call, setup the InputStream. This may + // fail if there were headers, but no body returned by the + // server. + try { + if (mResponse != null) { + HttpEntity entity = mResponse.getEntity(); + mBodyInputStream = entity.getContent(); + } + } catch (IOException inputException) { + if (Config.LOGV) { + Log.i(LOG_TAG, "Failed to connect InputStream: " + + inputException); + } + // Not unexpected. For example, 404 response return headers, + // and sometimes a body with a detailed error. + } + if (mBodyInputStream == null) { + // No error stream either. Treat as a 0 byte response. + if (Config.LOGV) { + Log.i(LOG_TAG, "No InputStream"); + } + return 0; // EOF. + } + } + int ret; + try { + int got = mBodyInputStream.read(buf); + if (got > 0) { + // Got some bytes, not EOF. + ret = got; + } else { + // EOF. + mBodyInputStream.close(); + ret = 0; + } + } catch (IOException e) { + // An abort() interrupts us by calling close() on our stream. + if (Config.LOGV) { + Log.i(LOG_TAG, "Got IOException in mBodyInputStream.read(): ", e); + } + ret = -1; + } + return ret; + } + + /** + * For POST method requests, send a stream of data provided by the + * native side in repeated callbacks. + * We put the data in mBuffer, and wait until it is consumed + * by the StreamEntity in the request thread. + * @param data A byte array containing the data to sent, or null + * if indicating EOF. + * @param bytes The number of bytes from the start of the array to + * send, or 0 if indicating EOF. + * @return True if all bytes were successfully sent, false on error. + */ + public boolean sendPostData(byte[] data, int bytes) { + mConnectionFailedLock.lock(); + if (mConnectionFailed) { + mConnectionFailedLock.unlock(); + return false; + } + mConnectionFailedLock.unlock(); + if (mPostEntity == null) return false; + + // We block until the outputstream is available + // (or in case of connection error) + if (!mPostEntity.isReady()) return false; + + if (data == null && bytes == 0) { + mBuffer.put(null); + } else { + mBuffer.put(new DataPacket(data, bytes)); + } + mSignal.waitUntilPacketConsumed(); + + mConnectionFailedLock.lock(); + if (mConnectionFailed) { + Log.e(LOG_TAG, "failure"); + mConnectionFailedLock.unlock(); + return false; + } + mConnectionFailedLock.unlock(); + return true; + } + +} diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index c22023c98d002..19ec77d89a607 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -696,7 +696,6 @@ public abstract class AbsListView extends AdapterView implements Te setWillNotDraw(false); setAlwaysDrawnWithCacheEnabled(false); setScrollingCacheEnabled(true); - setScrollContainer(true); } private void useDefaultSelector() { diff --git a/core/java/android/widget/AutoCompleteTextView.java b/core/java/android/widget/AutoCompleteTextView.java index 1591791c4fdbe..024b663d83083 100644 --- a/core/java/android/widget/AutoCompleteTextView.java +++ b/core/java/android/widget/AutoCompleteTextView.java @@ -514,7 +514,47 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe protected CharSequence convertSelectionToString(Object selectedItem) { return mFilter.convertResultToString(selectedItem); } + + /** + *

    Clear the list selection. This may only be temporary, as user input will often bring + * it back. + */ + public void clearListSelection() { + if (mDropDownList != null) { + mDropDownList.hideSelector(); + mDropDownList.requestLayout(); + } + } + + /** + * Set the position of the dropdown view selection. + * + * @param position The position to move the selector to. + */ + public void setListSelection(int position) { + if (mPopup.isShowing() && (mDropDownList != null)) { + mDropDownList.setSelection(position); + // ListView.setSelection() will call requestLayout() + } + } + /** + * Get the position of the dropdown view selection, if there is one. Returns + * {@link ListView#INVALID_POSITION ListView.INVALID_POSITION} if there is no dropdown or if + * there is no selection. + * + * @return the position of the current selection, if there is one, or + * {@link ListView#INVALID_POSITION ListView.INVALID_POSITION} if not. + * + * @see ListView#getSelectedItemPosition() + */ + public int getListSelection() { + if (mPopup.isShowing() && (mDropDownList != null)) { + return mDropDownList.getSelectedItemPosition(); + } + return ListView.INVALID_POSITION; + } + /** *

    Starts filtering the content of the drop down list. The filtering * pattern is the content of the edit box. Subclasses should override this diff --git a/core/java/android/widget/CursorAdapter.java b/core/java/android/widget/CursorAdapter.java index 555f2161af548..3d758e757feb6 100644 --- a/core/java/android/widget/CursorAdapter.java +++ b/core/java/android/widget/CursorAdapter.java @@ -242,6 +242,9 @@ public abstract class CursorAdapter extends BaseAdapter implements Filterable, * @param cursor the new cursor to be used */ public void changeCursor(Cursor cursor) { + if (cursor == mCursor) { + return; + } if (mCursor != null) { mCursor.unregisterContentObserver(mChangeObserver); mCursor.unregisterDataSetObserver(mDataSetObserver); diff --git a/core/java/android/widget/Filter.java b/core/java/android/widget/Filter.java index 49888f7683310..7f1601e581c8d 100644 --- a/core/java/android/widget/Filter.java +++ b/core/java/android/widget/Filter.java @@ -42,6 +42,8 @@ public abstract class Filter { private Handler mThreadHandler; private Handler mResultHandler; + private String mConstraint; + private boolean mConstraintIsValid = false; /** *

    Creates a new asynchronous filter.

    @@ -79,6 +81,14 @@ public abstract class Filter { */ public final void filter(CharSequence constraint, FilterListener listener) { synchronized (this) { + String constraintAsString = constraint != null ? constraint.toString() : null; + if (mConstraintIsValid && ( + (constraintAsString == null && mConstraint == null) || + (constraintAsString != null && constraintAsString.equals(mConstraint)))) { + // nothing to do + return; + } + if (mThreadHandler == null) { HandlerThread thread = new HandlerThread(THREAD_NAME); thread.start(); @@ -88,13 +98,18 @@ public abstract class Filter { Message message = mThreadHandler.obtainMessage(FILTER_TOKEN); RequestArguments args = new RequestArguments(); - args.constraint = constraint; + // make sure we use an immutable copy of the constraint, so that + // it doesn't change while the filter operation is in progress + args.constraint = constraintAsString; args.listener = listener; message.obj = args; mThreadHandler.removeMessages(FILTER_TOKEN); mThreadHandler.removeMessages(FINISH_TOKEN); mThreadHandler.sendMessage(message); + + mConstraint = constraintAsString; + mConstraintIsValid = true; } } diff --git a/core/java/android/widget/Gallery.java b/core/java/android/widget/Gallery.java index cabca4024d26e..7b9735c865edc 100644 --- a/core/java/android/widget/Gallery.java +++ b/core/java/android/widget/Gallery.java @@ -45,6 +45,9 @@ import android.widget.Scroller; * {@link android.R.styleable#Theme_galleryItemBackground} as the background for * each View given to the Gallery from the Adapter. If you are not doing this, * you may need to adjust some Gallery properties, such as the spacing. + *

    + * Views given to the Gallery should use {@link Gallery.LayoutParams} as their + * layout parameters type. * * @attr ref android.R.styleable#Gallery_animationDuration * @attr ref android.R.styleable#Gallery_spacing diff --git a/core/java/android/widget/PopupWindow.java b/core/java/android/widget/PopupWindow.java index b5c438478620b..50248c1064c0b 100644 --- a/core/java/android/widget/PopupWindow.java +++ b/core/java/android/widget/PopupWindow.java @@ -85,8 +85,10 @@ public class PopupWindow { private int mWidthMode; private int mWidth; + private int mLastWidth; private int mHeightMode; private int mHeight; + private int mLastHeight; private int mPopupWidth; private int mPopupHeight; @@ -634,8 +636,8 @@ public class PopupWindow { mPopupView.refreshDrawableState(); } mAboveAnchor = findDropDownPosition(anchor, p, xoff, yoff); - if (mHeightMode < 0) p.height = mHeightMode; - if (mWidthMode < 0) p.width = mWidthMode; + if (mHeightMode < 0) p.height = mLastHeight = mHeightMode; + if (mWidthMode < 0) p.width = mLastWidth = mWidthMode; p.windowAnimations = computeAnimationResource(); invokePopup(p); } @@ -708,8 +710,8 @@ public class PopupWindow { // by setting the x and y offsets to match the anchor's bottom // left corner p.gravity = Gravity.LEFT | Gravity.TOP; - p.width = mWidth; - p.height = mHeight; + p.width = mLastWidth = mWidth; + p.height = mLastHeight = mHeight; if (mBackground != null) { p.format = mBackground.getOpacity(); } else { @@ -953,15 +955,15 @@ public class PopupWindow { boolean update = false; - final int finalWidth = mWidthMode < 0 ? mWidthMode : p.width; + final int finalWidth = mWidthMode < 0 ? mWidthMode : mLastWidth; if (width != -1 && p.width != finalWidth) { - p.width = finalWidth; + p.width = mLastWidth = finalWidth; update = true; } - final int finalHeight = mHeightMode < 0 ? mHeightMode : p.height; + final int finalHeight = mHeightMode < 0 ? mHeightMode : mLastHeight; if (height != -1 && p.height != finalHeight) { - p.height = finalHeight; + p.height = mLastHeight = finalHeight; update = true; } diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java index a2133b29c6d2d..20166cf72af69 100644 --- a/core/java/android/widget/ScrollView.java +++ b/core/java/android/widget/ScrollView.java @@ -125,18 +125,7 @@ public class ScrollView extends FrameLayout { private boolean mSmoothScrollingEnabled = true; public ScrollView(Context context) { - super(context); - initScrollView(); - - setVerticalScrollBarEnabled(true); - setVerticalFadingEdgeEnabled(true); - - TypedArray a = context.obtainStyledAttributes(R.styleable.View); - - initializeScrollbars(a); - initializeFadingEdge(a); - - a.recycle(); + this(context, null); } public ScrollView(Context context, AttributeSet attrs) { @@ -199,7 +188,6 @@ public class ScrollView extends FrameLayout { setFocusable(true); setDescendantFocusability(FOCUS_AFTER_DESCENDANTS); setWillNotDraw(false); - setScrollContainer(true); } @Override diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 73c2b3e5d5d89..8baed7d71b449 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -714,10 +714,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener bufferType = BufferType.EDITABLE; break; } - mInputType = EditorInfo.TYPE_CLASS_TEXT; } - if (password) { + if (password && (mInputType&EditorInfo.TYPE_MASK_CLASS) + == EditorInfo.TYPE_CLASS_TEXT) { mInputType = (mInputType & ~(EditorInfo.TYPE_MASK_VARIATION)) | EditorInfo.TYPE_TEXT_VARIATION_PASSWORD; } @@ -3772,8 +3772,12 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener return super.onKeyUp(keyCode, event); } + @Override public boolean onCheckIsTextEditor() { + return mInputType != EditorInfo.TYPE_NULL; + } + @Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) { - if (mInputType != EditorInfo.TYPE_NULL) { + if (onCheckIsTextEditor()) { if (mInputMethodState == null) { mInputMethodState = new InputMethodState(); } @@ -5334,12 +5338,11 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mLayout != null) { boolean moved = mMovement.onTouchEvent(this, (Spannable) mText, event); - if (mText instanceof Editable - && mInputType != EditorInfo.TYPE_NULL) { + if (mText instanceof Editable && onCheckIsTextEditor()) { if (event.getAction() == MotionEvent.ACTION_UP && isFocused()) { InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); - imm.showSoftInput(this); + imm.showSoftInput(this, 0); } } diff --git a/core/java/com/android/internal/app/AlertController.java b/core/java/com/android/internal/app/AlertController.java index 989f97244543f..5c44b2df661d5 100644 --- a/core/java/com/android/internal/app/AlertController.java +++ b/core/java/com/android/internal/app/AlertController.java @@ -27,7 +27,6 @@ import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Message; import android.text.TextUtils; -import android.text.TextUtils.TruncateAt; import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; @@ -172,11 +171,33 @@ public class AlertController { mHandler = new ButtonHandler(di); } + static boolean canTextInput(View v) { + if (v.onCheckIsTextEditor()) { + return true; + } + + if (!(v instanceof ViewGroup)) { + return false; + } + + ViewGroup vg = (ViewGroup)v; + int i = vg.getChildCount(); + while (i > 0) { + i--; + v = vg.getChildAt(i); + if (canTextInput(v)) { + return true; + } + } + + return false; + } + public void installContent() { /* We use a custom title so never request a window title */ mWindow.requestFeature(Window.FEATURE_NO_TITLE); - if (mView == null) { + if (mView == null || !canTextInput(mView)) { mWindow.setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); } diff --git a/core/java/com/android/internal/os/HandlerCaller.java b/core/java/com/android/internal/os/HandlerCaller.java index e88a36f4e33f5..a7081e323f173 100644 --- a/core/java/com/android/internal/os/HandlerCaller.java +++ b/core/java/com/android/internal/os/HandlerCaller.java @@ -115,11 +115,15 @@ public class HandlerCaller { return mH.obtainMessage(what, 0, 0, arg1); } + public Message obtainMessageI(int what, int arg1) { + return mH.obtainMessage(what, arg1); + } + public Message obtainMessageIO(int what, int arg1, Object arg2) { return mH.obtainMessage(what, arg1, 0, arg2); } - public Message obtainMessageIO(int what, int arg1, int arg2, Object arg3) { + public Message obtainMessageIIO(int what, int arg1, int arg2, Object arg3) { return mH.obtainMessage(what, arg1, arg2, arg3); } diff --git a/core/java/com/android/internal/view/IInputMethod.aidl b/core/java/com/android/internal/view/IInputMethod.aidl index 87bf473f550c8..f650713fc0eff 100644 --- a/core/java/com/android/internal/view/IInputMethod.aidl +++ b/core/java/com/android/internal/view/IInputMethod.aidl @@ -48,7 +48,7 @@ oneway interface IInputMethod { void revokeSession(IInputMethodSession session); - void showSoftInput(); + void showSoftInput(boolean explicit); void hideSoftInput(); } diff --git a/core/java/com/android/internal/view/IInputMethodManager.aidl b/core/java/com/android/internal/view/IInputMethodManager.aidl index 1c9e7976d1886..2a15bdb999716 100644 --- a/core/java/com/android/internal/view/IInputMethodManager.aidl +++ b/core/java/com/android/internal/view/IInputMethodManager.aidl @@ -37,15 +37,15 @@ interface IInputMethodManager { InputBindResult startInput(in IInputMethodClient client, in EditorInfo attribute, boolean initial, boolean needResult); void finishInput(in IInputMethodClient client); - void showSoftInput(in IInputMethodClient client); - void hideSoftInput(in IInputMethodClient client); + void showSoftInput(in IInputMethodClient client, int flags); + void hideSoftInput(in IInputMethodClient client, int flags); void windowGainedFocus(in IInputMethodClient client, - boolean viewHasFocus, int softInputMode, boolean first, - int windowFlags); + boolean viewHasFocus, boolean isTextEditor, + int softInputMode, boolean first, int windowFlags); void showInputMethodPickerFromClient(in IInputMethodClient client); void setInputMethod(in IBinder token, String id); - void hideMySoftInput(in IBinder token); + void hideMySoftInput(in IBinder token, int flags); void updateStatusIcon(int iconId, String iconPackage); boolean setInputMethodEnabled(String id, boolean enabled); diff --git a/core/java/com/google/android/gdata/client/AndroidGDataClient.java b/core/java/com/google/android/gdata/client/AndroidGDataClient.java index 17f86d6f6c5de..1d8e9c5c1d7d4 100644 --- a/core/java/com/google/android/gdata/client/AndroidGDataClient.java +++ b/core/java/com/google/android/gdata/client/AndroidGDataClient.java @@ -30,6 +30,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; +import java.io.BufferedInputStream; import java.net.URI; import java.net.URISyntaxException; import java.net.URLEncoder; @@ -124,6 +125,7 @@ public class AndroidGDataClient implements GDataClient { public AndroidGDataClient(ContentResolver resolver) { mHttpClient = new GoogleHttpClient(resolver, USER_AGENT_APP_VERSION, true /* gzip capable */); + mHttpClient.enableCurlLogging(TAG, Log.VERBOSE); mResolver = resolver; } @@ -213,7 +215,7 @@ public class AndroidGDataClient implements GDataClient { Log.w(TAG, "StatusLine is null."); throw new NullPointerException("StatusLine is null -- should not happen."); } - + if (Log.isLoggable(TAG, Log.DEBUG)) { Log.d(TAG, response.getStatusLine().toString()); for (Header h : response.getAllHeaders()) { @@ -225,7 +227,11 @@ public class AndroidGDataClient implements GDataClient { HttpEntity entity = response.getEntity(); if ((status >= 200) && (status < 300) && entity != null) { - return AndroidHttpClient.getUngzippedContent(entity); + InputStream in = AndroidHttpClient.getUngzippedContent(entity); + if (Log.isLoggable(TAG, Log.DEBUG)) { + in = logInputStreamContents(in); + } + return in; } // TODO: handle 301, 307? @@ -308,6 +314,43 @@ public class AndroidGDataClient implements GDataClient { throw new IOException("Unable to access feed."); } + /** + * Log the contents of the input stream. + * The original input stream is consumed, so the caller must use the + * BufferedInputStream that is returned. + * @param in InputStream + * @return replacement input stream for caller to use + * @throws IOException + */ + private InputStream logInputStreamContents(InputStream in) throws IOException { + if (in == null) { + return in; + } + // bufferSize is the (arbitrary) maximum amount to log. + // The original InputStream is wrapped in a + // BufferedInputStream with a 16K buffer. This lets + // us read up to 16K, write it to the log, and then + // reset the stream so the the original client can + // then read the data. The BufferedInputStream + // provides the mark and reset support, even when + // the original InputStream does not. + final int bufferSize = 16384; + BufferedInputStream bin = new BufferedInputStream(in, bufferSize); + bin.mark(bufferSize); + int wanted = bufferSize; + int totalReceived = 0; + byte buf[] = new byte[wanted]; + while (wanted > 0) { + int got = bin.read(buf, totalReceived, wanted); + if (got <= 0) break; // EOF + wanted -= got; + totalReceived += got; + } + Log.d(TAG, new String(buf, 0, totalReceived, "UTF-8")); + bin.reset(); + return bin; + } + public InputStream getMediaEntryAsStream(String mediaEntryUrl, String authToken) throws HttpException, IOException { diff --git a/core/jni/Android.mk b/core/jni/Android.mk index c074b69844f84..32c3a54bd7906 100644 --- a/core/jni/Android.mk +++ b/core/jni/Android.mk @@ -119,6 +119,7 @@ LOCAL_C_INCLUDES += \ $(LOCAL_PATH)/android/graphics \ $(call include-path-for, bluedroid) \ $(call include-path-for, libhardware)/hardware \ + $(call include-path-for, libhardware_legacy)/hardware_legacy \ $(LOCAL_PATH)/../../include/ui \ $(LOCAL_PATH)/../../include/utils \ external/skia/include/core \ @@ -147,6 +148,7 @@ LOCAL_SHARED_LIBRARIES := \ libdvm \ libGLES_CM \ libhardware \ + libhardware_legacy \ libsonivox \ libcrypto \ libssl \ @@ -167,6 +169,9 @@ endif ifneq ($(TARGET_SIMULATOR),true) LOCAL_SHARED_LIBRARIES += \ libdl + # we need to access the private Bionic header + # in com_google_android_gles_jni_GLImpl.cpp + LOCAL_CFLAGS += -I$(LOCAL_PATH)/../../../../bionic/libc/private endif LOCAL_LDLIBS += -lpthread -ldl diff --git a/core/jni/android_database_SQLiteStatement.cpp b/core/jni/android_database_SQLiteStatement.cpp index b6158959f3643..ff2ed5d9731ea 100644 --- a/core/jni/android_database_SQLiteStatement.cpp +++ b/core/jni/android_database_SQLiteStatement.cpp @@ -59,7 +59,7 @@ static void native_execute(JNIEnv* env, jobject object) // Throw an exception if an error occured if (err != SQLITE_DONE) { - throw_sqlite3_exception_errcode(env, err, NULL); + throw_sqlite3_exception_errcode(env, err, sqlite3_errmsg(handle)); } // Reset the statment so it's ready to use again @@ -81,7 +81,7 @@ static jlong native_1x1_long(JNIEnv* env, jobject object) // No errors, read the data and return it value = sqlite3_column_int64(statement, 0); } else { - throw_sqlite3_exception_errcode(env, err, NULL); + throw_sqlite3_exception_errcode(env, err, sqlite3_errmsg(handle)); } // Reset the statment so it's ready to use again @@ -106,7 +106,7 @@ static jstring native_1x1_string(JNIEnv* env, jobject object) char const * text = (char const *)sqlite3_column_text(statement, 0); value = env->NewStringUTF(text); } else { - throw_sqlite3_exception_errcode(env, err, NULL); + throw_sqlite3_exception_errcode(env, err, sqlite3_errmsg(handle)); } // Reset the statment so it's ready to use again diff --git a/core/jni/android_location_GpsLocationProvider.cpp b/core/jni/android_location_GpsLocationProvider.cpp index 264cc511884c9..dee3fdd97f691 100644 --- a/core/jni/android_location_GpsLocationProvider.cpp +++ b/core/jni/android_location_GpsLocationProvider.cpp @@ -18,7 +18,7 @@ #include "JNIHelp.h" #include "jni.h" -#include "hardware/gps.h" +#include "hardware_legacy/gps.h" #include "utils/Log.h" #include "utils/misc.h" diff --git a/core/jni/android_os_Hardware.cpp b/core/jni/android_os_Hardware.cpp index a302498dde4cd..bc8af7801707a 100644 --- a/core/jni/android_os_Hardware.cpp +++ b/core/jni/android_os_Hardware.cpp @@ -14,9 +14,9 @@ * limitations under the License. */ -#include -#include -#include +#include +#include +#include #include #include diff --git a/core/jni/android_os_Power.cpp b/core/jni/android_os_Power.cpp index 4e70f633be83c..c2d75b1fe3e69 100644 --- a/core/jni/android_os_Power.cpp +++ b/core/jni/android_os_Power.cpp @@ -19,7 +19,7 @@ #include "jni.h" #include "android_runtime/AndroidRuntime.h" #include -#include +#include #include namespace android diff --git a/core/jni/android_os_UEventObserver.cpp b/core/jni/android_os_UEventObserver.cpp index cac4372c8da04..7f31b00270ae5 100644 --- a/core/jni/android_os_UEventObserver.cpp +++ b/core/jni/android_os_UEventObserver.cpp @@ -17,7 +17,7 @@ #define LOG_TAG "UEventObserver" #include "utils/Log.h" -#include "hardware/uevent.h" +#include "hardware_legacy/uevent.h" #include "jni.h" #include "JNIHelp.h" #include "android_runtime/AndroidRuntime.h" diff --git a/core/jni/android_server_BluetoothA2dpService.cpp b/core/jni/android_server_BluetoothA2dpService.cpp index 19ed39f8d2ded..062f8933b23ac 100644 --- a/core/jni/android_server_BluetoothA2dpService.cpp +++ b/core/jni/android_server_BluetoothA2dpService.cpp @@ -270,11 +270,18 @@ static void onDisconnectSinkResult(DBusMessage *msg, void *user) { if (dbus_set_error_from_message(&err, msg)) { /* if (!strcmp(err.name, BLUEZ_DBUS_BASE_IFC ".Error.AuthenticationFailed")) */ LOGE("%s: D-Bus error: %s (%s)\n", __FUNCTION__, err.name, err.message); + if (strcmp(err.name, "org.bluez.Error.NotConnected") == 0) { + // we were already disconnected, so report disconnect + env->CallVoidMethod(nat->me, + method_onSinkDisconnected, + env->NewStringUTF(c_path)); + } else { + // Assume it is still connected + env->CallVoidMethod(nat->me, + method_onSinkConnected, + env->NewStringUTF(c_path)); + } dbus_error_free(&err); - // Assume it is still connected - env->CallVoidMethod(nat->me, - method_onSinkConnected, - env->NewStringUTF(c_path)); if (env->ExceptionCheck()) { LOGE("VM Exception occurred in native function %s (%s:%d)", __FUNCTION__, __FILE__, __LINE__); diff --git a/core/jni/server/Android.mk b/core/jni/server/Android.mk index bd08da3640fe6..2f48edfb48e57 100644 --- a/core/jni/server/Android.mk +++ b/core/jni/server/Android.mk @@ -16,6 +16,7 @@ LOCAL_C_INCLUDES += \ LOCAL_SHARED_LIBRARIES := \ libcutils \ libhardware \ + libhardware_legacy \ libnativehelper \ libsystem_server \ libutils \ diff --git a/core/jni/server/com_android_server_HardwareService.cpp b/core/jni/server/com_android_server_HardwareService.cpp index 479e57df3311d..224ab186d5e49 100644 --- a/core/jni/server/com_android_server_HardwareService.cpp +++ b/core/jni/server/com_android_server_HardwareService.cpp @@ -23,7 +23,7 @@ #include "android_runtime/AndroidRuntime.h" #include #include -#include +#include namespace android { diff --git a/core/res/res/anim/input_method_enter.xml b/core/res/res/anim/input_method_enter.xml index 5e8a084245b48..572a266f53fd3 100644 --- a/core/res/res/anim/input_method_enter.xml +++ b/core/res/res/anim/input_method_enter.xml @@ -24,9 +24,9 @@ + android:duration="100" /> --> - - + + diff --git a/core/res/res/anim/input_method_exit.xml b/core/res/res/anim/input_method_exit.xml index 843cb185ebc39..d28313af0bd4d 100644 --- a/core/res/res/anim/input_method_exit.xml +++ b/core/res/res/anim/input_method_exit.xml @@ -19,13 +19,13 @@ --> - - + + android:duration="100"/> diff --git a/core/res/res/drawable/btn_code_lock_default_trackball_selected.png b/core/res/res/drawable/btn_code_lock_default_trackball_selected.png deleted file mode 100755 index 2e696c6c5254b..0000000000000 Binary files a/core/res/res/drawable/btn_code_lock_default_trackball_selected.png and /dev/null differ diff --git a/core/res/res/drawable/btn_default_longpress.9.png b/core/res/res/drawable/btn_default_longpress.9.png deleted file mode 100644 index d42ae0b3456fd..0000000000000 Binary files a/core/res/res/drawable/btn_default_longpress.9.png and /dev/null differ diff --git a/core/res/res/drawable/btn_default_small_longpress.9.png b/core/res/res/drawable/btn_default_small_longpress.9.png deleted file mode 100644 index 63c28c0182282..0000000000000 Binary files a/core/res/res/drawable/btn_default_small_longpress.9.png and /dev/null differ diff --git a/core/res/res/drawable/btn_dialog_disable_focused.png b/core/res/res/drawable/btn_dialog_disable_focused.png deleted file mode 100755 index 23545ca7535c6..0000000000000 Binary files a/core/res/res/drawable/btn_dialog_disable_focused.png and /dev/null differ diff --git a/core/res/res/drawable/btn_dropdown_disabled.9.png b/core/res/res/drawable/btn_dropdown_disabled.9.png deleted file mode 100644 index 529511aa1ba4c..0000000000000 Binary files a/core/res/res/drawable/btn_dropdown_disabled.9.png and /dev/null differ diff --git a/core/res/res/drawable/btn_dropdown_down.9.png b/core/res/res/drawable/btn_dropdown_down.9.png deleted file mode 100644 index 94641399bb3e0..0000000000000 Binary files a/core/res/res/drawable/btn_dropdown_down.9.png and /dev/null differ diff --git a/core/res/res/drawable/btn_flicker_minus.png b/core/res/res/drawable/btn_flicker_minus.png deleted file mode 100755 index 9001654f02bbf..0000000000000 Binary files a/core/res/res/drawable/btn_flicker_minus.png and /dev/null differ diff --git a/core/res/res/drawable/btn_flicker_plus.png b/core/res/res/drawable/btn_flicker_plus.png deleted file mode 100755 index 2d34a4677b3c5..0000000000000 Binary files a/core/res/res/drawable/btn_flicker_plus.png and /dev/null differ diff --git a/core/res/res/drawable/btn_keyboard_key_longpress.9.png b/core/res/res/drawable/btn_keyboard_key_longpress.9.png deleted file mode 100644 index a62a60de6a8cf..0000000000000 Binary files a/core/res/res/drawable/btn_keyboard_key_longpress.9.png and /dev/null differ diff --git a/core/res/res/drawable/btn_keyboard_key_longpress_off.9.png b/core/res/res/drawable/btn_keyboard_key_longpress_off.9.png deleted file mode 100644 index f03f29c03da98..0000000000000 Binary files a/core/res/res/drawable/btn_keyboard_key_longpress_off.9.png and /dev/null differ diff --git a/core/res/res/drawable/btn_keyboard_key_longpress_on.9.png b/core/res/res/drawable/btn_keyboard_key_longpress_on.9.png deleted file mode 100644 index 90e572adce94d..0000000000000 Binary files a/core/res/res/drawable/btn_keyboard_key_longpress_on.9.png and /dev/null differ diff --git a/core/res/res/drawable/btn_radio_off_disable.png b/core/res/res/drawable/btn_radio_off_disable.png deleted file mode 100755 index 166a9f3dfc228..0000000000000 Binary files a/core/res/res/drawable/btn_radio_off_disable.png and /dev/null differ diff --git a/core/res/res/drawable/btn_radio_off_disable_focused.png b/core/res/res/drawable/btn_radio_off_disable_focused.png deleted file mode 100755 index cdec0c3f6c0d4..0000000000000 Binary files a/core/res/res/drawable/btn_radio_off_disable_focused.png and /dev/null differ diff --git a/core/res/res/drawable/btn_radio_off_longpress.png b/core/res/res/drawable/btn_radio_off_longpress.png deleted file mode 100644 index 8938ae402e114..0000000000000 Binary files a/core/res/res/drawable/btn_radio_off_longpress.png and /dev/null differ diff --git a/core/res/res/drawable/btn_radio_on_disable.png b/core/res/res/drawable/btn_radio_on_disable.png deleted file mode 100755 index 26c75f8f7f0ef..0000000000000 Binary files a/core/res/res/drawable/btn_radio_on_disable.png and /dev/null differ diff --git a/core/res/res/drawable/btn_radio_on_disable_focused.png b/core/res/res/drawable/btn_radio_on_disable_focused.png deleted file mode 100755 index 12b9b91d80207..0000000000000 Binary files a/core/res/res/drawable/btn_radio_on_disable_focused.png and /dev/null differ diff --git a/core/res/res/drawable/btn_radio_on_longpress.png b/core/res/res/drawable/btn_radio_on_longpress.png deleted file mode 100644 index 8588977a404fd..0000000000000 Binary files a/core/res/res/drawable/btn_radio_on_longpress.png and /dev/null differ diff --git a/core/res/res/drawable/btn_star_big_off_longpress.png b/core/res/res/drawable/btn_star_big_off_longpress.png deleted file mode 100755 index 8b9815a1f4da0..0000000000000 Binary files a/core/res/res/drawable/btn_star_big_off_longpress.png and /dev/null differ diff --git a/core/res/res/drawable/btn_star_big_on_longpress.png b/core/res/res/drawable/btn_star_big_on_longpress.png deleted file mode 100755 index fbedb53974d86..0000000000000 Binary files a/core/res/res/drawable/btn_star_big_on_longpress.png and /dev/null differ diff --git a/core/res/res/drawable/btn_white_longpress.9.png b/core/res/res/drawable/btn_white_longpress.9.png deleted file mode 100644 index 546e5defb3830..0000000000000 Binary files a/core/res/res/drawable/btn_white_longpress.9.png and /dev/null differ diff --git a/core/res/res/drawable/contextual_menu_bottom_bright.9.png b/core/res/res/drawable/contextual_menu_bottom_bright.9.png deleted file mode 100644 index 2b222faa47449..0000000000000 Binary files a/core/res/res/drawable/contextual_menu_bottom_bright.9.png and /dev/null differ diff --git a/core/res/res/drawable/contextual_menu_top_dark.9.png b/core/res/res/drawable/contextual_menu_top_dark.9.png deleted file mode 100644 index 69a59eade3fff..0000000000000 Binary files a/core/res/res/drawable/contextual_menu_top_dark.9.png and /dev/null differ diff --git a/core/res/res/drawable/editbox_dropdown_arrowdown.png b/core/res/res/drawable/editbox_dropdown_arrowdown.png deleted file mode 100644 index 82dc409366e93..0000000000000 Binary files a/core/res/res/drawable/editbox_dropdown_arrowdown.png and /dev/null differ diff --git a/core/res/res/drawable/editbox_dropdown_arrowup.png b/core/res/res/drawable/editbox_dropdown_arrowup.png deleted file mode 100644 index a84512ae738da..0000000000000 Binary files a/core/res/res/drawable/editbox_dropdown_arrowup.png and /dev/null differ diff --git a/core/res/res/drawable/grey_list_separator.9.png b/core/res/res/drawable/grey_list_separator.9.png deleted file mode 100644 index 8a1a3363f5ad5..0000000000000 Binary files a/core/res/res/drawable/grey_list_separator.9.png and /dev/null differ diff --git a/core/res/res/drawable/highlight_disabled_pressed.9.png b/core/res/res/drawable/highlight_disabled_pressed.9.png deleted file mode 100644 index ee35d393524a1..0000000000000 Binary files a/core/res/res/drawable/highlight_disabled_pressed.9.png and /dev/null differ diff --git a/core/res/res/drawable/highlight_pressed_dimmed.9.png b/core/res/res/drawable/highlight_pressed_dimmed.9.png deleted file mode 100644 index dad714b8f1dd2..0000000000000 Binary files a/core/res/res/drawable/highlight_pressed_dimmed.9.png and /dev/null differ diff --git a/core/res/res/drawable/ic_check_mark_dark.png b/core/res/res/drawable/ic_check_mark_dark.png deleted file mode 100644 index 7de2553df5dbf..0000000000000 Binary files a/core/res/res/drawable/ic_check_mark_dark.png and /dev/null differ diff --git a/core/res/res/drawable/ic_check_mark_light.png b/core/res/res/drawable/ic_check_mark_light.png deleted file mode 100644 index 137696e19dfde..0000000000000 Binary files a/core/res/res/drawable/ic_check_mark_light.png and /dev/null differ diff --git a/core/res/res/drawable/indicator_show_current_selected_dark.png b/core/res/res/drawable/indicator_show_current_selected_dark.png deleted file mode 100755 index 9c77920ab808e..0000000000000 Binary files a/core/res/res/drawable/indicator_show_current_selected_dark.png and /dev/null differ diff --git a/core/res/res/drawable/lock_asset.png b/core/res/res/drawable/lock_asset.png deleted file mode 100644 index 5d52537e3af3b..0000000000000 Binary files a/core/res/res/drawable/lock_asset.png and /dev/null differ diff --git a/core/res/res/drawable/panel_picture_frame_bg_disabled.9.png b/core/res/res/drawable/panel_picture_frame_bg_disabled.9.png deleted file mode 100644 index 786b361adbe67..0000000000000 Binary files a/core/res/res/drawable/panel_picture_frame_bg_disabled.9.png and /dev/null differ diff --git a/core/res/res/drawable/pickerbox_divider.png b/core/res/res/drawable/pickerbox_divider.png deleted file mode 100644 index 2e82f661180c7..0000000000000 Binary files a/core/res/res/drawable/pickerbox_divider.png and /dev/null differ diff --git a/core/res/res/drawable/popup_divider_horizontal_dark.9.png b/core/res/res/drawable/popup_divider_horizontal_dark.9.png deleted file mode 100644 index b69619b4bd0c6..0000000000000 Binary files a/core/res/res/drawable/popup_divider_horizontal_dark.9.png and /dev/null differ diff --git a/core/res/res/drawable/progress_frame.9.png b/core/res/res/drawable/progress_frame.9.png deleted file mode 100644 index 70bd484a89059..0000000000000 Binary files a/core/res/res/drawable/progress_frame.9.png and /dev/null differ diff --git a/core/res/res/drawable/progress_inner.9.png b/core/res/res/drawable/progress_inner.9.png deleted file mode 100644 index 1db9b654cb6d8..0000000000000 Binary files a/core/res/res/drawable/progress_inner.9.png and /dev/null differ diff --git a/core/res/res/drawable/progress_particle_small.png b/core/res/res/drawable/progress_particle_small.png deleted file mode 100644 index 397d8ac1bcb23..0000000000000 Binary files a/core/res/res/drawable/progress_particle_small.png and /dev/null differ diff --git a/core/res/res/drawable/screen_title_background.9.png b/core/res/res/drawable/screen_title_background.9.png deleted file mode 100644 index fed37b8117fa9..0000000000000 Binary files a/core/res/res/drawable/screen_title_background.9.png and /dev/null differ diff --git a/core/res/res/drawable/scroll_thumb_horz.9.png b/core/res/res/drawable/scroll_thumb_horz.9.png deleted file mode 100644 index 5c7db1a974f7a..0000000000000 Binary files a/core/res/res/drawable/scroll_thumb_horz.9.png and /dev/null differ diff --git a/core/res/res/drawable/scroll_thumb_vert.9.png b/core/res/res/drawable/scroll_thumb_vert.9.png deleted file mode 100644 index ef660c39ea254..0000000000000 Binary files a/core/res/res/drawable/scroll_thumb_vert.9.png and /dev/null differ diff --git a/core/res/res/drawable/scrollbar.9.png b/core/res/res/drawable/scrollbar.9.png deleted file mode 100644 index 6e2268bd342e9..0000000000000 Binary files a/core/res/res/drawable/scrollbar.9.png and /dev/null differ diff --git a/core/res/res/drawable/spinnerbox_background_focus_yellow.9.png b/core/res/res/drawable/spinnerbox_background_focus_yellow.9.png deleted file mode 100644 index f1b86925a8b4b..0000000000000 Binary files a/core/res/res/drawable/spinnerbox_background_focus_yellow.9.png and /dev/null differ diff --git a/core/res/res/drawable/spinnerbox_background_normal.9.png b/core/res/res/drawable/spinnerbox_background_normal.9.png deleted file mode 100644 index c64de3cacf045..0000000000000 Binary files a/core/res/res/drawable/spinnerbox_background_normal.9.png and /dev/null differ diff --git a/core/res/res/drawable/spinnerbox_background_pressed_yellow.9.png b/core/res/res/drawable/spinnerbox_background_pressed_yellow.9.png deleted file mode 100644 index 984d2b8da9796..0000000000000 Binary files a/core/res/res/drawable/spinnerbox_background_pressed_yellow.9.png and /dev/null differ diff --git a/core/res/res/drawable/starting_frame.9.png b/core/res/res/drawable/starting_frame.9.png deleted file mode 100644 index 4b2b78c9e999e..0000000000000 Binary files a/core/res/res/drawable/starting_frame.9.png and /dev/null differ diff --git a/core/res/res/drawable/stat_notify_browser.png b/core/res/res/drawable/stat_notify_browser.png deleted file mode 100644 index f08534bcf3c1a..0000000000000 Binary files a/core/res/res/drawable/stat_notify_browser.png and /dev/null differ diff --git a/core/res/res/drawable/stat_notify_xmpp.png b/core/res/res/drawable/stat_notify_xmpp.png deleted file mode 100644 index dc79203cabaee..0000000000000 Binary files a/core/res/res/drawable/stat_notify_xmpp.png and /dev/null differ diff --git a/core/res/res/drawable/status_bar_item_clear_background.9.png b/core/res/res/drawable/status_bar_item_clear_background.9.png deleted file mode 100644 index e3036e611f2a8..0000000000000 Binary files a/core/res/res/drawable/status_bar_item_clear_background.9.png and /dev/null differ diff --git a/core/res/res/drawable/status_bar_shadow_bar.9.png b/core/res/res/drawable/status_bar_shadow_bar.9.png deleted file mode 100644 index 9c4463c69ecaa..0000000000000 Binary files a/core/res/res/drawable/status_bar_shadow_bar.9.png and /dev/null differ diff --git a/core/res/res/drawable/sub_menu_bottom_bright.9.png b/core/res/res/drawable/sub_menu_bottom_bright.9.png deleted file mode 100644 index ce93435cffaae..0000000000000 Binary files a/core/res/res/drawable/sub_menu_bottom_bright.9.png and /dev/null differ diff --git a/core/res/res/drawable/sub_menu_top_dark.9.png b/core/res/res/drawable/sub_menu_top_dark.9.png deleted file mode 100644 index 9e82fe99aace7..0000000000000 Binary files a/core/res/res/drawable/sub_menu_top_dark.9.png and /dev/null differ diff --git a/core/res/res/drawable/submenu_arrow_back.png b/core/res/res/drawable/submenu_arrow_back.png deleted file mode 100644 index 733aa13fd3e9d..0000000000000 Binary files a/core/res/res/drawable/submenu_arrow_back.png and /dev/null differ diff --git a/core/res/res/drawable/submenu_arrow_focus.png b/core/res/res/drawable/submenu_arrow_focus.png deleted file mode 100644 index 2ed159918d13b..0000000000000 Binary files a/core/res/res/drawable/submenu_arrow_focus.png and /dev/null differ diff --git a/core/res/res/drawable/sym_battery_white.png b/core/res/res/drawable/sym_battery_white.png deleted file mode 100644 index d1849fc650ddf..0000000000000 Binary files a/core/res/res/drawable/sym_battery_white.png and /dev/null differ diff --git a/core/res/res/drawable/sym_default_number.png b/core/res/res/drawable/sym_default_number.png deleted file mode 100644 index b1ed071f6bd74..0000000000000 Binary files a/core/res/res/drawable/sym_default_number.png and /dev/null differ diff --git a/core/res/res/drawable/tab_bottom_shadow.9.png b/core/res/res/drawable/tab_bottom_shadow.9.png deleted file mode 100755 index 3ac4f53469bc9..0000000000000 Binary files a/core/res/res/drawable/tab_bottom_shadow.9.png and /dev/null differ diff --git a/core/res/res/drawable/tab_selected_highlight.9.png b/core/res/res/drawable/tab_selected_highlight.9.png deleted file mode 100644 index 61568a3a8f4d5..0000000000000 Binary files a/core/res/res/drawable/tab_selected_highlight.9.png and /dev/null differ diff --git a/core/res/res/drawable/tab_unselected_longpress.9.png b/core/res/res/drawable/tab_unselected_longpress.9.png deleted file mode 100644 index 65556c45a33f0..0000000000000 Binary files a/core/res/res/drawable/tab_unselected_longpress.9.png and /dev/null differ diff --git a/core/res/res/drawable/tab_unselected_pressed.9.png b/core/res/res/drawable/tab_unselected_pressed.9.png deleted file mode 100644 index b4102eb4a3e60..0000000000000 Binary files a/core/res/res/drawable/tab_unselected_pressed.9.png and /dev/null differ diff --git a/core/res/res/drawable/tab_unselected_selected.9.png b/core/res/res/drawable/tab_unselected_selected.9.png deleted file mode 100644 index 320f754d9069c..0000000000000 Binary files a/core/res/res/drawable/tab_unselected_selected.9.png and /dev/null differ diff --git a/core/res/res/drawable/textfield_expanded_bottom_selected.9.png b/core/res/res/drawable/textfield_expanded_bottom_selected.9.png deleted file mode 100755 index 935acaf584d58..0000000000000 Binary files a/core/res/res/drawable/textfield_expanded_bottom_selected.9.png and /dev/null differ diff --git a/core/res/res/drawable/textfield_expanded_bottom_unselected.9.png b/core/res/res/drawable/textfield_expanded_bottom_unselected.9.png deleted file mode 100755 index 1e5f28d4ec4f8..0000000000000 Binary files a/core/res/res/drawable/textfield_expanded_bottom_unselected.9.png and /dev/null differ diff --git a/core/res/res/drawable/textfield_expanded_center_selected.9.png b/core/res/res/drawable/textfield_expanded_center_selected.9.png deleted file mode 100755 index b60a0ad7dd8ee..0000000000000 Binary files a/core/res/res/drawable/textfield_expanded_center_selected.9.png and /dev/null differ diff --git a/core/res/res/drawable/textfield_expanded_center_unselected.9.png b/core/res/res/drawable/textfield_expanded_center_unselected.9.png deleted file mode 100755 index f38c58f9b0337..0000000000000 Binary files a/core/res/res/drawable/textfield_expanded_center_unselected.9.png and /dev/null differ diff --git a/core/res/res/drawable/textfield_expanded_top_selected.9.png b/core/res/res/drawable/textfield_expanded_top_selected.9.png deleted file mode 100755 index 926d09fac2e4f..0000000000000 Binary files a/core/res/res/drawable/textfield_expanded_top_selected.9.png and /dev/null differ diff --git a/core/res/res/drawable/textfield_expanded_top_unselected.9.png b/core/res/res/drawable/textfield_expanded_top_unselected.9.png deleted file mode 100755 index ab1b1ad9406dd..0000000000000 Binary files a/core/res/res/drawable/textfield_expanded_top_unselected.9.png and /dev/null differ diff --git a/core/res/res/drawable/zoom_in.png b/core/res/res/drawable/zoom_in.png deleted file mode 100644 index d151046285460..0000000000000 Binary files a/core/res/res/drawable/zoom_in.png and /dev/null differ diff --git a/core/res/res/drawable/zoom_in_pressed.png b/core/res/res/drawable/zoom_in_pressed.png deleted file mode 100644 index 963bf73fb8320..0000000000000 Binary files a/core/res/res/drawable/zoom_in_pressed.png and /dev/null differ diff --git a/core/res/res/drawable/zoom_indicator.9.png b/core/res/res/drawable/zoom_indicator.9.png deleted file mode 100644 index c799193684024..0000000000000 Binary files a/core/res/res/drawable/zoom_indicator.9.png and /dev/null differ diff --git a/core/res/res/drawable/zoom_indicator_selected.png b/core/res/res/drawable/zoom_indicator_selected.png deleted file mode 100644 index 20a72c10ec91a..0000000000000 Binary files a/core/res/res/drawable/zoom_indicator_selected.png and /dev/null differ diff --git a/core/res/res/drawable/zoom_out.png b/core/res/res/drawable/zoom_out.png deleted file mode 100644 index 2efbc471f296a..0000000000000 Binary files a/core/res/res/drawable/zoom_out.png and /dev/null differ diff --git a/core/res/res/drawable/zoom_out_pressed.png b/core/res/res/drawable/zoom_out_pressed.png deleted file mode 100644 index 39e145cbb6a09..0000000000000 Binary files a/core/res/res/drawable/zoom_out_pressed.png and /dev/null differ diff --git a/core/res/res/drawable/zoom_track.png b/core/res/res/drawable/zoom_track.png deleted file mode 100644 index 71e71a942dda2..0000000000000 Binary files a/core/res/res/drawable/zoom_track.png and /dev/null differ diff --git a/core/res/res/layout/search_bar.xml b/core/res/res/layout/search_bar.xml index c88b0a20301fd..6678bc2f7f048 100644 --- a/core/res/res/layout/search_bar.xml +++ b/core/res/res/layout/search_bar.xml @@ -70,15 +70,14 @@ android:gravity="center_vertical" android:baselineAligned="false" > - + android:inputType="text|textAutoComplete" /> diff --git a/core/res/res/raw-ar/loaderror.html b/core/res/res/raw-ar/loaderror.html new file mode 100644 index 0000000000000..edcd63a52b408 --- /dev/null +++ b/core/res/res/raw-ar/loaderror.html @@ -0,0 +1,18 @@ + + + صفحة الويب غير متوفرة + + + + + +

    صفحة الويب غير متوفرة

    +

    تعذر تحميل صفحة الويب الموجودة على %s كـ:

    + +

    %e

    + + + diff --git a/core/res/res/raw-ar/nodomain.html b/core/res/res/raw-ar/nodomain.html new file mode 100644 index 0000000000000..bc070f61b5a34 --- /dev/null +++ b/core/res/res/raw-ar/nodomain.html @@ -0,0 +1,24 @@ + + + صفحة الويب غير متوفرة + + + + + +

    صفحة الويب غير متوفرة

    +

    قد تكون صفحة الويب الموجودة على %s معطلة مؤقتًا، أو قد تمّ نقلها نهائيًا إلى عنوان ويب جديد.

    + +

    فيما يلي بعض الاقتراحات:

    +
      +
    • تأكد من أن جهازك به وصلة للإشارة والبيانات.
    • +
    • أعد تحميل صفحة الويب لاحقًا.
    • +
    • قم بعرض نسخة مخبأة من صفحة الويب من صفحة Google.
    • + +
    + + + diff --git a/core/res/res/raw-cs/loaderror.html b/core/res/res/raw-cs/loaderror.html new file mode 100644 index 0000000000000..ce88981aadf5a --- /dev/null +++ b/core/res/res/raw-cs/loaderror.html @@ -0,0 +1,18 @@ + + + Webová stránka není dostupná + + + + + +

    Webová stránka není dostupná

    +

    Webová stránka na adrese %s nemohla být načtena. Chyba:

    + +

    %e

    + + + diff --git a/core/res/res/raw-cs/nodomain.html b/core/res/res/raw-cs/nodomain.html new file mode 100644 index 0000000000000..26479a9a26978 --- /dev/null +++ b/core/res/res/raw-cs/nodomain.html @@ -0,0 +1,24 @@ + + + Webová stránka není dostupná + + + + + +

    Webová stránka není dostupná

    +

    Webová stránka na adrese %s je možná dočasně nedostupná nebo byla možná přesunuta na novou adresu.

    + +

    Možnosti dalšího postupu:

    +
      +
    • Zkontrolujte na svém zařízení, zda je signál dostatečně silný a zda je funkční datové připojení.
    • +
    • Otevřete tuto webovou stránku později.
    • +
    • Podívejte se na kopii této webové stránky v mezipaměti vyhledávače Google
    • + +
    + + + diff --git a/core/res/res/raw-da/loaderror.html b/core/res/res/raw-da/loaderror.html new file mode 100644 index 0000000000000..12a75c6cc1390 --- /dev/null +++ b/core/res/res/raw-da/loaderror.html @@ -0,0 +1,18 @@ + + + Websiden er ikke tilgængelig + + + + + +

    Websiden er ikke tilgængelig

    +

    Websiden på %s kunne ikke indlæses som:

    + +

    %e

    + + + diff --git a/core/res/res/raw-da/nodomain.html b/core/res/res/raw-da/nodomain.html new file mode 100644 index 0000000000000..3b8fe78f51b08 --- /dev/null +++ b/core/res/res/raw-da/nodomain.html @@ -0,0 +1,24 @@ + + + Websiden er ikke tilgængelig + + + + + +

    Websiden er ikke tilgængelig

    +

    Websiden på %s kan være midlertidigt nede eller flyttet permanent til en ny internetadresse.

    + +

    Her er nogle forslag:

    +
      +
    • Kontroller, at dit udstyr har signal- og dataforbindelse
    • +
    • Genindlæs websiden senere
    • +
    • Se en cached kopi af websiden fra Google
    • + +
    + + + diff --git a/core/res/res/raw-en-rGB/loaderror.html b/core/res/res/raw-en-rGB/loaderror.html new file mode 100644 index 0000000000000..359a1e76f2844 --- /dev/null +++ b/core/res/res/raw-en-rGB/loaderror.html @@ -0,0 +1,18 @@ + + + Web page not available + + + + + +

    Web page not available

    +

    The Web page at %s could not be loaded as:

    + +

    %e

    + + + diff --git a/core/res/res/raw-en-rGB/nodomain.html b/core/res/res/raw-en-rGB/nodomain.html new file mode 100644 index 0000000000000..01dd6033adde5 --- /dev/null +++ b/core/res/res/raw-en-rGB/nodomain.html @@ -0,0 +1,24 @@ + + + Web page not available + + + + + +

    Web page not available

    +

    The Web page at %s might be temporarily down or it may have moved permanently to a new web address.

    + +

    Here are some suggestions:

    +
      +
    • Check to make sure that your device has a signal and data connection
    • +
    • Reload this web page later.
    • +
    • View a cached copy of the web page from Google
    • + +
    + + + diff --git a/core/res/res/raw-es/loaderror.html b/core/res/res/raw-es/loaderror.html new file mode 100644 index 0000000000000..8829bf5ff2a12 --- /dev/null +++ b/core/res/res/raw-es/loaderror.html @@ -0,0 +1,18 @@ + + + Página web no disponible + + + + + +

    Página web no disponible

    +

    La página web %s no se ha podido cargar como:

    + +

    %e

    + + + diff --git a/core/res/res/raw-es/nodomain.html b/core/res/res/raw-es/nodomain.html new file mode 100644 index 0000000000000..a11333ebb3e17 --- /dev/null +++ b/core/res/res/raw-es/nodomain.html @@ -0,0 +1,24 @@ + + + Página web no disponible + + + + + +

    Página web no disponible

    +

    Es posible que la página web %s se encuentre temporalmente fuera de servicio o se haya trasladado a otra dirección web de forma permanente.

    + +

    Sugerencias:

    +
      +
    • Asegúrate de que tu dispositivo disponga de señal y de una conexión de datos.
    • +
    • Vuelve a cargar la página más tarde.
    • +
    • Accede a una copia de la página almacenada en caché desde Google.
    • + +
    + + + diff --git a/core/res/res/raw-fi/loaderror.html b/core/res/res/raw-fi/loaderror.html new file mode 100644 index 0000000000000..3b1ec9785cde5 --- /dev/null +++ b/core/res/res/raw-fi/loaderror.html @@ -0,0 +1,18 @@ + + + Verkkosivu ei ole käytettävissä + + + + + +

    Verkkosivu ei ole käytettävissä

    +

    Verkkosivua osoitteessa %s ei voi ladata, koska:

    + +

    %e

    + + + diff --git a/core/res/res/raw-fi/nodomain.html b/core/res/res/raw-fi/nodomain.html new file mode 100644 index 0000000000000..84fedb4c71005 --- /dev/null +++ b/core/res/res/raw-fi/nodomain.html @@ -0,0 +1,24 @@ + + + Verkkosivu ei ole käytettävissä + + + + + +

    Verkkosivu ei ole käytettävissä

    +

    Verkkosivu osoitteessa %s saattaa olla väliaikaisesti pois käytöstä tai muuttanut pysyvästi uuteen osoitteeseen.

    + +

    Tässä muutamia ehdotuksia:

    +
      +
    • Tarkista, että laitteesi signaali ja verkkoyhteys ovat kunnossa
    • +
    • Lataa tämä verkkosivu myöhemmin uudelleen.
    • +
    • Katsele Googlessa verkkosivun välimuistissa olevaa versiota
    • + +
    + + + diff --git a/core/res/res/raw-fr/loaderror.html b/core/res/res/raw-fr/loaderror.html new file mode 100644 index 0000000000000..f61f50bd1f01b --- /dev/null +++ b/core/res/res/raw-fr/loaderror.html @@ -0,0 +1,18 @@ + + + Page Web non disponible + + + + + +

    Page Web non disponible

    +

    Impossible de charger la page Web à l'adresse %s en tant que :

    + +

    %e

    + + + diff --git a/core/res/res/raw-fr/nodomain.html b/core/res/res/raw-fr/nodomain.html new file mode 100644 index 0000000000000..b3b93b36eebad --- /dev/null +++ b/core/res/res/raw-fr/nodomain.html @@ -0,0 +1,24 @@ + + + Page Web non disponible + + + + + +

    Page Web non disponible

    +

    La page Web à l'adresse %s est peut-être temporairement inaccessible ou a été déplacée définitivement vers une nouvelle adresse Web.

    + +

    Voici quelques suggestions :

    +
      +
    • assurez-vous que votre appareil émet un signal et dispose d'une connexion de données ;
    • +
    • rechargez cette page Web ultérieurement ;
    • +
    • affichez une copie en cache de la page Web à partir de Google.
    • + +
    + + + diff --git a/core/res/res/raw-hu/loaderror.html b/core/res/res/raw-hu/loaderror.html new file mode 100644 index 0000000000000..6b3d45e496c75 --- /dev/null +++ b/core/res/res/raw-hu/loaderror.html @@ -0,0 +1,18 @@ + + + A weboldal nem érhető el + + + + + +

    A weboldal nem érhető el

    +

    A következő %s weboldalt nem sikerült betölteni, mert:

    + +

    %e

    + + + diff --git a/core/res/res/raw-hu/nodomain.html b/core/res/res/raw-hu/nodomain.html new file mode 100644 index 0000000000000..d3465fffd969c --- /dev/null +++ b/core/res/res/raw-hu/nodomain.html @@ -0,0 +1,24 @@ + + + A weboldal nem érhető el + + + + + +

    A weboldal nem érhető el

    +

    A következő %s weboldal valószínűleg ideiglenesen üzemen kívül van vagy véglegesen új webcímre költözött.

    + +

    Íme pár javaslat:

    +
      +
    • Ellenőrizze, hogy készüléke fogja-e a jelet és képes-e adatátvitelre.
    • +
    • Töltse újra ezt a weboldalt később.
    • +
    • A weboldal tárolt változatának megtekintése a Google-ról
    • + +
    + + + diff --git a/core/res/res/raw-it/loaderror.html b/core/res/res/raw-it/loaderror.html new file mode 100644 index 0000000000000..e81466aee719d --- /dev/null +++ b/core/res/res/raw-it/loaderror.html @@ -0,0 +1,18 @@ + + + Pagina web non disponibile + + + + + +

    Pagina web non disponibile

    +

    Non è stato possibile caricare la pagina web all'indirizzo %s. Errore:

    + +

    %e

    + + + diff --git a/core/res/res/raw-it/nodomain.html b/core/res/res/raw-it/nodomain.html new file mode 100644 index 0000000000000..a2321c7669d6b --- /dev/null +++ b/core/res/res/raw-it/nodomain.html @@ -0,0 +1,24 @@ + + + Pagina web non disponibile + + + + + +

    Pagina web non disponibile

    +

    La pagina web all'indirizzo %s potrebbe essere temporaneamente non disponibile oppure essere stata spostata permanentemente a un nuovo indirizzo.

    + +

    Ecco alcuni suggerimenti:

    +
      +
    • Controlla che ci sia segnale e che la connessione dati sia attiva
    • +
    • Ricarica la pagina web in seguito
    • +
    • Visualizza la copia cache della pagina web su Google
    • + +
    + + + diff --git a/core/res/res/raw-iw/loaderror.html b/core/res/res/raw-iw/loaderror.html new file mode 100644 index 0000000000000..8155432a24b5a --- /dev/null +++ b/core/res/res/raw-iw/loaderror.html @@ -0,0 +1,18 @@ + + + דף אינטרנט לא זמין + + + + + +

    דף אינטרנט לא זמין

    +

    דף האינטרנט ב-‎%s‎ לא ניטן לטעינה בתור:

    + +

    ‎%e

    + + + diff --git a/core/res/res/raw-iw/nodomain.html b/core/res/res/raw-iw/nodomain.html new file mode 100644 index 0000000000000..f7b9f428208a1 --- /dev/null +++ b/core/res/res/raw-iw/nodomain.html @@ -0,0 +1,24 @@ + + + דף אינטרנט לא זמין + + + + + +

    דף אינטרנט לא זמין

    +

    ייתכן שדף האינטרנט ב-‎%s‎ מושבת באופן זמני או שעבר לצמיתות לכתובת אינטרנט חדשה.

    + +

    להלן מספר הצעות:

    +
      +
    • בדוק כדי לוודא שההתקן שלך כולל חיבור אותות ונתונים
    • +
    • טען מחדש דף אינטרנט זה במועד מאוחר יותר.
    • +
    • הצג עותק של דף האינטרנט של Google שנשמר במטמון
    • + +
    + + + diff --git a/core/res/res/raw-ja/loaderror.html b/core/res/res/raw-ja/loaderror.html new file mode 100644 index 0000000000000..68e568b3d1df6 --- /dev/null +++ b/core/res/res/raw-ja/loaderror.html @@ -0,0 +1,18 @@ + + + ページが見つかりませんでした + + + + + +

    ページが見つかりませんでした

    +

    次の原因によりウェブページ %s を読み込めませんでした。

    + +

    %e

    + + + diff --git a/core/res/res/raw-ja/nodomain.html b/core/res/res/raw-ja/nodomain.html new file mode 100644 index 0000000000000..1dff1d45e75f3 --- /dev/null +++ b/core/res/res/raw-ja/nodomain.html @@ -0,0 +1,24 @@ + + + ページが見つかりませんでした + + + + + +

    ページが見つかりませんでした

    +

    ウェブページ %s は一時的にご利用いただけないか、URLが変更された可能性があります。

    + +

    ヒント:

    +
      +
    • 端末を圏内で使用していてデータ接続がアクティブであることを確認します
    • +
    • しばらくしてからページをリロードします
    • +
    • Googleでキャッシュされたページを表示します
    • + +
    + + + diff --git a/core/res/res/raw-ko/loaderror.html b/core/res/res/raw-ko/loaderror.html new file mode 100644 index 0000000000000..59f0f252cd1dd --- /dev/null +++ b/core/res/res/raw-ko/loaderror.html @@ -0,0 +1,18 @@ + + + 웹페이지를 표시할 수 없습니다. + + + + + +

    웹페이지를 표시할 수 없습니다.

    +

    %s에 있는 웹페이지를 다음으로 로드할 수 없습니다.

    + +

    %e

    + + + diff --git a/core/res/res/raw-ko/nodomain.html b/core/res/res/raw-ko/nodomain.html new file mode 100644 index 0000000000000..0eadc39439df8 --- /dev/null +++ b/core/res/res/raw-ko/nodomain.html @@ -0,0 +1,24 @@ + + + 웹페이지를 표시할 수 없습니다. + + + + + +

    웹페이지를 표시할 수 없습니다.

    +

    %s에 있는 웹페이지가 일시적으로 중단되었거나 새 웹 주소가 영구적으로 이동했을 수 있습니다.

    + +

    다음은 몇 가지 제안사항입니다.

    +
      +
    • 휴대기기의 신호 및 데이터 접속 상태를 확인하세요.
    • +
    • 나중에 웹페이지를 다시 로드하세요.
    • +
    • Google에서 웹페이지의 캐시된 사본을 확인하세요.
    • + +
    + + + diff --git a/core/res/res/raw-nl/loaderror.html b/core/res/res/raw-nl/loaderror.html new file mode 100644 index 0000000000000..76bb07c3fbb05 --- /dev/null +++ b/core/res/res/raw-nl/loaderror.html @@ -0,0 +1,18 @@ + + + Webpagina niet beschikbaar + + + + + +

    Webpagina niet beschikbaar

    +

    De webpagina op %s kan niet worden geladen als:

    + +

    %e

    + + + diff --git a/core/res/res/raw-nl/nodomain.html b/core/res/res/raw-nl/nodomain.html new file mode 100644 index 0000000000000..ffac947494d9f --- /dev/null +++ b/core/res/res/raw-nl/nodomain.html @@ -0,0 +1,24 @@ + + + Webpagina niet beschikbaar + + + + + +

    Webpagina niet beschikbaar

    +

    De webpagina op %s is mogelijk tijdelijk niet beschikbaar of is permanent verplaatst naar een nieuw webadres.

    + +

    Hier volgen enkele suggesties:

    +
      +
    • Controleer of uw apparaat een signaal en gegevensverbinding heeft.
    • +
    • Laad deze webpagina later opnieuw.
    • +
    • Bekijk een exemplaar van de webpagina uit het cachegeheugen van Google.
    • + +
    + + + diff --git a/core/res/res/raw-pl/loaderror.html b/core/res/res/raw-pl/loaderror.html new file mode 100644 index 0000000000000..9cc13422705c1 --- /dev/null +++ b/core/res/res/raw-pl/loaderror.html @@ -0,0 +1,18 @@ + + + Strona internetowa jest niedostępna + + + + + +

    Strona internetowa jest niedostępna

    +

    Nie można załadować strony internetowej pod adresem %s jako:

    + +

    %e

    + + + diff --git a/core/res/res/raw-pl/nodomain.html b/core/res/res/raw-pl/nodomain.html new file mode 100644 index 0000000000000..23f529d262acf --- /dev/null +++ b/core/res/res/raw-pl/nodomain.html @@ -0,0 +1,24 @@ + + + Strona internetowa jest niedostępna + + + + + +

    Strona internetowa jest niedostępna

    +

    Strona internetowa pod adresem %s może być czasowo niedostępna lub mogła zostać trwale przeniesiona na nowy adres internetowy.

    + +

    Oto kilka sugestii:

    +
      +
    • Upewnij się, że w urządzeniu jest sygnał i połączenie transmisji danych.
    • +
    • Ponownie załaduj tę stronę internetową później.
    • +
    • Wyświetl kopię zapasową strony internetowej z serwisu Google.
    • + +
    + + + diff --git a/core/res/res/raw-pt-rBR/loaderror.html b/core/res/res/raw-pt-rBR/loaderror.html new file mode 100644 index 0000000000000..34762391bf95f --- /dev/null +++ b/core/res/res/raw-pt-rBR/loaderror.html @@ -0,0 +1,18 @@ + + + Página da web não disponível + + + + + +

    Página da web não disponível

    +

    Não foi possível carregar a página da web localizada em %s como:

    + +

    %e

    + + + diff --git a/core/res/res/raw-pt-rBR/nodomain.html b/core/res/res/raw-pt-rBR/nodomain.html new file mode 100644 index 0000000000000..546c6104e1ee6 --- /dev/null +++ b/core/res/res/raw-pt-rBR/nodomain.html @@ -0,0 +1,24 @@ + + + Página da web não disponível + + + + + +

    Página da web não disponível

    +

    A página da web localizada em %s pode estar temporariamente inativa ou pode ter sido movida permanentemente para um novo endereço da web.

    + +

    Veja algumas sugestões:

    +
      +
    • Verifique se seu aparelho possui sinal e uma conexão de dados.
    • +
    • Carregue esta página da web novamente mais tarde.
    • +
    • Visualize uma cópia da página da web armazenada em cache proveniente do Google.
    • + +
    + + + diff --git a/core/res/res/raw-ru/loaderror.html b/core/res/res/raw-ru/loaderror.html new file mode 100644 index 0000000000000..5a0312e38aa74 --- /dev/null +++ b/core/res/res/raw-ru/loaderror.html @@ -0,0 +1,18 @@ + + + Веб-страница недоступна + + + + + +

    Веб-страница недоступна

    +

    Невозможно загрузить веб-страницу по адресу %s по следующей причине:

    + +

    %e

    + + + diff --git a/core/res/res/raw-ru/nodomain.html b/core/res/res/raw-ru/nodomain.html new file mode 100644 index 0000000000000..86a42a186907c --- /dev/null +++ b/core/res/res/raw-ru/nodomain.html @@ -0,0 +1,24 @@ + + + Веб-страница недоступна + + + + + +

    Веб-страница недоступна

    +

    Возможно, веб-страница по адресу %s временно отключена или навсегда перемещена на новый веб-адрес.

    + +

    Вот несколько советов:

    +
      +
    • Убедитесь, что у вашего устройства есть сигнал и подключение для передачи данных.
    • +
    • Повторите загрузку веб-страницы позже.
    • +
    • Просмотрите копию веб-страницы, сохраненную в кэше Google.
    • + +
    + + + diff --git a/core/res/res/raw-th/loaderror.html b/core/res/res/raw-th/loaderror.html new file mode 100644 index 0000000000000..05310a799f059 --- /dev/null +++ b/core/res/res/raw-th/loaderror.html @@ -0,0 +1,18 @@ + + + ไม่มีเว็บเพจนี้ + + + + + +

    ไม่มีเว็บเพจนี้

    +

    เว็บเพจนี้ที่ %s ไม่สามารถโหลดเป็น:

    + +

    %e

    + + + diff --git a/core/res/res/raw-th/nodomain.html b/core/res/res/raw-th/nodomain.html new file mode 100644 index 0000000000000..37b85937b9b86 --- /dev/null +++ b/core/res/res/raw-th/nodomain.html @@ -0,0 +1,24 @@ + + + ไม่มีเว็บเพจนี้ + + + + + +

    ไม่มีเว็บเพจนี้

    +

    เว็บเพจที่ %s อาจใช้งานไม่ได้ชั่วคราว หรืออาจถูกย้ายไปยังที่อยู่เว็บใหม่เป็นการถาวร

    + +

    ต่อไปนี้เป็นคำแนะนำบางประการ:

    +
      +
    • ตรวจสอบให้แน่ใจว่าอุปกรณ์ของคุณมีสัญญาณและการเชื่อมต่อข้อมูล
    • +
    • โหลดเว็บเพจนี้ใหม่ภายหลัง
    • +
    • ดูสำเนาเว็บเพจที่เก็บไว้ในแคชจาก Google
    • + +
    + + + diff --git a/core/res/res/raw-tr/loaderror.html b/core/res/res/raw-tr/loaderror.html new file mode 100644 index 0000000000000..b6f4890d1faf4 --- /dev/null +++ b/core/res/res/raw-tr/loaderror.html @@ -0,0 +1,18 @@ + + + Web sayfası yok + + + + + +

    Web sayfası yok

    +

    %s adresindeki web sayfası yüklenemedi:

    + +

    %e

    + + + diff --git a/core/res/res/raw-tr/nodomain.html b/core/res/res/raw-tr/nodomain.html new file mode 100644 index 0000000000000..a79c21bbb89e3 --- /dev/null +++ b/core/res/res/raw-tr/nodomain.html @@ -0,0 +1,24 @@ + + + Web sayfası yok + + + + + +

    Web sayfası yok

    +

    %s adresindeki web sayfası geçici olarak arızalı veya kalıcı olarak yeni bir web adresine taşınmış olabilir.

    + +

    Bazı öneriler:

    +
      +
    • Aygıtınızın sinyal aldığını ve veri bağlantısı bulunduğunu kontrol edin.
    • +
    • Bu web sayfasını daha sonra tekrar yükleyin.
    • +
    • Google'dan web sayfasının önbelleğe alınmış kopyasına bakın
    • + +
    + + + diff --git a/core/res/res/raw-zh-rCN/loaderror.html b/core/res/res/raw-zh-rCN/loaderror.html new file mode 100644 index 0000000000000..809d31f584c0b --- /dev/null +++ b/core/res/res/raw-zh-rCN/loaderror.html @@ -0,0 +1,18 @@ + + + 找不到网页 + + + + + +

    找不到网页

    +

    %s 处的网页不能载入为:

    + +

    %e

    + + + diff --git a/core/res/res/raw-zh-rCN/nodomain.html b/core/res/res/raw-zh-rCN/nodomain.html new file mode 100644 index 0000000000000..eb03187f5cfda --- /dev/null +++ b/core/res/res/raw-zh-rCN/nodomain.html @@ -0,0 +1,24 @@ + + + 找不到网页 + + + + + +

    找不到网页

    +

    %s 处的网页可能暂时出现故障,也可能已永久移至某个新的网络地址。

    + +

    以下是几点建议:

    +
      +
    • 进行检查以确保您的设备具有信号和数据连接
    • +
    • 稍后重新载入该网页。
    • +
    • 查看 Google 提供的该网页的缓存副本
    • + +
    + + + diff --git a/core/res/res/raw-zh-rTW/loaderror.html b/core/res/res/raw-zh-rTW/loaderror.html new file mode 100644 index 0000000000000..0b4695aa6070e --- /dev/null +++ b/core/res/res/raw-zh-rTW/loaderror.html @@ -0,0 +1,18 @@ + + + 您所查詢的網頁不存在或已移除 + + + + + +

    您所查詢的網頁不存在或已移除

    +

    由於以下原因,此位址 %s 的網頁無法開啟:

    + +

    %e

    + + + diff --git a/core/res/res/raw-zh-rTW/nodomain.html b/core/res/res/raw-zh-rTW/nodomain.html new file mode 100644 index 0000000000000..3577a9d2ac6a1 --- /dev/null +++ b/core/res/res/raw-zh-rTW/nodomain.html @@ -0,0 +1,24 @@ + + + 您所查詢的網頁不存在或已移除 + + + + + +

    您所查詢的網頁不存在或已移除

    +

    此網頁位址:%s 可能暫時無法存取或已經被移到新的網頁位址。

    + +

    建議您嘗試以下動作:

    +
      +
    • 檢查裝置是否有訊號、資料連線是否正常。
    • +
    • 稍後重新載入網頁
    • +
    • 從 Google 檢視網頁快取複本
    • + +
    + + + diff --git a/core/res/res/values-cs/arrays.xml b/core/res/res/values-cs/arrays.xml new file mode 100644 index 0000000000000..f9c904be4c64c --- /dev/null +++ b/core/res/res/values-cs/arrays.xml @@ -0,0 +1,4 @@ + + + diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml new file mode 100644 index 0000000000000..5859b9bc633d4 --- /dev/null +++ b/core/res/res/values-cs/strings.xml @@ -0,0 +1,724 @@ + + + "B" + "kB" + "MB" + "GB" + "TB" + "PB" + "<bez názvu>" + "…" + "(žádné telefonní číslo)" + "(Neznámé)" + "Hlasová schránka" + "MSISDN1" + "Problém s připojením nebo neplatný kód MMI." + "Služba byla zapnuta." + "Služba byla zapnuta pro:" + "Služba byla vypnuta." + "Registrace byla úspěšná." + "Smazaní proběhlo úspěšně." + "Nesprávné heslo." + "Funkce MMI byla dokončena." + "Původní kód PIN byl zadán nesprávně." + "Kód PUK byl zadán nesprávně." + "Zadané kódy PIN se neshodují." + "Zadejte kód PIN o délce 4-8 číslic." + "Karta SIM je blokována pomocí kódu PUK. Odblokujete ji zadáním kódu PUK." + "Chcete-li odblokovat kartu SIM, zadejte kód PUK2." + "Příchozí identifikace volajícího" + "Odchozí identifikace volajícího" + "Přesměrování hovorů" + "Další hovor na lince" + "Blokování hovorů" + "Změna hesla" + "Změna kódu PIN" + "Ve výchozím nastavení je identifikace volajícího omezena. Příští hovor: Omezeno" + "Ve výchozím nastavení je identifikace volajícího omezena. Příští hovor: Neomezeno" + "Ve výchozím nastavení není identifikace volajícího omezena. Příští hovor: Omezeno" + "Ve výchozím nastavení není identifikace volajícího omezena. Příští hovor: Neomezeno" + "Služba není zřízena." + "Nelze změnit nastavení identifikace volajícího." + "Hlas" + "Data" + "FAX" + "SMS" + "Async" + "Synchronizace" + "Pakety" + "PAD" + "{0}: Nepřesměrováno" + "{0}: {1}" + "{0}: {1} po {2} sek." + "{0}: Nepřesměrováno" + "{0}: Nepřesměrováno" + "OK" + "Webová stránka obsahuje chybu." + "Adresu URL nelze najít." + "Schéma ověření webu není podporováno." + "Ověření nebylo úspěšné." + "Ověření pomocí serveru proxy bylo neúspěšné." + "Připojení k serveru bylo neúspěšné." + "Komunikace se serverem se nezdařila. Opakujte akci později." + "Spojení se serverem vypršelo." + "Stránka obsahuje příliš mnoho přesměrování serveru." + "Protokol není podporován." + "Nelze navázat zabezpečené spojení." + "Stránku nelze otevřít, protože adresa URL je neplatná." + "K souboru nelze získat přístup." + "Požadovaný soubor nebyl nalezen." + "Je zpracováváno příliš mnoho požadavků. Opakujte akci později." + "Synchronizace" + "Synchronizace" + "Příliš mnoho smazaných položek služby %s." + "Paměť telefonu je plná. Smažte některé soubory a uvolněte místo." + "Já" + "Možnosti telefonu" + "Tichý režim" + "Zapnout bezdrátové připojení" + "Vypnout bezdrátové připojení" + "Zámek obrazovky" + "Vypnout" + "Vypínání..." + "Váš telefon bude vypnut." + "Žádné nedávno použité aplikace." + "Možnosti telefonu" + "Zámek obrazovky" + "Vypnout" + "Tichý režim" + "Zvuk je VYPNUTÝ." + "Zvuk je zapnutý" + "Nouzový režim" + "Zpoplatněné služby" + "Umožňuje aplikacím provádět činnosti, které vás mohou stát peníze." + "Vaše zprávy" + "Čtení a zápis zpráv SMS, e-mailů a dalších zpráv." + "Vaše osobní informace" + "Přímý přístup k vašim kontaktům a kalendáři v telefonu." + "Vaše poloha" + "Sleduje vaši fyzickou polohu" + "Síťová komunikace" + "Umožňuje aplikacím získat přístup k různým funkcím sítě." + "Vaše účty Google" + "Přístup k dostupným účtům Google." + "Řízení hardwaru" + "Přímý přístup k hardwaru telefonu." + "Telefonní hovory" + "Sledování, záznam a zpracování telefonních hovorů." + "Systémové nástroje" + "Nízkoúrovňový přístup a kontrola nad systémem." + "Nástroje pro vývojáře" + "Funkce pouze pro vývojáře aplikací" + "zakázání či změny stavového řádku" + "Umožňuje aplikaci zakázat stavový řádek nebo přidat či odebrat systémové ikony." + "rozbalení a sbalení stavového řádku" + "Umožňuje aplikaci rozbalit či sbalit stavový řádek." + "zachycení odchozích hovorů" + "Umožňuje aplikaci zpracovat odchozí hovory a změnit číslo, které má být vytočeno. Škodlivé aplikace mohou sledovat či přesměrovat odchozí hovory nebo jim zabránit." + "příjem zpráv SMS" + "Umožňuje aplikaci přijímat a zpracovávat zprávy SMS. Škodlivé aplikace mohou sledovat vaše zprávy nebo je smazat, aniž by vám byly zobrazeny." + "příjem zpráv MMS" + "Umožňuje aplikaci přijímat a zpracovávat zprávy MMS. Škodlivé aplikace mohou sledovat vaše zprávy nebo je smazat, aniž by vám byly zobrazeny." + "odesílat zprávy SMS" + "Umožňuje aplikaci odesílat zprávy SMS. Škodlivé aplikace mohou bez vašeho potvrzení odesílat zpoplatněné zprávy." + "čtení zpráv SMS a MMS" + "Umožňuje aplikaci číst zprávy SMS uložené ve vašem telefonu nebo na kartě SIM. Škodlivé aplikace mohou načíst vaše soukromé zprávy." + "úprava zpráv SMS a MMS" + "Umožňuje aplikaci zapisovat do zpráv SMS uložených ve vašem telefonu nebo na kartě SIM. Škodlivé aplikace mohou smazat vaše zprávy." + "příjem WAP" + "Umožňuje aplikaci přijímat a zpracovávat zprávy WAP. Škodlivé aplikace mohou sledovat vaše zprávy nebo je smazat, aniž by vám byly zobrazeny." + "načtení spuštěných aplikací" + "Umožňuje aplikaci načíst informace o aktuálně a nedávno spuštěných úlohách. Toto nastavení může škodlivým aplikacím umožnit odhalení soukromých informací o jiných aplikacích." + "změna uspořádání spuštěných aplikací" + "Umožňuje aplikaci přesouvat úlohy do popředí či pozadí. Škodlivé aplikace mohou vynutit své přesunutí do popředí bez vašeho přičinění." + "povolit ladění aplikací" + "Umožňuje aplikaci povolit ladění jiné aplikace. Škodlivé aplikace mohou pomocí tohoto nastavení ukončit jiné aplikace." + "změny vašeho nastavení uživatelského rozhraní" + "Umožňuje aplikaci změnit aktuální konfiguraci, např. národní prostředí či obecnou velikost písma." + "restartování ostatních aplikací" + "Umožňuje aplikaci vynutit restartování jiných aplikací." + "zamezení zastavení aplikace" + "Umožňuje aplikaci spustit jakýkoli proces v popředí tak, že ho nelze ukončit. Běžné aplikace by toto nastavení nikdy neměly používat." + "vynucení zavření aplikace" + "Umožňuje aplikaci vynutit zavření a přesunutí libovolné činnosti v popředí na pozadí. Běžné aplikace by toto nastavení neměly nikdy využívat." + "načtení interního stavu systému" + "Umožňuje aplikaci načíst interní stav systému. Škodlivé aplikace mohou načíst řádu soukromých a zabezpečených informací, které by nikdy neměly potřebovat." + "zveřejnění nízkoúrovňových služeb" + "Umožňuje aplikaci zveřejnit své vlastní nízkoúrovňové systémové služby. Škodlivé aplikace mohou převzít kontrolu nad systémem a získat či poškodit jakákoli data v něm obsažená." + "sledování a řízení spouštění všech aplikací" + "Umožňuje aplikaci sledovat a řídit spouštění činností systémem. Škodlivé aplikace mohou zcela ovládnout systém. Toto oprávnění je zapotřebí pouze pro účely vývoje, nikdy pro běžné použití telefonu." + "odeslání vysílání o odstranění balíčku" + "Umožňuje aplikaci vysílat oznámení o odstranění balíčku aplikace. Škodlivé aplikace mohou pomocí tohoto nastavení ukončit libovolnou další spuštěnou aplikaci." + "odeslání vysílání o přijaté zprávě SMS" + "Umožňuje aplikaci vysílat oznámení o přijetí zprávy SMS. Škodlivé aplikace mohou pomocí tohoto nastavení falšovat příchozí zprávy SMS." + "odeslání vysílání typu WAP-PUSH-received" + "Umožňuje aplikaci vysílat oznámení o přijetí zprávy WAP PUSH. Škodlivé aplikace mohou pomocí tohoto nastavení zfalšovat výpis o doručení zprávy MMS nebo nepozorovaně nahradit obsah jakékoli webové stránky škodlivým obsahem." + "omezení počtu spuštěných procesů" + "Umožňuje aplikaci řídit maximální počet spuštěných procesů. Běžné aplikace toto nastavení nikdy nevyužívají." + "zavření všech aplikací na pozadí" + "Umožňuje aplikaci ovládat, zda jsou činnosti vždy dokončeny po přesunutí do pozadí. Běžné aplikace toto nastavení nikdy nevyužívají." + "automatická instalace aktualizací systému" + "Umožňuje aplikaci přijímat oznámení o čekajících aktualizacích systému a spouštět jejich instalaci. Škodlivé aplikace mohou díky tomuto nastavení poškodit systém pomocí neoprávněných aktualizací nebo celkově narušovat proces aktualizace." + "změna statistických údajů o baterii" + "Umožňuje změnu shromážděných statistických údajů o baterii. Není určeno pro běžné aplikace." + "zobrazení nepovolených oken" + "Umožňuje vytvoření oken, která mají být použita interním systémem uživatelského rozhraní. Běžné aplikace toto nastavení nepoužívají." + "zobrazení upozornění systémové úrovně" + "Umožňuje aplikaci zobrazit okna s výstrahami systému. Škodlivé aplikace mohou převzít kontrolu nad celou obrazovkou telefonu." + "globální změny rychlosti animace" + "Umožňuje aplikaci kdykoli globálně změnit rychlost animace (rychlejší či pomalejší animace)." + "správa tokenů aplikací" + "Umožňuje aplikaci vytvořit a spravovat své vlastní tokeny a obejít jejich obvyklé řazení typu Z. Toto nastavení by nikdy nemělo být potřeba pro běžné aplikace." + "používání kláves a tlačítek" + "Umožňuje aplikaci doručit své vlastní vstupní události (stisknutí tlačítek, apod.) dalším aplikacím. Škodlivé aplikace mohou pomocí tohoto nastavení převzít kontrolu nad telefonem." + "zaznamenání psaného textu a prováděných činností" + "Umožňuje aplikacím sledovat, které klávesy používáte, a to i při práci s jinými aplikacemi (například při zadávání hesla). Běžné aplikace by toto nastavení nikdy neměly vyžadovat." + "vazba k metodě zadávání dat" + "Umožňuje držiteli vázat se na nejvyšší úroveň rozhraní pro zadávání dat. Běžné aplikace by toto nastavení nikdy neměly využívat." + "změna orientace obrazovky" + "Umožňuje aplikaci kdykoli změnit orientaci obrazovky. Běžné aplikace by toto nastavení nikdy neměly využívat." + "odeslání signálů Linux aplikacím" + "Umožňuje aplikaci vyžádat zaslání poskytnutého signálu všem trvalým procesům." + "trvalé spuštění aplikace" + "Umožňuje aplikaci učinit své části trvalými, takže je systém nemůže použít pro jiné aplikace." + "smazání aplikací" + "Umožňuje aplikaci smazat balíčky systému Android. Škodlivé aplikace mohou pomocí tohoto nastavení smazat důležité aplikace." + "smazání dat ostatních aplikací" + "Umožňuje aplikaci smazat data uživatele." + "smazání mezipaměti ostatních aplikací" + "Umožňuje aplikaci smazat soubory v mezipaměti." + "výpočet místa pro ukládání aplikací" + "Umožňuje aplikaci načtení svého kódu, dat a velikostí mezipaměti" + "přímá instalace aplikací" + "Umožňuje aplikaci nainstalovat nové či aktualizované balíčky systému Android. Škodlivé aplikace mohou pomocí tohoto nastavení přidat nové aplikace s libovolnými oprávněními." + "smazání všech dat v mezipaměti aplikace" + "Umožňuje aplikaci uvolnit paměť telefonu smazáním souborů v adresáři mezipaměti aplikace. Přístup je velmi omezený, většinou pouze pro systémové procesy." + "čtení systémových souborů protokolu" + "Umožňuje aplikaci číst různé systémové soubory protokolů. Toto nastavení aplikaci umožní získat obecné informace o činnostech s telefonem, ale neměly by obsahovat žádné osobní či soukromé informace." + "čtení nebo zápis do prostředků funkce diag" + "Umožňuje aplikaci číst libovolné prostředky ve skupině diag, např. soubory ve složce /dev, a zapisovat do nich. Může dojít k ovlivnění stability a bezpečnosti systému. Toto nastavení by měl používat pouze výrobce či operátor pro diagnostiku hardwaru." + "povolení či zakázání komponent aplikací" + "Umožňuje aplikaci změnit, zda je komponenta jiné aplikace povolena nebo ne. Škodlivé aplikace mohou pomocí tohoto nastavení vypnout důležité funkce telefonu. Je třeba postupovat opatrně, protože je možné způsobit nepoužitelnost, nekonzistenci či nestabilitu komponent aplikací." + "nastavení upřednostňovaných aplikací" + "Umožňuje aplikaci změnit vaše upřednostňované aplikace. Toto nastavení může škodlivým aplikacím umožnit nepozorovaně změnit spouštěné aplikace a oklamat vaše existující aplikace tak, aby shromažďovaly vaše soukromá data." + "změny globálních nastavení systému" + "Umožňuje aplikaci upravit data nastavení systému. Škodlivé aplikace mohou poškodit konfiguraci vašeho systému." + "změny zabezpečených nastavení systému" + "Umožňuje aplikaci změnit data zabezpečených nastavení systému. Běžné aplikace toto nastavení nevyužívají." + "změny mapy služeb Google" + "Umožňuje aplikaci změnit mapu služeb Google. Běžné aplikace toto nastavení nevyužívají." + "automatické spuštění při startu" + "Umožňuje aplikaci spuštění ihned po spuštění systému. Toto nastavení může zpomalit spuštění telefonu a umožnit aplikaci celkově zpomalit telefon, protože bude neustále spuštěna." + "odeslání trvalého vysílání" + "Umožňuje aplikaci odeslat trvalá vysílání, která přetrvávají i po skončení vysílání. Škodlivé aplikace mohou telefon zpomalit či způsobit jeho nestabilitu, protože bude používat příliš mnoho paměti." + "čtení dat kontaktů" + "Umožňuje aplikaci načíst všechna data kontaktů (adresy) uložená ve vašem telefonu. Škodlivé aplikace poté mohou dalším lidem odeslat vaše data." + "zápis dat kontaktů" + "Umožňuje aplikaci změnit kontaktní údaje (adresu) uložené v telefonu. Škodlivé aplikace mohou pomocí tohoto nastavení vymazat či pozměnit kontaktní údaje." + "zápis informací o vlastníkovi" + "Umožňuje aplikaci změnit informace o vlastníkovi telefonu uložené v telefonu. Škodlivé aplikace mohou pomocí tohoto nastavení vymazat či pozměnit informace o vlastníkovi." + "čtení informací o vlastníkovi" + "Umožňuje aplikaci číst informace o vlastníkovi telefonu uložená v telefonu. Škodlivé aplikace mohou pomocí tohoto nastavení načíst informace o vlastníkovi." + "čtení dat kalendáře" + "Umožňuje aplikaci načíst všechny události kalendáře uložené ve vašem telefonu. Škodlivé aplikace poté mohou dalším lidem odeslat události z vašeho kalendáře." + "zápis dat kalendáře" + "Umožňuje aplikaci změnit události kalendáře uložené v telefonu. Škodlivé aplikace mohou pomocí tohoto nastavení vymazat či pozměnit vaše data v kalendáři." + "simulace zdrojů polohy pro účely testování" + "Vytváří simulované zdroje polohy pro účely testování. Škodlivé aplikace mohou pomocí tohoto nastavení změnit polohu či stav vrácený zdroji skutečné polohy, jako je např. jednotka GPS či poskytovatelé sítě." + "přístup k dalším příkazům poskytovatele polohy" + "Umožňuje získat přístup k dalším příkazům poskytovatele polohy. Škodlivé aplikace mohou pomocí tohoto nastavení narušit funkci GPS či jiných zdrojů polohy." + "upřesnění polohy (GPS)" + "Umožňuje aplikaci přístup ke zdrojům přesné polohy v telefonu, jako je například systém GPS, je-li k dispozici. Škodlivé aplikace mohou pomocí tohoto nastavení zjistit vaši polohu a mohou zvýšit spotřebu baterie." + "přibližná poloha (pomocí sítě)" + "Umožňuje získat přístup ke zdrojům přibližné polohy, jako je například databáze mobilní sítě, je-li k dispozici, a určit přibližnou pozici telefonu. Škodlivé aplikace takto mohou zjistit, kde se přibližně nacházíte." + "přístup ke službě SurfaceFlinger" + "Umožňuje aplikaci používat nízkoúrovňové funkce SurfaceFlinger." + "čtení vyrovnávací paměti snímků" + "Umožňuje aplikaci načíst obsah vyrovnávací paměti snímků." + "změna vašeho nastavení zvuku" + "Umožňuje aplikaci změnit globální nastavení zvuku, například hlasitost či směrování." + "nahrání zvuku" + "Umožňuje aplikaci získat přístup k nahrávání zvuku." + "pořizování fotografií" + "Umožňuje aplikaci pořizovat fotografie pomocí fotoaparátu. Toto nastavení aplikaci umožní shromažďovat fotografie toho, na co je zrovna fotoaparát namířen." + "trvalé vypnutí telefonu" + "Umožňuje aplikaci trvale vypnout celý telefon. Toto je velmi nebezpečné nastavení." + "vynucení restartování telefonu" + "Umožňuje aplikaci vynutit restartování telefonu." + "připojení a odpojení souborových systémů" + "Umožňuje aplikaci připojit či odpojit souborové systémy ve vyměnitelných úložištích." + "ovládání vibrací" + "Umožňuje aplikaci ovládat vibrace." + "ovládání kontrolky" + "Umožňuje aplikaci ovládat kontrolku." + "testování hardwaru" + "Umožňuje aplikaci ovládat různé periferie pro účely testování hardwaru." + "přímé volání na telefonní čísla" + "Umožňuje aplikaci bez vašeho zásahu volat na telefonní čísla. Škodlivé aplikace mohou na váš telefonní účet připsat neočekávané hovory. Toto nastavení aplikaci neumožňuje volat na tísňové linky." + "přímé volání na libovolná telefonní čísla" + "Umožňuje aplikaci bez vašeho zásahu vytočit jakékoli telefonní číslo, včetně čísel tísňového volání. Škodlivé aplikace mohou provádět zbytečná a nezákonná volání na tísňové linky." + "ovládání oznámení o aktualizaci polohy" + "Umožňuje povolit či zakázat aktualizace polohy prostřednictvím bezdrátového připojení. Aplikace toto nastavení obvykle nepoužívají." + "přístup k vlastnostem Checkin" + "Umožňuje čtení i zápis vlastností nahraných službou Checkin. Běžné aplikace toto nastavení obvykle nevyužívají." + "změny stavu telefonu" + "Umožňuje aplikaci ovládat telefonní funkce zařízení. Aplikace s tímto oprávněním může přepínat sítě nebo zapnout či vypnout bezdrátové připojení telefonu bez vašeho svolení." + "zjistit stav telefonu" + "Umožňuje aplikaci získat přístup k telefonním funkcím zařízení. Aplikace s tímto oprávněním mohou určit telefonní číslo tohoto telefonu, zda zrovna probíhá hovor, spojené telefonní číslo a podobně." + "zabránění přechodu telefonu do režimu spánku" + "Umožňuje aplikaci zabránit přechodu telefonu do režimu spánku." + "zapnutí či vypnutí telefonu" + "Umožňuje aplikaci zapnout či vypnout telefon." + "spuštění v režimu továrního testu" + "Umožňuje aplikaci spuštění v režimu nízkoúrovňového testu výrobce a povolí přístup k hardwaru telefonu. K dispozici pouze, je-li telefon spuštěn v režimu testování výrobce." + "nastavení tapety" + "Umožňuje aplikaci nastavit tapetu systému." + "nastavení nápovědy pro velikost tapety" + "Umožňuje aplikaci nastavit nápovědu pro velikost tapety systému." + "obnovení továrního nastavení systému" + "Umožňuje aplikaci kompletně obnovit systém do továrního nastavení a vymazat všechna data, konfiguraci a nainstalované aplikace." + "nastavení časového pásma" + "Umožňuje aplikaci změnit časové pásmo telefonu." + "odhalení známých účtů" + "Umožňuje aplikaci získat seznam účtů v telefonu." + "zobrazení stavu sítě" + "Umožňuje aplikaci zobrazit stav všech sítí." + "plný přístup k Internetu" + "Umožňuje aplikaci vytvořit síťové sokety." + "zápis nastavení pro název přístupového bodu (APN)" + "Umožňuje aplikaci změnit nastavení APN, jako je například proxy či port APN." + "změna připojení k síti" + "Umožňuje aplikaci změnit stav připojení k síti." + "zobrazení stavu WiFi" + "Umožňuje aplikaci zobrazit informace o stavu připojení WiFi." + "Změnit stav WiFi" + "Umožňuje aplikaci připojit se k přístupovým bodům WiFi či se od nich odpojit a provádět změny nakonfigurovaných sítí WiFi." + "správa rozhraní Bluetooth" + "Umožňuje aplikaci konfigurovat místní telefon s rozhraním Bluetooth a vyhledávat a párovat vzdálená zařízení." + "vytvoření připojení Bluetooth" + "Umožňuje aplikaci zobrazit konfiguraci místního telefonu s rozhraním Bluetooth, vytvářet připojení ke spárovaným zařízením a přijímat tato připojení." + "vypnutí zámku kláves" + "Umožňuje aplikaci vypnout zámek kláves a související zabezpečení heslem. Příkladem oprávněného použití této funkce je vypnutí zámku klávesnice při příchozím hovoru a jeho opětovné zapnutí po skončení hovoru." + "čtení nastavení synchronizace" + "Umožňuje aplikaci načíst nastavení synchronizace, např. zda má být povolena synchronizace kontaktů." + "zápis nastavení synchronizace" + "Umožňuje aplikaci změnit nastavení synchronizace, např. zda má být povolena synchronizace kontaktů." + "čtení statistických údajů o synchronizaci" + "Umožňuje aplikaci číst statistické informace o synchronizaci, např. historii proběhlých synchronizací." + "čtení zdrojů přihlášených k odběru" + "Umožňuje aplikaci získat podrobnosti o aktuálně synchronizovaných zdrojích." + "zápis odebíraných zdrojů" + "Umožňuje aplikaci upravit vaše aktuálně synchronizované zdroje. To může škodlivým aplikacím umožnit změnu vašich synchronizovaných zdrojů." + + "Domů" + "Mobil" + "Práce" + "Pracovní fax" + "Fax domů" + "Pager" + "Ostatní" + "Vlastní" + + + "Domů" + "Práce" + "Ostatní" + "Vlastní" + + + "Domů" + "Práce" + "Ostatní" + "Vlastní" + + + "Domů" + "Práce" + "Ostatní" + "Vlastní" + + + "Práce" + "Ostatní" + "Vlastní" + + + "AIM" + "Windows Live" + "Yahoo!" + "Skype" + "QQ" + "Google Talk" + "ICQ" + "Jabber" + + "Zadejte kód PIN" + "Nesprávný kód PIN" + "Chcete-li telefon odemknout, stiskněte Menu a poté 0." + "Číslo tísňové linky" + "(Není signál)" + "Obrazovka uzamčena." + "Chcete-li odemknout telefon nebo provést tísňové volání, stiskněte Menu." + "Telefon odemknete stisknutím tlačítka Menu." + "Odblokujte pomocí gesta" + "Tísňové volání" + "Správně!" + "Zkuste to prosím znovu" + "Nabíjení (%d%%)" + "Připojte dobíjecí zařízení." + "Není vložena karta SIM." + "V telefonu není žádná karta SIM." + "Prosím vložte kartu SIM." + "Síť je blokována" + "Karta SIM je zablokována pomocí kódu PUK." + "Prosím kontaktujte podporu zákazníků." + "Karta SIM je zablokována." + "Odblokování karty SIM..." + "%dkrát jste použili nesprávné gesto pro odemčení. "\n\n"Opakujte prosím akci za %d s." + "%dkrát jste nesprávně nakreslili své gesto odemknutí. Po dalších neúspěšných pokusech (%d) budete požádání o odemčení telefonu pomocí přihlášení Google."\n\n" Akci prosím opakujte za několik sekund (%d)." + "Sekundy zbývající do dalšího pokusu: %d." + "Zapomněli jste gesto?" + "Gesta: Příliš mnoho pokusů" + "Chcete-li telefon odemknout,"\n"přihlaste se pomocí svého účtu Google" + "Uživatelské jméno (e-mail)" + "Heslo" + "Přihlásit se" + "Neplatné uživatelské jméno nebo heslo." + "h:mm AA" + "%-l:%M%P" + "%-l:%M%p" + + + + + "Vymazat oznámení" + "Žádná oznámení" + "Probíhající" + "Oznámení" + + + "Nabíjení..." + "Prosím připojte dobíjecí zařízení" + "Baterie je vybitá:" + "zbývá méně než %d%%." + "Test továrního nastavení se nezdařil" + "Test FACTORY_TEST lze provést pouze u balíčků nainstalovaných ve složce /system/app." + "Nebyl nalezen žádný balíček umožňující test FACTORY_TEST." + "Restartovat" + "Potvrdit" + "Chcete, aby si prohlížeč zapamatoval toto heslo?" + "Nyní ne" + "Zapamatovat" + "Nikdy" + "Nemáte povolení otevřít tuto stránku." + "Text byl zkopírován do schránky." + "Více" + "Menu+" + "mezerník" + "enter" + "smazat" + "Hledat" + "Dnes" + "Včera" + "Zítra" + "před 1 měsícem" + "Déle než před 1 měsícem" + + "před 1 sekundou" + "před %d sek." + + + "před 1 minutou" + "před %d min." + + + "před 1 hodinou" + "před %d hod." + + + "včera" + "před %d dny" + + + "za 1 sekundu" + "za %d s" + + + "za 1 minutu" + "za %d min." + + + "za 1 hodinu" + "za %d hod." + + + "zítra" + "zbývající počet dní: %d" + + + + + + + + + + + + + + + + + + "%s" + "%s" + "v roce %s" + "den" + "d." + "hodina" + "hod." + "min." + "min." + "s" + "s" + "týden" + "týd." + "rokem" + "lety" + "neděle" + "pondělí" + "úterý" + "středa" + "čtvrtek" + "pátek" + "sobota" + "Každý pracovní den (Po – Pá)" + "Denně" + "Každý týden v %s" + "Měsíčně" + "Ročně" + "Video nelze přehrát" + "Toto video bohužel nelze přehrát." + "OK" + "dop." + "odp." + "%m/%d/%Y" + "%1$s, %2$s, %3$s%4$s, %5$s, %6$s" + "%1$s, %2$s%4$s, %5$s" + "%2$s, %3$s%5$s, %6$s" + "%2$s%5$s" + "%1$s%2$s" + "%1$s, %2$s, %3$s" + "%2$s, %3$s" + "%1$s, %3$s" + + + + + "%1$s, %2$s" + "MMMM dd, yyyy" + "dd. MMMM yyyy" + "dd. MMM yyyy" + "dd. MMM yyyy" + "h:mm a" + "H:mm" + "poledne" + "Poledne" + "půlnoc" + "Půlnoc" + + + + + "%B %-d, %Y" + + + "%H:%M:%S" + "%H:%M:%S %-d. %B %Y" + "%3$s. %2$s%8$s. %7$s" + "%1$s, %3$s. %2$s%6$s, %8$s. %7$s" + "%3$s. %2$s%8$s. %7$s %9$s" + "%1$s, %3$s. %2$s%6$s, %8$s. %7$s %9$s" + "%3$s. %2$s, %5$s%8$s. %7$s, %10$s" + "%1$s, %3$s. %2$s, %5$s%6$s, %8$s. %7$s, %10$s" + "%3$s. %2$s %4$s, %5$s%8$s. %7$s %9$s, %10$s" + "%1$s, %3$s. %2$s %4$s, %5$s%6$s, %8$s. %7$s %9$s, %10$s" + "%3$s. %2$s. – %8$s. %7$s." + "%1$s, %3$s. %2$s%6$s, %8$s. %7$s" + "%3$s. %2$s. %4$s%8$s. %7$s. %9$s" + "%1$s, %3$s. %2$s %4$s%6$s, %8$s. %7$s %9$s" + "%3$s. %2$s., %5$s%8$s. %7$s., %10$s" + "%1$s, %3$s. %2$s, %5$s%6$s, %8$s. %7$s, %10$s" + "%2$s/%3$s/%4$s, %5$s%7$s/%8$s/%9$s, %10$s" + "%1$s, %3$s. %2$s %4$s, %5$s%6$s, %8$s. %7$s %9$s, %10$s" + "%3$s. – %8$s. %2$s" + "%1$s, %3$s. %2$s%6$s, %8$s. %7$s" + "%3$s. – %8$s. %2$s %9$s" + "%1$s, %3$s. %2$s %4$s%6$s, %8$s. %7$s %9$s" + "%3$s. %2$s, %5$s%8$s. %7$s, %10$s" + "%1$s, %3$s. %2$s %5$s%6$s, %8$s. %7$s %10$s" + "%2$s %3$s, %4$s, %5$s%7$s %8$s, %9$s, %10$s" + "%1$s, %3$s. %2$s %4$s, %5$s%6$s, %8$s. %7$s %9$s, %10$s" + "%-d. %b %Y" + + + + + + + "neděle" + "pondělí" + "úterý" + "středa" + "čtvrtek" + "pátek" + "sobota" + "Ne" + "Po" + "Út" + "St" + "Čt" + "Pá" + "So" + "Ne" + "Po" + "Út" + "St" + "Čt" + "Pá" + "So" + "Ne" + "Po" + "Út" + "St" + "Čt" + "Pá" + "So" + "Ne" + "Po" + "Čt" + "St" + "Čt" + "Pá" + "So" + "leden" + "únor" + "březen" + "duben" + "květen" + "červen" + "červenec" + "srpen" + "září" + "říjen" + "listopad" + "prosinec" + "leden" + "únor" + "březen" + "duben" + "květen" + "červen" + "červenec" + "srpen" + "září" + "říjen" + "listopad" + "prosinec" + "1." + "2." + "Po" + "4." + "5." + "6." + "7." + "8." + "9." + "10." + "11." + "12." + "%1$02d:%2$02d" + "%1$d:%2$02d:%3$02d" + "Vybrat vše" + "Označit text" + "Zastavit označování textu" + "Vyjmout" + "Vyjmout vše" + "Kopírovat" + "Kopírovat vše" + "Vložit" + "Kopírovat adresu URL" + "Metoda zadávání dat" + "Úpravy textu" + "Málo paměti" + "V telefonu zbývá málo místa pro ukládání dat." + "OK" + "Zrušit" + "OK" + "Zrušit" + "ZAPNUTO" + "VYPNOUT" + "Dokončit akci pomocí aplikace" + "Použít jako výchozí nastavení pro tuto činnost." + "Vymažte výchozí hodnoty v Nastavení plochy > Aplikace > Správa aplikací." + "Vyberte akci" + "Tuto činnost nemohou provádět žádné aplikace." + "Omlouváme se" + "Aplikace %1$s (proces %2$s) byla neočekávaně ukončena. Zkuste to znovu." + "Proces %1$s byl neočekávaně ukončen. Opakujte prosím akci." + "Omlouváme se" + "Činnost %1$s (v aplikaci %2$s) neodpovídá." + "Činnost %1$s (v procesu %2$s) neodpovídá." + "Aplikace %1$s (v procesu %2$s) neodpovídá." + "Proces %1$s neodpovídá." + "Ukončit aplikaci" + "Počkat" + "Ladit" + "Vyberte činnost s textem" + "Hlasitost vyzvánění" + "Hlasitost médií" + "Přehrávání pomocí rozhraní Bluetooth" + "Hlasitost hovoru" + "Přehrávání pomocí rozhraní Bluetooth" + "Hlasitost upozornění a budíku" + "Hlasitost oznámení" + "Hlasitost" + "Výchozí vyzváněcí tón" + "Výchozí vyzváněcí tón (%1$s)" + "Ticho" + "Vyzváněcí tóny" + "Neznámý vyzváněcí tón" + + "Je k dispozici síť WiFi." + "Jsou k dispozici sítě WiFi." + + + "Je k dispozici veřejná síť WiFi" + "Jsou k dispozici veřejné sítě WiFi" + + "Vkládání znaků" + "Neznámá aplikace" + "Odesílání zpráv SMS" + "Je odesílán velký počet zpráv SMS. Vyberte OK, chcete-li pokračovat, nebo Zrušit, chcete-li odesílání ukončit." + "OK" + "Zrušit" + "Nastavit" + "Výchozí" + "Nejsou vyžadována žádná oprávnění" + "Skrýt" + "Zobrazit vše" + "Načítání..." + "USB připojeno" + "Připojili jste svůj telefon k počítači pomocí USB. Vyberte možnost Připojit, chcete-li zkopírovat soubory mezi vaším počítačem a kartou SD v telefonu." + "Připojit" + "Nepřipojovat" + "Při používání vaší karty SD jako úložiště USB došlo k problému." + "USB připojeno" + "Vyberte, chcete-li kopírovat soubory do nebo z počítače." + "Výběr metody zadávání dat" + "AÁBCČDĎEÉĚFGHCHIÍJKLMNŇOÓPQRŘSŠTŤUÚVWXYÝZŽ" + "0123456789AÁBCČDĎEÉĚFGHCHIÍJKLMNŇOÓPQRŘSŠTŤUÚVWXYÝZŽ" + "kandidáti""u>" + diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 4b0419c7aae9e..0b2c7a7227f73 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -25,8 +25,7 @@ "Der von Ihnen eingegebene PUK ist nicht korrekt." "Die von Ihnen eingegebenen PIN-Nummern stimmen nicht überein." "Geben Sie eine PIN ein, die 4 bis 8 Zahlen enthält." - - + "Ihre SIM-Karte ist mit einem PUK gesperrt. Geben Sie zum Entsperren den PUK-Code ein." "Geben Sie zum Entsperren der SIM-Karte den PUK2 ein." "Anrufer-ID für eingehenden Anruf" "Anrufer-ID für abgehenden Anruf" @@ -151,14 +150,10 @@ "Ermöglicht der Anwendung, den Start von Systemaktivitäten zu überwachen und zu steuern. Schädliche Anwendungen können so das gesamte System beeinträchtigen. Diese Berechtigung wird nur zu Entwicklungszwecken und nie für die normale Telefonnutzung benötigt." "Broadcast ohne Paket senden" "Ermöglicht einer Anwendung, eine Benachrichtigung zur Entfernung eines Anwendungspakets zu senden. Schädliche Anwendungen können so laufende Anwendungen beenden." - - - - - - - - + "per SMS empfangenen Broadcast senden" + "Ermöglicht einer Anwendung, eine Benachrichtigung zu senden, dass eine Kurzmitteilung empfangen wurde. Schädliche Anwendungen könnten diese Option verwenden, um den Eingang von Kurzmitteilungen zu erzwingen." + "von WAP-PUSH empfangenen Broadcast senden" + "Ermöglicht einer Anwendung, eine Benachrichtigung zu senden, dass eine WAP PUSH-Nachricht empfangen wurde. Schädliche Anwendungen könnten diese Option verwenden, um den Erhalt von MMS-Mitteilungen zu erzwingen, oder um unbemerkt den Inhalt einer beliebigen Webseite durch schädliche Inhalte zu ersetzen." "Anzahl der laufenden Prozesse beschränken" "Ermöglicht einer Anwendung, die maximale Anzahl an laufenden Prozessen zu steuern. Wird nicht für normale Anwendungen benötigt." "alle Anwendungen im Hintergrund schließen" @@ -179,6 +174,8 @@ "Ermöglicht einer Anwendung, ihre eigenen Eingabeaktionen (Drücken von Tasten etc.) an andere Anwendungen zu liefern. Schädliche Anwendungen können so die Kontrolle über Ihr Telefon übernehmen." "Tastatureingaben und Aktionen aufzeichnen" "Ermöglicht Anwendungen, die von Ihnen gedrückten Tasten zu überwachen (etwa die Eingabe eines Passworts). Dies gilt auch für die Interaktion mit anderen Anwendungen. Sollte für normale Anwendungen nicht benötigt werden." + "An eine Eingabemethode binden" + "Ermöglicht dem Halter, sich an die Oberfläche einer Eingabemethode auf oberster Ebene zu binden. Sollte nie für normale Anwendungen benötigt werden." "Bildschirmausrichtung ändern" "Ermöglicht der Anwendung, die Bildschirmdrehung jederzeit zu ändern. Sollte nicht für normale Anwendungen benötigt werden." "Linux-Signale an Anwendungen senden" @@ -202,16 +199,13 @@ "Lese-/Schreibberechtigung für zu Diagnosegruppe gehörige Elemente" "Ermöglicht einer Anwendung, alle Elemente in der Diagnosegruppe zu lesen und zu bearbeiten, etwa Dateien in \"/dev\". Dies könnte eine potenzielle Gefährdung für die Stabilität und Sicherheit des Systems darstellen und sollte NUR für Hardware-spezifische Diagnosen des Herstellers oder Netzbetreibers verwendet werden." "Anwendungskomponenten aktivieren oder deaktivieren" - - + "Ermöglicht einer Anwendung, die Komponente einer anderen Anwendung nach Belieben zu aktivieren oder zu deaktivieren. Schädliche Anwendungen können so wichtige Funktionen des Telefons deaktivieren. Bei der Erteilung von Berechtigungen ist daher Vorsicht geboten, da die Anwendungskomponenten unbrauchbar, inkonsistent und unstabil werden können." "Bevorzugte Einstellungen festlegen" "Ermöglicht einer Anwendung, Ihre bevorzugten Einstellungen zu ändern. Schädliche Anwendungen können so laufende Anwendungen ohne Ihr Wissen ändern, damit die vorhandenen Anwendungen private Daten von Ihnen sammeln." "Allgemeine Systemeinstellungen ändern" "Ermöglicht einer Anwendung, die Einstellungsdaten des Systems zu ändern. Schädliche Anwendungen können so die Systemkonfiguration beschädigen." - - - - + "Sicherheitseinstellungen für das System ändern" + "Ermöglicht einer Anwendung, die Daten der Sicherheitseinstellungen des Systems zu ändern. Nicht für normale Anwendungen vorgesehen." "Google Services Map ändern" "Ermöglicht einer Anwendung, Änderungen an der Google Services Map vorzunehmen. Nicht für normale Anwendungen vorgesehen." "Automatisch nach dem Booten starten" @@ -316,11 +310,39 @@ "Ermöglicht einer Anwendung, Details zu den zurzeit synchronisierten Feeds abzurufen." "Abonnierte Feeds schreiben" "Ermöglicht einer Anwendung, Änderungen an den kürzlich synchronisierten Feeds vorzunehmen. Schädliche Anwendungen könnten so Ihre synchronisierten Feeds ändern." - - - - - + + "Privat" + "Mobil" + "Beruflich" + "Beruflich (Fax)" + "Faxnummer (privat)" + "Pager" + "Andere" + "Benutzerdefiniert" + + + "Privat" + "Beruflich" + "Andere" + "Benutzerdefiniert" + + + "Privat" + "Beruflich" + "Andere" + "Benutzerdefiniert" + + + "Privat" + "Beruflich" + "Andere" + "Benutzerdefiniert" + + + "Beruflich" + "Andere" + "Benutzerdefiniert" + "AIM" "Windows Live" @@ -331,22 +353,18 @@ "ICQ" "Jabber" - - + "PIN-Code eingeben" "Falscher PIN-Code!" "Drücken Sie zum Entsperren auf \"Menü\" und dann auf \"0\"." "Notrufnummer" "(kein Dienst)" - - + "Display gesperrt." "Drücken Sie auf die \"Menü\", um das Telefon zu entsperren oder einen Notruf zu tätigen." "Drücken Sie zum Entsperren auf \"Menü\"." - - + "Schema für Entsperrung zeichnen" "Notruf" "Korrekt!" - - + "Tut uns leid. Versuchen Sie es noch einmal." "Wird aufgeladen (%d%%)" "Stecken Sie Ihr Ladegerät ein." "Keine SIM-Karte." @@ -362,17 +380,14 @@ "Versuchen Sie es in %d Sekunden erneut." "Muster vergessen?" "Zu viele Versuche!" - - + "Melden Sie sich zum Entsperren"\n"mit Ihrem Google-Konto an." "Nutzername (E-Mail)" "Passwort" "Anmelden" "Ungültiger Nutzername oder ungültiges Passwort." "h:mm AA" - - - - + "%-l:%M%P" + "%-l:%M%p" @@ -408,8 +423,7 @@ "Gestern" "Morgen" "Vor 1 Monat" - - + "Vor mehr als 1 Monat" "Vor 1 Sekunde" "Vor %d Sekunden" @@ -442,6 +456,22 @@ "morgen" "in %d Tagen" + + + + + + + + + + + + + + + + "am %s" "am %s" "in %s" @@ -484,17 +514,17 @@ "%1$s, %2$s, %3$s" "%2$s, %3$s" "%1$s, %3$s" + + + + "%1$s, %2$s" - - + "dd. MMMM yyyy" "dd. MMMM yyyy" - - + "dd. MMM yyyy" "dd. MMM yyyy" - - - - + "h:mm a" + "H:mm" "Mittag" "Mittag" "Mitternacht" @@ -613,16 +643,16 @@ "%1$02d:%2$02d" "%1$d:%2$02d:%3$02d" "Alles auswählen" + "Text auswählen" + "Textauswahl beenden" "Ausschneiden" "Alles ausschneiden" "Kopieren" "Alles kopieren" "Einfügen" "URL kopieren" - - - - + "Eingabemethode" + "Text bearbeiten" "Geringer Speicher" "Kaum noch freier Telefonspeicher verfügbar." "OK" @@ -649,15 +679,17 @@ "Fehler suchen" "Aktion für Text auswählen" "Klingeltonlautstärke" - "Lautstärke" + "Medienlautstärke" + "Wiedergabe durch Bluetooth" "Lautstärke bei eingehendem Anruf" + "Wiedergabe durch Bluetooth" "Lautstärke für Alarm" + "Benachrichtigungslautstärke" "Lautstärke" "Standard-Klingelton" "Standard-Klingelton (%1$s)" "Lautlos" - - + "Klingeltöne" "Unbekannter Klingelton" "WLAN-Netzwerk verfügbar" @@ -667,8 +699,7 @@ "Verfügbares WLAN-Netzwerk öffnen" "Verfügbare WLAN-Netzwerke öffnen" - - + "Zeichen einfügen" "Unbekannte Anwendung" "Kurznachrichten werden gesendet" "Es werden eine große Anzahl an Kurznachrichten versendet. Wählen Sie \"OK\", um fortzufahren, oder drücken Sie auf \"Abbrechen\", um den Sendevorgang zu beenden." @@ -687,12 +718,8 @@ "Bei der Verwendung Ihrer SD-Karte als USB-Speicher ist ein Problem aufgetreten." "USB-Verbindung" "Wählen Sie die Dateien aus, die von Ihrem oder auf Ihren Computer kopiert werden sollen." - - - - - - - - + "Eingabemethode auswählen" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "Kandidaten""u>" diff --git a/core/res/res/values-es/arrays.xml b/core/res/res/values-es/arrays.xml new file mode 100644 index 0000000000000..f9c904be4c64c --- /dev/null +++ b/core/res/res/values-es/arrays.xml @@ -0,0 +1,4 @@ + + + diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml new file mode 100644 index 0000000000000..6727d5eb8463b --- /dev/null +++ b/core/res/res/values-es/strings.xml @@ -0,0 +1,724 @@ + + + "B" + "KB" + "MB" + "GB" + "TB" + "PB" + "<sin título>" + "…" + "(Sin número de teléfono)" + "Desconocido" + "Buzón de voz" + "MSISDN1" + "Se ha producido un problema de conexión o el código MMI no es válido." + "El servicio se ha habilitado." + "Se ha habilitado el servicio para:" + "El servicio se ha inhabilitado." + "El registro se ha realizado correctamente." + "El elemento se ha borrado correctamente." + "Contraseña incorrecta" + "MMI completo" + "El PIN antiguo que has introducido no es correcto." + "El código PUK que has introducido no es correcto." + "Los códigos PIN introducidos no coinciden." + "Introduce un código PIN con una longitud comprendida entre cuatro y ocho dígitos." + "La tarjeta SIM está bloqueada con el código PUK. Introduce el código PUK para desbloquearla." + "Introduce el código PUK2 para desbloquear la tarjeta SIM." + "ID de emisor de llamada entrante" + "ID de emisor de llamada saliente" + "Desvío de llamada" + "Llamada en espera" + "Bloqueo de llamada" + "Cambio de contraseña" + "Cambio de PIN" + "El ID de emisor presenta el valor predeterminado de restringido. Siguiente llamada: Restringido" + "El ID de emisor presenta el valor predeterminado de restringido. Siguiente llamada: No restringido" + "El ID de emisor presenta el valor predeterminado de no restringido. Siguiente llamada: Restringido" + "El ID de emisor presenta el valor predeterminado de no restringido. Siguiente llamada: No restringido" + "El servicio no se suministra." + "El ID del emisor no se puede modificar." + "Voz" + "Datos" + "FAX" + "SMS" + "Asíncronos" + "Sincronización" + "Paquete" + "PAD" + "{0}: No desviada" + "{0}: {1}" + "{0}: {1} transcurridos {2} segundos" + "{0}: No desviada" + "{0}: No desviada" + "Aceptar" + "La página web contiene un error." + "No se ha podido encontrar la URL." + "No se admite el esquema de autenticación del sitio." + "La autenticación no se ha realizado correctamente." + "La autenticación mediante el servidor proxy no se ha realizado correctamente." + "La conexión al servidor no se ha realizado correctamente." + "El servidor no ha podido establecer la comunicación. Vuelve a intentarlo más tarde." + "Se ha agotado el tiempo de espera de conexión al servidor." + "La página contiene demasiados redireccionamientos de servidor." + "Protocolo no admitido" + "No se ha podido establecer una conexión segura." + "La página no se ha podido abrir porque la URL no es válida." + "No se ha podido acceder al archivo." + "No se ha encontrado el archivo solicitado." + "Se están procesando demasiadas solicitudes. Vuelve a intentarlo más tarde." + "Sincronización" + "Sincronización" + "Demasiadas eliminaciones de %s" + "Se ha agotado el espacio de almacenamiento del teléfono. Elimina algunos archivos para liberar espacio." + "Yo" + "Opciones del teléfono" + "Modo silencio" + "Activar conexión inalámbrica" + "Desactivar función inalámbrica" + "Bloqueo de pantalla" + "Apagar" + "Apagando..." + "El teléfono se apagará." + "No hay aplicaciones recientes" + "Opciones del teléfono" + "Bloqueo de pantalla" + "Apagar" + "Modo silencio" + "El sonido está desactivado." + "El sonido está activado." + "Modo seguro" + "Servicios por los que tienes que pagar" + "Permite que las aplicaciones realicen acciones por las que puede que tengas que pagar." + "Tus mensajes" + "Leer y escribir SMS, mensajes de correo electrónico y otros mensajes" + "Tu información personal" + "Acceso directo al calendario y a los contactos almacenados en el teléfono" + "Tu ubicación" + "Controlar su ubicación física" + "Comunicación de red" + "Permite que las aplicaciones accedan a distintas funciones de red." + "Tus cuentas de Google" + "Acceder a las cuentas de Google disponibles" + "Controles de hardware" + "Acceso directo al hardware del móvil" + "Llamadas de teléfono" + "Controlar, registrar y procesar llamadas telefónicas" + "Herramientas del sistema" + "Acceso de nivel inferior y control del sistema" + "Herramientas de desarrollo" + "Funciones necesarias sólo para desarrolladores de aplicaciones" + "inhabilitar o modificar la barra de estado" + "Permite que las aplicaciones inhabiliten la barra de estado, o añadan y eliminen iconos del sistema." + "expandir/contraer la barra de estado" + "Permite que la aplicación expanda y contraiga la barra de estado." + "interceptar llamadas salientes" + "Permite que la aplicación procese llamadas salientes y cambie el número que se va a marcar. Las aplicaciones malintencionadas pueden controlar, redirigir o impedir las llamadas salientes." + "recibir SMS" + "Permite que la aplicación reciba y procese mensajes SMS. Las aplicaciones malintencionadas pueden controlar los mensajes o eliminarlos sin mostrarlos al usuario." + "recibir MMS" + "Permite que la aplicación reciba y procese mensajes MMS. Las aplicaciones malintencionadas pueden controlar los mensajes o eliminarlos sin mostrarlos al usuario." + "enviar mensajes SMS" + "Permite que la aplicación envíe mensajes SMS. Es posible que tengas que pagar si las aplicaciones malintencionadas envían mensajes sin tu confirmación." + "leer SMS o MMS" + "Permite que la aplicación lea mensajes SMS almacenados en el teléfono o en la tarjeta SIM. Las aplicaciones malintencionadas pueden leer los mensajes confidenciales." + "editar SMS o MMS" + "Permite que la aplicación escriba en mensajes SMS almacenados en el teléfono o en la tarjeta SIM. Las aplicaciones malintencionadas pueden borrar los mensajes." + "recibir WAP" + "Permite que la aplicación reciba y procese mensajes WAP. Las aplicaciones malintencionadas pueden controlar los mensajes o eliminarlos sin mostrarlos al usuario." + "recuperar aplicaciones en ejecución" + "Permite que la aplicación recupere información sobre tareas que se están ejecutando en este momento o que se han ejecutado recientemente. Puede permitir que las aplicaciones malintencionadas vean información privada sobre otras aplicaciones." + "reorganizar aplicaciones en ejecución" + "Permite que una aplicación mueva tareas a segundo plano y a primer plano. Las aplicaciones malintencionadas pueden aparecer en primer plano sin su control." + "habilitar depuración de aplicación" + "Permite que una aplicación active la depuración de otra aplicación. Las aplicaciones malintencionadas pueden utilizar este permiso para desactivar otras aplicaciones." + "cambiar la configuración de la interfaz de usuario" + "Permite que una aplicación cambie la configuración actual como, por ejemplo, la configuración regional o el tamaño de fuente general." + "reiniciar otras aplicaciones" + "Permite que una aplicación reinicie de forma forzosa otras aplicaciones." + "impedir su interrupción" + "Permite que una aplicación ejecute cualquier proceso en segundo plano, de forma que no se pueda interrumpir. No debería ser necesario nunca para las aplicaciones normales." + "forzar el cierre de la aplicación" + "Permite que una aplicación fuerce a cualquier actividad en segundo plano a cerrarse y volver a la pantalla anterior. No debería ser necesario nunca para las aplicaciones normales." + "recuperar estado interno del sistema" + "Permite que la aplicación recupere el estado interno del sistema. Las aplicaciones malintencionadas pueden recuperar una amplia variedad de información protegida y privada que normalmente no deberían necesitar." + "publicar servicios de nivel inferior" + "Permite que la aplicación publique sus propios servicios de sistema de nivel inferior. Las aplicaciones malintencionadas pueden hacerse con el control del sistema, y robar o dañar los datos contenidos en él." + "supervisar y controlar la ejecución de todas las aplicaciones" + "Permite que una aplicación supervise y controle la ejecución de las actividades por parte del sistema. Las aplicaciones malintencionadas pueden vulnerar la seguridad del sistema. Este permiso sólo es necesario para tareas de desarrollo, nunca para el uso habitual del teléfono." + "enviar emisión eliminada de paquete" + "Permite que una aplicación emita una notificación de que se ha eliminado un paquete de aplicación. Las aplicaciones malintencionadas pueden utilizar este permiso para interrumpir la ejecución de cualquier otra aplicación." + "enviar una emisión recibida mediante SMS" + "Permite que una aplicación emita una notificación de que se ha recibido un mensaje SMS. Las aplicaciones malintencionadas pueden utilizar este permiso para falsificar mensajes SMS entrantes." + "enviar emisión recibida mediante mensaje WAP PUSH" + "Permite que una aplicación emita una notificación de que se ha recibido un mensaje WAP PUSH. Las aplicaciones malintencionadas pueden utilizar este permiso para falsificar la recepción de un mensaje MMS o para reemplazar de forma silenciosa el contenido de cualquier página web con variantes malintencionadas." + "limitar el número de procesos en ejecución" + "Permite que una aplicación controle el número máximo de procesos que se ejecutarán. No es necesario nunca para las aplicaciones normales." + "hacer que se cierren todas las aplicaciones en segundo plano" + "Permite que una aplicación controle si las actividades finalizan siempre en cuanto pasan a segundo plano. No es necesario nunca para las aplicaciones normales." + "instalar actualizaciones del sistema de forma automática" + "Permite que una aplicación reciba notificaciones sobre actualizaciones pendientes del sistema e inicie su instalación. Las aplicaciones malintencionadas pueden utilizar este permiso para provocar daños en el sistema con actualizaciones no autorizadas o interferir de forma general en el proceso de actualización." + "modificar estadísticas de la batería" + "Permite la modificación de estadísticas recopiladas sobre la batería. No está destinado al uso por parte de aplicaciones normales." + "mostrar ventanas no autorizadas" + "Permite la creación de ventanas destinadas al uso por parte de la interfaz de usuario interna del sistema. No está destinado al uso por parte de aplicaciones normales." + "mostrar alertas de nivel del sistema" + "Permite que una aplicación muestre ventanas de alerta del sistema. Las aplicaciones malintencionadas pueden controlar toda la pantalla del teléfono." + "modificar velocidad de animación global" + "Permite que una aplicación cambie la velocidad de animación global (animaciones más rápidas o más lentas) en cualquier momento." + "administrar tokens de aplicación" + "Permite que las aplicaciones creen y administren sus propios tokens, ignorando su orden z normal. Nunca debería ser necesario para las aplicaciones normales." + "pulsar teclas y botones de control" + "Permite que la aplicación proporcione sus propios eventos de entrada (pulsación de teclas, etc.) a otras aplicaciones. Las aplicaciones malintencionadas pueden utilizar este permiso para controlar el teléfono." + "registrar lo que se escribe y las acciones que se realizan" + "Permite que las aplicaciones observen las teclas que pulsas incluso cuando interactúas con otra aplicación (como, por ejemplo, al introducir una contraseña). No debería ser necesario nunca para las aplicaciones normales." + "enlazar con un método de introducción de texto" + "Permite enlazar con la interfaz de nivel superior de un método de introducción de texto. No debe ser necesario para las aplicaciones normales." + "cambiar orientación de la pantalla" + "Permite que una aplicación cambie la rotación de la pantalla en cualquier momento. No debería ser necesario nunca para las aplicaciones normales." + "enviar señales Linux a aplicaciones" + "Permite que la aplicación solicite que la señal suministrada se envíe a todos los procesos persistentes." + "hacer que la aplicación se ejecute siempre" + "Permite que una aplicación vuelva persistentes algunas de sus partes, de forma que el sistema no la pueda utilizar para otras aplicaciones." + "eliminar aplicaciones" + "Permite que una aplicación elimine paquetes Android. Las aplicaciones malintencionadas pueden utilizar este permiso para eliminar aplicaciones importantes." + "eliminar los datos de otras aplicaciones" + "Permite que una aplicación borre los datos de usuario." + "eliminar las cachés de otras aplicaciones" + "Permite que una aplicación elimine archivos de caché." + "medir el espacio de almacenamiento de la aplicación" + "Permite que la aplicación recupere su código, sus datos y los tamaños de caché." + "instalar aplicaciones directamente" + "Permite que una aplicación instale paquetes Android nuevos o actualizados. Las aplicaciones malintencionadas pueden utilizar este permiso para añadir aplicaciones nuevas con permisos arbitrariamente potentes." + "eliminar todos los datos de caché de la aplicación" + "Permite que una aplicación libere espacio de almacenamiento en el teléfono mediante la eliminación de archivos en el directorio de caché de la aplicación. El acceso al proceso del sistema suele estar muy restringido." + "leer archivos de registro del sistema" + "Permite que una aplicación lea los distintos archivos de registro del sistema. Con este permiso, la aplicación puede ver información general sobre las acciones que realiza el usuario con el teléfono, pero los registros no deberían contener información personal o privada." + "leer/escribir en los recursos propiedad del grupo de diagnóstico" + "Permite que una aplicación lea y escriba en cualquier recurso propiedad del grupo de diagnóstico como, por ejemplo, archivos in/dev. Este permiso podría afectar a la seguridad y estabilidad del sistema. SÓLO se debe utilizar para diagnósticos específicos de hardware realizados por el fabricante o el operador." + "habilitar o inhabilitar componentes de la aplicación" + "Permite que una aplicación cambie si un componente de otra aplicación está habilitado o inhabilitado. Las aplicaciones malintencionadas pueden utilizar este permiso para inhabilitar funciones importantes del teléfono. El permiso se debe utilizar con precaución, ya que es posible que los componentes se vuelvan inutilizables, inconsistentes o inestables." + "establecer aplicaciones preferidas" + "Permite que una aplicación modifique las aplicaciones preferidas del usuario. De esta forma, las aplicaciones malintencionadas pueden cambiar de forma silenciosa las aplicaciones que se están ejecutando, falsificando las aplicaciones existentes para recopilar datos privados del usuario." + "modificar la configuración global del sistema" + "Permite que una aplicación modifique los datos de configuración del sistema. Las aplicaciones malintencionadas pueden dañar la configuración del sistema." + "modificar la configuración segura del sistema" + "Permite que una aplicación modifique los datos de configuración segura del sistema. No está destinado al uso por parte de aplicaciones normales." + "modificar la asignación de servicios de Google" + "Permite que una aplicación modifique la asignación de servicios de Google. No está destinado al uso por parte de aplicaciones normales." + "ejecutar automáticamente al iniciar" + "Permite que una aplicación se ejecute automáticamente en cuanto se haya terminado de iniciar el sistema. Esto puede provocar que el teléfono tarde más en iniciarse y permite que la aplicación ralentice el funcionamiento global del teléfono al ejecutarse continuamente." + "enviar emisión persistente" + "Permite que una aplicación envíe emisiones persistentes, que permanecen en el teléfono una vez que la emisión finaliza. Las aplicaciones malintencionadas pueden ralentizar el teléfono o volverlo inestable al hacer que emplee demasiada memoria." + "leer los datos de contacto" + "Permite que una aplicación lea todos los datos de contacto (direcciones) almacenados en el teléfono. Las aplicaciones malintencionadas pueden utilizar este permiso para enviar tus datos a otras personas." + "escribir datos de contacto" + "Permite que una aplicación modifique los datos de contacto (direcciones) almacenados en el teléfono. Las aplicaciones malintencionadas pueden utilizar este permiso para borrar o modificar tus datos de contacto." + "escribir datos de propietario" + "Permite que una aplicación modifique los datos del propietario del teléfono almacenados en el teléfono. Las aplicaciones malintencionadas pueden utilizar este permiso para borrar o modificar los datos del propietario." + "leer datos del propietario" + "Permite que una aplicación lea los datos del propietario del teléfono almacenados en el teléfono. Las aplicaciones malintencionadas pueden utilizar este permiso para leer los datos del propietario del teléfono." + "leer datos de calendario" + "Permite que una aplicación lea todos los eventos de calendario almacenados en el teléfono. Las aplicaciones malintencionadas pueden utilizar este permiso para enviar tus eventos de calendario a otras personas." + "escribir datos de calendario" + "Permite que una aplicación modifique los eventos de calendario almacenados en el teléfono. Las aplicaciones malintencionadas pueden utilizar este permiso para borrar o modificar tus datos de calendario." + "simular fuentes de ubicación para prueba" + "Crear fuentes de origen simuladas para realizar pruebas. Las aplicaciones malintencionadas pueden utilizar este permiso para sobrescribir la ubicación o el estado devueltos por orígenes de ubicación reales, tales como los proveedores de red o GPS." + "acceder a comandos de proveedor de ubicación adicional" + "Acceder a comandos de proveedor de ubicación adicional. Las aplicaciones malintencionadas podrían utilizar este permiso para interferir en el funcionamiento del sistema GPS o de otras fuentes de ubicación." + "precisar la ubicación (GPS)" + "Permite precisar las fuentes de ubicación como, por ejemplo, el sistema de posicionamiento global, en el teléfono, en los casos en que estén disponibles. Las aplicaciones malintencionadas pueden utilizar este permiso para determinar dónde se encuentra en usuario y pueden consumir batería adicional." + "ubicación común (basada en red)" + "Acceder a fuentes de ubicación comunes como, por ejemplo, la base de datos de red de un teléfono móvil, para determinar una ubicación telefónica aproximada, en los casos en que esté disponible. Las aplicaciones malintencionadas pueden utilizar este permiso para determinar dónde te encuentras aproximadamente." + "acceder a SurfaceFlinger" + "Permite que la aplicación utilice funciones de SurfaceFlinger de nivel inferior." + "leer memoria de almacenamiento intermedio" + "Permite que la aplicación que se va a utilizar lea el contenido de la memoria de almacenamiento intermedio." + "cambiar la configuración de audio" + "Permite que la aplicación modifique la configuración de audio global como, por ejemplo, el volumen y la salida." + "grabar sonido" + "Permite que la aplicación acceda a la ruta de grabación de audio." + "realizar fotografías" + "Permite que la aplicación realice fotografías con la cámara. De esta forma, la aplicación puede recopilar en cualquier momento las imágenes que ve la cámara." + "inhabilitar el teléfono de forma permanente" + "Permite que la aplicación inhabilite todas las funciones del teléfono de forma permanente. Este permiso es muy peligroso." + "forzar reinicio del teléfono" + "Permite que la aplicación fuerce al teléfono a reiniciarse." + "montar y desmontar sistemas de archivos" + "Permite que las aplicaciones monten y desmonten sistemas de archivos para un almacenamiento extraíble." + "controlar vibración" + "Permite que la aplicación controle la función de vibración." + "controlar linterna" + "Permite que la aplicación controle la función de linterna." + "probar hardware" + "Permite que la aplicación controle distintos periféricos con fines de prueba del hardware." + "llamar directamente a números de teléfono" + "Permite que la aplicación llame a números de teléfono sin la intervención del usuario. Las aplicaciones malintencionadas pueden originar llamadas inesperadas en la factura telefónica. Ten en cuenta que con este permiso la aplicación no puede realizar llamadas a números de emergencia." + "llamar directamente a cualquier número de teléfono" + "Permite que la aplicación llame a cualquier número de teléfono, incluidos los números de emergencia, sin que el usuario intervenga. Las aplicaciones malintencionadas pueden realizar llamadas innecesarias e ilícitas a los servicios de emergencias." + "controlar las notificaciones de actualización de la ubicación" + "Permite habilitar/inhabilitar las notificaciones de actualización de la ubicación de la radio. No está destinado al uso por parte de aplicaciones normales." + "acceder a propiedades de registro" + "Permite el acceso de lectura/escritura a las propiedades cargadas por el servicio de registro. No está destinado al uso por parte de aplicaciones normales." + "modificar estado del teléfono" + "Permite que la aplicación controle las funciones de teléfono del dispositivo. Una aplicación con este permiso puede cambiar redes, activar y desactivar la radio, etc., sin necesidad de notificar al usuario." + "leer el estado del teléfono" + "Permite que la aplicación acceda a las funciones de teléfono del dispositivo. Una aplicación con este permiso puede determinar el número de teléfono de este teléfono, si una llamada está activa, el número al que está vinculado esa llamada, etc." + "impedir que el teléfono entre en modo de suspensión" + "Permite que una aplicación impida que el teléfono entre en modo de suspensión." + "encender o apagar el teléfono" + "Permite que la aplicación active o desactive el teléfono." + "ejecutar en modo de prueba de fábrica" + "Ejecutar como prueba de fabricante de nivel inferior, permitiendo un acceso íntegro al hardware del teléfono. Sólo está disponible cuando un teléfono se está ejecutando en modo de prueba." + "establecer fondo de pantalla" + "Permite que la aplicación establezca el fondo de pantalla del sistema." + "establecer el tamaño del fondo de pantalla" + "Permite que la aplicación establezca el tamaño del fondo de pantalla del sistema." + "restablecer el sistema a los valores predeterminados de fábrica" + "Permite que una aplicación restablezca por completo el sistema a su configuración de fábrica, borrando todos los datos, la configuración y las aplicaciones instaladas." + "establecer zona horaria" + "Permite que una aplicación cambie la zona horaria del teléfono." + "ver cuentas reconocidas" + "Permite que una aplicación obtenga una lista de cuentas reconocidas por el teléfono." + "ver estado de la red" + "Permite que una aplicación vea el estado de todas las redes." + "acceso íntegro a Internet" + "Permite que una aplicación cree sockets de red." + "escribir la configuración de nombre de punto de acceso" + "Permite que una aplicación modifique los valores de configuración de un APN como, por ejemplo, el proxy y el puerto de cualquier APN." + "cambiar la conectividad de red" + "Permite que una aplicación cambie la conectividad de red de estado." + "ver estado de la conectividad Wi-Fi" + "Permite que una aplicación vea la información sobre el estado de la conectividad Wi-Fi." + "cambiar estado de Wi-Fi" + "Permite que una aplicación se conecte a puntos de acceso Wi-Fi y se desconecte de ellos, y realice modificaciones en las redes Wi-Fi configuradas." + "administración de Bluetooth" + "Permite que una aplicación configure el teléfono Bluetooth local, y vea dispositivos remotos y sincronice el teléfono con ellos." + "crear conexiones de Bluetooth" + "Permite que una aplicación vea la configuración del teléfono Bluetooth local, y cree y acepte conexiones con los dispositivos sincronizados." + "inhabilitar bloqueo del teclado" + "Permite que una aplicación inhabilite el bloqueo del teclado y cualquier protección con contraseña asociada. Un ejemplo legítimo de este permiso es la inhabilitación por parte del teléfono del bloqueo del teclado cuando recibe una llamada telefónica entrante y su posterior habilitación cuando finaliza la llamada." + "leer la configuración de sincronización" + "Permite que una aplicación lea la configuración de sincronización como, por ejemplo, si la sincronización está habilitada para el menú \"Contactos\"." + "escribir configuración de sincronización" + "Permite que una aplicación modifique la configuración de sincronización como, por ejemplo, si la sincronización está habilitada para el menú \"Contactos\"." + "leer estadísticas de sincronización" + "Permite que una aplicación lea las estadísticas de sincronización como, por ejemplo, el historial de sincronizaciones que se han realizado." + "leer feeds a los que está suscrito el usuario" + "Permite que una aplicación obtenga detalles sobre los feeds sincronizados en este momento." + "escribir feeds a los que está suscrito el usuario" + "Permite que una aplicación modifique los feeds sincronizados actualmente. Este permiso podría provocar que una aplicación malintencionada cambie los feeds sincronizados." + + "Casa" + "Móvil" + "Trabajo" + "Fax del trabajo" + "Fax de casa" + "Buscapersonas" + "Otro" + "Personalizar" + + + "Casa" + "Trabajo" + "Otra" + "Personalizar" + + + "Casa" + "Trabajo" + "Otra" + "Personalizar" + + + "Casa" + "Trabajo" + "Otro" + "Personalizar" + + + "Trabajo" + "Otra" + "Personalizar" + + + "AIM" + "Windows Live" + "Yahoo!" + "Skype" + "QQ" + "Google Talk" + "ICQ" + "Jabber" + + "Introduce el código PIN" + "El código PIN es incorrecto." + "Para desbloquear el teléfono, pulsa \"Menú\" y, a continuación, pulsa 0." + "Número de emergencia" + "(Sin servicio)" + "Pantalla bloqueada." + "Pulsa \"Menú\" para desbloquear el teléfono o realizar una llamada de emergencia." + "Pulsa \"Menú\" para desbloquear el teléfono." + "Crear patrón para desbloquear" + "Llamada de emergencia" + "Correcto" + "Inténtalo de nuevo" + "Cargando (%d%%)..." + "Conecta el cargador" + "No hay ninguna tarjeta SIM." + "No se ha insertado ninguna tarjeta SIM en el teléfono." + "Inserta una tarjeta SIM." + "Bloqueada para la red" + "La tarjeta SIM está bloqueada con el código PUK." + "Ponte en contacto con el servicio de atención al cliente." + "La tarjeta SIM está bloqueada." + "Desbloqueando tarjeta SIM..." + "Has realizado %d intentos fallidos de creación de un patrón de desbloqueo. "\n\n"Inténtalo de nuevo dentro de %d segundos." + "Has realizado %d intentos fallidos de creación del patrón de desbloqueo. Si realizas %d intentos fallidos más, se te pedirá que desbloquees el teléfono con tus credenciales de acceso de Google."\n\n" Espera %d segundos e inténtalo de nuevo." + "Espera %d segundos y vuelve a intentarlo." + "¿Has olvidado el patrón?" + "Se han realizado demasiados intentos incorrectos de creación del patrón." + "Para desbloquear el teléfono,"\n"accede a tu cuenta de Google" + "Nombre de usuario (correo electrónico)" + "Contraseña" + "Acceder" + "Nombre de usuario o contraseña no válido" + "h:mm AA" + "%-l:%M%P" + "%-l:%M%p" + + + + + "Cerrar notificaciones" + "Ninguna notificación" + "Entrante" + "Notificaciones" + + + "Cargando..." + "Conecta el cargador" + "Se está agotando la batería:" + "menos de %d%% disponible." + "Fallo en la prueba de fábrica" + "La acción FACTORY_TEST sólo es compatible con los paquetes instalados en /system/app." + "No se ha encontrado ningún paquete que proporcione la acción FACTORY_TEST." + "Reiniciar" + "Confirmar" + "¿Deseas que el navegador recuerde esta contraseña?" + "Ahora no" + "Recordar" + "Nunca" + "No dispones de permiso para abrir esta página." + "Texto copiado al portapapeles." + "Más" + "\"Menú\"+" + "espacio" + "intro" + "suprimir" + "Buscar" + "Hoy" + "Ayer" + "Mañana" + "Hace un mes" + "Hace más de un mes" + + "Hace 1 segundo" + "Hace %d segundos" + + + "Hace 1 minuto" + "Hace %d minutos" + + + "Hace 1 hora" + "Hace %d horas" + + + "ayer" + "Hace %d días" + + + "dentro de 1 segundo" + "dentro de %d segundos" + + + "dentro de 1 minuto" + "dentro de %d minutos" + + + "dentro de 1 hora" + "dentro de %d horas" + + + "mañana" + "dentro de %d días" + + + + + + + + + + + + + + + + + + "el %s" + "a las %s" + "en %s" + "día" + "días" + "hora" + "horas" + "min" + "minutos" + "segundos" + "segundos" + "semana" + "semanas" + "año" + "años" + "Domingo" + "Lunes" + "Martes" + "Miércoles" + "Jueves" + "Viernes" + "Sábado" + "Todos los días laborables (Lun-Vie)" + "Diariamente" + "Semanalmente, el %s" + "Mensualmente" + "Anualmente" + "No se puede reproducir el vídeo." + "Este vídeo no se puede reproducir." + "Aceptar" + "a.m." + "p.m." + "%m/%d/%Y" + "%1$s, %2$s, %3$s%4$s, %5$s, %6$s" + "%1$s, %2$s%4$s, %5$s" + "%2$s, %3$s%5$s, %6$s" + "%2$s%5$s" + "%1$s%2$s" + "%1$s, %2$s, %3$s" + "%2$s, %3$s" + "%1$s, %3$s" + + + + + "%1$s, %2$s" + "dd de MMMM de yyyy" + "MMMM de dd de yyyy" + "dd de MMM de yyyy" + "dd MMM, yyyy" + "h:mm a" + "H:mm" + "mediodía" + "Mediodía" + "medianoche" + "Medianoche" + + + + + "%B %-d, %Y" + + + "%H:%M:%S" + "%H:%M:%S %B %-d, %Y" + "%2$s %3$s%7$s %8$s" + "%1$s, %2$s %3$s%6$s, %7$s %8$s" + "%2$s %3$s%7$s %8$s, %9$s" + "%1$s, %2$s %3$s%6$s, %7$s %8$s, %9$s" + "%3$s de %2$s de %5$s%8$s de %7$s de %10$s" + "%1$s, %2$s %3$s, %5$s%6$s, %7$s %8$s, %10$s" + "%3$s de %2$s de %4$s, %5$s%8$s de %7$s de %9$s, %10$s" + "%1$s, %2$s %3$s, %4$s, %5$s%6$s, %7$s %8$s, %9$s, %10$s" + "%2$s/%3$s%7$s/%8$s" + "%1$s, %2$s/%3$s%6$s, %7$s/%8$s" + "%2$s/%3$s/%4$s%7$s/%8$s/%9$s" + "%1$s, %3$s/%2$s/%4$s%6$s, %8$s/%7$s/%9$s" + "%2$s/%3$s, %5$s%7$s/%8$s, %10$s" + "%1$s, %2$s/%3$s, %5$s%6$s, %7$s/%8$s, %10$s" + "%2$s/%3$s/%4$s, %5$s%7$s/%8$s/%9$s, %10$s" + "%1$s, %2$s/%3$s/%4$s, %5$s%6$s, %7$s/%8$s/%9$s, %10$s" + "%2$s %3$s%8$s" + "%1$s, %2$s %3$s%6$s, %7$s %8$s" + "%2$s %3$s%8$s, %9$s" + "%1$s, %3$s de %2$s de %4$s%6$s, %8$s de %7$s de %9$s" + "%2$s %3$s, %5$s%7$s %8$s, %10$s" + "%1$s, %2$s %3$s, %5$s%6$s, %7$s %8$s, %10$s" + "%2$s %3$s, %4$s, %5$s%7$s %8$s, %9$s, %10$s" + "%1$s, %2$s %3$s, %4$s, %5$s%6$s, %7$s %8$s, %9$s, %10$s" + "%-d de %b de %Y" + + + + + + + "Domingo" + "Lunes" + "Martes" + "Miércoles" + "Jueves" + "Viernes" + "Sábado" + "Dom" + "Lun" + "Mar" + "Mié" + "Jue" + "Vie" + "Sáb" + "Do" + "Lu" + "Ma" + "Mi" + "Ju" + "Vi" + "Sá" + "Do" + "L" + "Ma" + "Mi" + "Ju" + "V" + "S" + "D" + "Mz" + "M" + "Mi" + "M" + "V" + "D" + "Enero" + "Febrero" + "Marzo" + "Abril" + "Mayo" + "Junio" + "Julio" + "Agosto" + "Septiembre" + "Octubre" + "Noviembre" + "Diciembre" + "Ene" + "Feb" + "Mar" + "Abr" + "May" + "Jun" + "Jul" + "Ago" + "Sep" + "Oct" + "Nov" + "Dic" + "E" + "V" + "Mz" + "A" + "My" + "J" + "E" + "Ag" + "S" + "O" + "N" + "D" + "%1$02d:%2$02d" + "%1$d:%2$02d:%3$02d" + "Seleccionar todo" + "Seleccionar texto" + "Detener selección de texto" + "Cortar" + "Cortar todo" + "Copiar" + "Copiar todo" + "Pegar" + "Copiar URL" + "Método de introducción de texto" + "Editar texto" + "Poco espacio" + "Se está agotando el espacio de almacenamiento del teléfono." + "Aceptar" + "Cancelar" + "Aceptar" + "Cancelar" + "Activado" + "Desconectado" + "Completar acción utilizando" + "Utilizar de forma predeterminada para esta acción" + "Borrar valores predeterminados en \"Página principal > menú de configuración > Aplicaciones > Administrar aplicaciones\"." + "Seleccionar una acción" + "Ninguna aplicación puede realizar esta acción." + "Lo sentimos." + "La aplicación %1$s (proceso %2$s) se ha interrumpido inesperadamente. Inténtalo de nuevo." + "El proceso %1$s se ha interrumpido inesperadamente. Inténtalo de nuevo." + "Lo sentimos." + "La actividad %1$s (%2$s en aplicación) no está respondiendo." + "La actividad %1$s (%2$s en curso) no está respondiendo." + "La aplicación %1$s (%2$s en curso) no está respondiendo." + "El proceso %1$s no está respondiendo." + "Forzar cierre" + "Esperar" + "Depurar" + "Seleccionar una acción para el texto" + "Volumen del timbre" + "Volumen multimedia" + "Reproduciendo a través de Bluetooth" + "Volumen de la llamada" + "Reproduciendo a través de Bluetooth" + "Volumen de alarma" + "Volumen de notificaciones" + "Volumen" + "Tono predeterminado" + "Tono predeterminado (%1$s)" + "Silencio" + "Tonos" + "Tono desconocido" + + "Red Wi-Fi disponible" + "Redes Wi-Fi disponibles" + + + "Red Wi-Fi abierta disponible" + "Redes Wi-Fi abiertas disponibles" + + "Insertar carácter" + "Aplicación desconocida" + "Enviando mensajes SMS..." + "Se ha enviado un número elevado de mensajes SMS. Selecciona \"Aceptar\" para continuar o \"Cancelar\" para interrumpir el envío." + "Aceptar" + "Cancelar" + "Establecer" + "Predeterminado" + "No es necesario ningún permiso" + "Ocultar" + "Mostrar todos" + "Cargando..." + "Conectado por USB" + "Has conectado el teléfono al equipo mediante USB. Selecciona \"Montar\" si deseas copiar archivos entre el equipo y la tarjeta SD del teléfono." + "Montar" + "No montar" + "Se ha producido un problema al intentar utilizar la tarjeta SD para el almacenamiento USB." + "Conectado por USB" + "Seleccionar para copiar archivos al/desde el equipo" + "Seleccionar método de introducción de texto" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "candidatos""u>" + diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 4f217619aabc6..600bc2c85d4c6 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -15,7 +15,7 @@ "MSISDN1" "Problème de connexion ou code MMI non valide." "Le service a été activé." - "Ce service a été activé pour :" + "Ce service a été activé pour :" "Ce service a été désactivé." "Enregistrement réussi." "Effacement réussi." @@ -25,55 +25,54 @@ "Le code PUK saisi est incorrect." "Les codes PIN saisis ne correspondent pas." "Saisissez un code PIN comptant 4 à 8 chiffres." - - + "Votre carte SIM est verrouillée par code PUK. Saisissez le code PUK pour la déverrouiller." "Saisissez le code PUK2 pour débloquer la carte SIM." - "Identifiant des appels entrants" - "Identifiant des appels sortants" + "Identifiant d\'appelant entrant" + "Identifiant d\'appelant sortant" "Transfert d\'appel" "Appel en attente" "Interdiction d\'appel" "Modification du mot de passe" "Modification du code PIN" - "Par défaut, les identifiants d\'appel sont restreints. Appel suivant : restreint" - "Par défaut, les identifiants d\'appel sont restreints. Appel suivant : non restreint" - "Par défaut, les identifiants d\'appel ne sont pas restreints. Appel suivant : restreint" - "Par défaut, les identifiants d\'appel ne sont pas restreints. Appel suivant : non restreint" + "Par défaut, les identifiants d\'appelant sont restreints. Appel suivant : restreint" + "Par défaut, les identifiants d\'appelant sont restreints. Appel suivant : non restreint" + "Par défaut, les identifiants d\'appelant ne sont pas restreints. Appel suivant : restreint" + "Par défaut, les identifiants d\'appelant ne sont pas restreints. Appel suivant : non restreint" "Ce service n\'est pas pris en charge." - "Le paramètre Identifiant d\'appel ne peut pas être modifié." + "Le paramètre Identifiant d\'appelant ne peut pas être modifié." "Voix" "Données" "Télécopie" "SMS" "Asynchronisées" - "Synchronisées" + "Synchroniser" "Paquet" "PAD" - "{0} : non transféré" - "{0}: {1}" - "{0} : {1} au bout de {2} secondes" - "{0} : non transféré" - "{0} : non transféré" + "{0} : non transféré" + "{0} : {1}" + "{0} : {1} au bout de {2} secondes" + "{0} : non transféré" + "{0} : non transféré" "OK" - "La page Internet contient une erreur." - "L\'URL n\'a pas pu être trouvée." - "Le processus d\'authentification du site n\'est pas pris en charge." + "La page Web contient une erreur." + "URL introuvable." + "Le modèle d\'authentification du site n\'est pas pris en charge." "Échec de l\'authentification." "Échec de l\'authentification par un serveur proxy." "Échec de la connexion au serveur." - "Échec de la communication avec le serveur. Merci de réessayer ultérieurement." + "Échec de la communication avec le serveur. Veuillez réessayer ultérieurement." "Délai de connexion au serveur dépassé." "Cette page contient trop de redirections de serveurs." "Ce protocole n\'est pas pris en charge." "Aucune connexion sécurisée n\'a pu être établie." - "Cette page n\'a pas pu être ouverte car l\'URL n\'est pas valide." + "Impossible d\'ouvrir cette page. L\'URL n\'est pas correcte." "Impossible d\'accéder au fichier." - "Le fichier demandé n\'a pas été trouvé." - "Trop de requêtes sont en cours de traitement. Merci de réessayer ultérieurement." - "Synchronisation" + "Le fichier demandé est introuvable." + "Trop de requêtes sont en cours de traitement. Veuillez réessayer ultérieurement." + "Synchroniser" "Synchroniser" - "Trop de contenus effacés (%s)." - "La mémoire du téléphone est pleine ! Effacez des fichiers pour libérer de l\'espace." + "Trop de contenus supprimés (%s)." + "La mémoire du téléphone est pleine ! Supprimez des fichiers pour libérer de l\'espace." "Moi" "Options du téléphone" "Mode silencieux" @@ -81,9 +80,9 @@ "Désactiver le mode sans fil" "Verrouillage de l\'écran" "Éteindre" - "Le téléphone s\'éteint..." - "Votre téléphone s\'éteindra." - "Aucune application récente." + "Arrêt en cours..." + "Votre téléphone va s\'éteindra." + "Aucune application récente" "Options du téléphone" "Verrouillage de l\'écran" "Éteindre" @@ -92,235 +91,258 @@ "Le son est activé." "Mode sécurisé" "Services payants" - "Permettre aux applications d\'effectuer des opérations payantes." + "Permet aux applications d\'effectuer des opérations payantes." "Vos messages" - "Lire et rédiger des SMS, e-mails et autres messages." + "Permet de lire et rédiger vos SMS, e-mails et autres messages." "Vos informations personnelles" "Accédez directement aux contacts et au calendrier enregistrés sur votre téléphone." "Votre position géographique" "Suivre votre position géographique" "Communications réseau" - "Permettre à des applications d\'accéder à différentes fonctionnalités réseau." + "Permet à des applications d\'accéder à différentes fonctionnalités du réseau." "Vos comptes Google" "Accédez aux comptes Google disponibles." "Contrôles du matériel" - "Accéder directement au matériel de l\'appareil." + "Permet d\'accéder directement au matériel de l\'appareil." "Appels" "Suivre, enregistrer et traiter les appels téléphoniques" "Outils système" - "Accès de faible niveau et contrôle du système." + "Accès et contrôle de faible niveau du système." "Outils de développement" "Ces fonctionnalités sont réservées aux développeurs d\'applications." - "désactiver ou modifier la barre d\'état" - "Permettre à une application de désactiver la barre d\'état ou d\'ajouter/supprimer des icônes du système." - "agrandir/réduire la barre d\'état" - "Permettre à l\'application de réduire ou d\'agrandir la barre d\'état." - "intercepter les appels sortants" - "Permettre à l\'application de traiter des appels en cours et de modifier le numéro à composer. Des applications malveillantes peuvent suivre, rediriger ou empêcher des appels sortants." - "recevoir SMS" - "Permettre à une application de recevoir et traiter des messages SMS. Des applications malveillantes peuvent suivre vos messages ou les effacer sans que vous en ayez pris connaissance." + "Désactiver ou modifier la barre d\'état" + "Permet à une application de désactiver la barre d\'état ou d\'ajouter/supprimer des icônes système." + "Agrandir/réduire la barre d\'état" + "Permet à l\'application de réduire ou d\'agrandir la barre d\'état." + "Intercepter les appels sortants" + "Permet à l\'application de traiter des appels en cours et de modifier le numéro à composer. Des applications malveillantes peuvent suivre, rediriger ou empêcher des appels sortants." + "Recevoir SMS" + "Permet à une application de recevoir et traiter des messages SMS. Des applications malveillantes peuvent surveiller vos messages ou les effacer sans que vous en ayez pris connaissance." "recevoir des MMS" - "Permettre à une application de recevoir et traiter des messages MMS. Des applications malveillantes peuvent utiliser cette fonctionnalité pour suivre vos messages ou les effacer sans que vous en ayez pris connaissance." - "envoyer des messages SMS" - "Permettre aux applications d\'envoyer des messages SMS. Des applications malveillantes peuvent entraîner des frais en envoyant des messages sans vous demander confirmation." - "lire les SMS ou MMS" - "Permettre à l\'application de lire les messages SMS enregistrés dans la mémoire de votre téléphone ou sur votre carte SD. Des applications malveillantes peuvent lire vos messages confidentiels." - "modifier un SMS ou un MMS" - "Permettre à une application de manipuler des messages SMS enregistrés sur votre téléphone ou sur votre carte SIM. Des applications malveillantes peuvent ainsi supprimer vos messages." - "recevoir WAP" - "Permettre à l\'application de recevoir et de traiter des messages WAP. Des applications malveillantes peuvent ainsi suivre vos messages ou les effacer sans que vous en ayez pris connaissance." - "récupérer les applications en cours d\'exécution" - "Permettre à l\'application de récupérer des informations sur des tâches en cours d\'exécution ou récemment utilisées. Des applications malveillantes peuvent ainsi obtenir des informations d\'ordre privé concernant d\'autres applications." - "trier les applications en cours d\'exécution" - "Permettre à une application de placer des tâches au premier plan ou en arrière-plan. Des applications malveillantes peuvent se placer inopinément au premier plan sans votre autorisation." - "activer le débogage de l\'application" - "Permettre à une application d\'activer le mode de débogage d\'une autre application. Des applications malveillantes peuvent utiliser cette fonctionnalité pour interrompre d\'autres applications de façon inopinée." - "modifier les paramètres de l\'IU" - "Permettre à une application de modifier la configuration actuelle (par ex. : la taille de la police générale ou des paramètres locaux)." - "relancer d\'autres applications" - "Permettre à une application de forcer le lancement d\'autres applications." - "empêcher l\'interruption" - "Permettre à une application de placer tout processus au premier plan afin qu\'il ne puisse pas être interrompu. Les applications normales ne devraient jamais nécessiter cette fonctionnalité." - "obliger l\'application à se fermer" - "Permettre à une application de forcer une autre application au premier plan à se fermer et à passer en arrière-plan. Les applications normales ne devraient jamais avoir recours à cette fonctionnalité." - "récupérer l\'état interne du système" - "Permettre à l\'application de récupérer l\'état interne du système. Des applications malveillantes peuvent obtenir de nombreuses informations personnelles et sécurisées auxquelles elles ne devraient pas avoir accès." - "éditer des services à faible niveau" - "Permettre à l\'application d\'éditer ses propres services de système de faible niveau. Des applications malveillantes peuvent prendre le contrôle du système et voler ou corrompre les données qu\'il contient." - "suivre et contrôler tout lancement d\'application" - "Permettre à une application de suivre et de contrôler la façon dont le système lance des activités. Des applications malveillantes peuvent entièrement déstabiliser le système. Cette autorisation est uniquement nécessaire au développement et non pour l\'utilisation normale du téléphone." - "envoyer une diffusion de paquet supprimé" - "Permettre à une application de diffuser une notification lorsqu\'un paquet d\'application a été supprimé. Des applications malveillantes peuvent utiliser cette fonctionnalité pour interrompre d\'autres applications en cours d\'exécution." - "envoyer une diffusion de SMS reçu" - "Permettre à une application de diffuser une notification lors de la réception d\'un message SMS. Des applications malveillantes peuvent utiliser cette fonctionnalité pour falsifier des messages SMS entrants." - "envoyer une diffusion de réception de WAP PUSH" - "Permettre à une application d\'envoyer une notification lorsqu\'un message WAP PUSH a été reçu. Des applications malveillantes peuvent utiliser cette fonctionnalité pour créer de faux accusés de réception de MMS ou remplacer le contenu de toute page Internet par des données malveillantes." - "limiter le nombre de processus en cours d\'exécution" - "Permettre à une application de contrôler le nombre de processus maximal exécutés en même temps. Les applications normales n\'ont jamais recours à cette fonctionnalité." - "fermer toutes les applications en tâche de fond" - "Permettre à une application de vérifier si des activités sont systématiquement interrompues lorsqu\'elles sont placées en tâche de fond. Cette fonctionnalité n\'est jamais utilisée par les applications normales." - "installer automatiquement les mises à jour système" - "Permettre à une application de recevoir des notifications concernant des mises à jour système imminentes et de lancer leur installation. Des applications malveillantes peuvent utiliser cette fonctionnalité pour corrompre le système avec des mises à jour non autorisées ou plus généralement, pour interférer avec le processus de mise à jour." - "modifier les statistiques de la batterie" - "Autoriser la modification des statistiques de la batterie. Cette fonctionnalité ne concerne pas les applications normales." - "afficher les fenêtres non autorisées" - "Permettre de créer des fenêtres conçues pour l\'interface utilisateur du système interne. Les applications normales n\'utilisent pas cette fonctionnalité." - "afficher les alertes au niveau du système" - "Permettre à une application d\'afficher des fenêtres d\'alerte système. Des applications malveillantes peuvent masquer la totalité de l\'écran du téléphone." - "modifier la vitesse générale des animations" - "Permettre à une application de modifier à tout moment la vitesse globale des animations (pour les rendre plus lentes ou plus rapides)." - "gérer les repères des applications" - "Permettre à des applications de créer et gérer leurs propres repères en contournant leur axe de profondeur normal. Les applications normales ne devraient jamais avoir recours à cette fonctionnalité." - "appuyer sur des touches ou contrôler des commandes" - "Permettre à une application de fournir ces propres commandes (touches enfoncées, etc.) à d\'autres applications. Des applications malveillantes peuvent utiliser cette fonctionnalité pour prendre le contrôle de votre téléphone." - "enregistrer le texte saisi et les actions effectuées" - "Permettre à des applications d\'identifier les touches sur lesquelles vous appuyez même lorsque vous utilisez une autre application (lors de la saisie d\'un mot de passe, par exemple). Les applications normales ne devraient jamais avoir recours à cette fonctionnalité." - - - - - "modifier l\'orientation de l\'écran" - "Permettre à une application de modifier la rotation de l\'écran à tout moment. Les applications normales ne devraient jamais avoir recours à cette fonctionnalité." - "envoyer des signaux Linux aux applications" - "Permettre à une application de demander que le signal fourni soit envoyé à tous les processus persistants." - "exécuter l\'application en continu" - "Permettre à une application de perdurer en partie afin que le système ne puisse pas l\'utiliser pour d\'autres applications." - "effacer des applications" - "Permettre à une application d\'effacer des paquets de données Android. Des applications malveillantes peuvent utiliser cette fonctionnalité pour effacer des applications importantes." - "effacer les données d\'autres applications" - "Permettre à une application d\'effacer les données de l\'utilisateur." - "effacer le cache d\'autres applications" - "Permettre à une application d\'effacer des fichiers du cache." - "évaluer l\'espace de stockage de l\'application" - "Permettre à une application de récupérer la taille de son code, de ses données et de son cache." - "installer directement les applications" - "Permettre à une application d\'installer des nouveaux paquets de données ou des mises à jour Android. Des applications malveillantes peuvent utiliser cette fonctionnalité pour ajouter de nouvelles applications disposant d\'autorisations anormalement élevées." - "effacer les données du cache de toutes les applications" - "Permettre à une application de libérer de l\'espace dans la mémoire du téléphone en supprimant des fichiers du cache des applications. Cet accès, en général très limité, est réservé aux processus système." - "lire les fichiers journaux du système" - "Permettre à une application de lire les différents fichiers journaux du système afin d\'obtenir des informations générales sur la façon dont vous utilisez votre téléphone, mais sans récupérer des informations d\'ordre personnel ou privé." - "lire/écrire dans les ressources appartenant au diag" - "Permettre à une application de lire et écrire toute ressource appartenant au groupe diag (par exemple, les fichiers in/dev). Ceci peut affecter la stabilité et la sécurité du système. Cette fonctionnalité est UNIQUEMENT réservée aux diagnostics matériels effectués par le fabricant ou l\'opérateur." - "activer ou désactiver des éléments de l\'application" - - - "définir les applications préférées" - "Permettre à une application de modifier vos applications préférées. Des applications malveillantes peuvent utiliser cette fonctionnalité pour modifier discrètement les applications en cours d\'exécution, en imitant vos applications existantes afin de récupérer des données personnelles vous concernant." - "modifier les paramètres système généraux" - "Permettre à une application de modifier les données des paramètres du système. Des applications malveillantes peuvent utiliser cette fonctionnalité pour corrompre la configuration de votre système." - - - - - "modifier la carte des services Google" - "Permettre à une application de modifier la carte des services Google. Cette fonctionnalité n\'est pas conçue pour les applications normales." - "lancer automatiquement au démarrage" - "Permettre à une application de se lancer dès la fin du démarrage du système. Ceci peut rallonger le temps nécessaire au téléphone pour démarrer. L\'application étant alors constamment en cours d\'exécution, le fonctionnement général du téléphone peut s\'en trouver ralenti." - "envoyer une diffusion persistante" - "Permettre à une application d\'envoyer des diffusions \"persistantes\", qui perdurent après la fin de la diffusion. Des applications malveillantes peuvent ainsi ralentir le téléphone ou le rendre instable en l\'obligeant à utiliser trop de mémoire." - "lire les données des contacts" - "Permettre à une application de lire toutes les données des contacts (adresses) enregistrées sur votre téléphone. Des applications malveillantes peuvent utiliser cette fonctionnalité pour envoyer vos données à d\'autres personnes." - "écrire les données du contact" - "Permettre à une application de modifier toutes les données de contacts (adresses) enregistrées sur le téléphone. Des applications malveillantes peuvent utiliser cette fonctionnalité pour effacer ou modifier vos données." - "écrire les données du propriétaire" - "Permettre à une application de modifier les données du propriétaire du téléphone enregistrées sur votre appareil. Des applications malveillantes peuvent utiliser cette fonctionnalité pour effacer ou modifier ces données." - "lire des données du propriétaire" - "Permettre à une application de lire les données du propriétaire du téléphone enregistrées sur votre appareil. Des applications malveillantes peuvent utiliser cette fonctionnalité pour lire ces données." - "lire les données du calendrier" - "Permettre à une application de lire tous les événements du calendrier enregistré sur le téléphone. Des applications malveillantes peuvent utiliser cette fonctionnalité pour envoyer les événements de votre calendrier à d\'autres personnes." - "écrire les données du calendrier" - "Permettre à une application de modifier les événements du calendrier enregistré sur votre téléphone. Des applications malveillantes peuvent utiliser cette fonctionnalité pour effacer ou modifier les données de votre calendrier." - "créer de fausses sources géographiques à des fins de test" - "Créer des fausses sources de position géographique à des fins de test. Des applications malveillantes peuvent utiliser cette fonctionnalité pour contourner la position géographique et/ou l\'état fournis par des sources réelles comme le GPS ou les fournisseurs d\'accès." - "accéder à des commandes de fournisseur de position géographique supplémentaires" - "Accéder à des commandes de fournisseur de position géographique supplémentaires. Des applications malveillantes peuvent utiliser cette fonctionnalité pour interférer avec l\'utilisation du GPS ou d\'autres sources de positionnement géographique." - "position géographique précise (GPS)" - "Accéder à des sources de positionnement géographique précises comme le Global Positioning System (GPS) sur le téléphone, lorsque ces services sont disponibles. Des applications malveillantes peuvent utiliser cette fonctionnalité pour déterminer l\'endroit où vous vous trouvez et puiser davantage dans les réserves de la batterie." - "position géographique approximative (selon le réseau)" + "Permet à une application de recevoir et traiter des messages MMS. Des applications malveillantes peuvent utiliser cette fonctionnalité pour surveiller vos messages ou les effacer sans que vous en ayez pris connaissance." + "Envoyer des messages SMS" + "Permet aux applications d\'envoyer des messages SMS. Des applications malveillantes peuvent entraîner des frais en envoyant des messages sans vous en demander la confirmation." + "Lire les SMS ou MMS" + "Permet à l\'application de lire les messages SMS enregistrés dans la mémoire de votre téléphone ou sur votre carte SD. Des applications malveillantes peuvent lire vos messages confidentiels." + "Modifier un SMS ou un MMS" + "Permet à une application d\'éditer des messages SMS enregistrés sur votre téléphone ou sur votre carte SIM. Des applications malveillantes peuvent ainsi supprimer vos messages." + "Recevoir WAP" + "Permet à l\'application de recevoir et de traiter des messages WAP. Des applications malveillantes peuvent ainsi surveiller vos messages ou les effacer sans que vous en ayez pris connaissance." + "Récupérer les applications en cours d\'exécution" + "Permet à l\'application de récupérer des informations sur des tâches en cours d\'exécution ou récemment utilisées. Des applications malveillantes peuvent ainsi obtenir des informations d\'ordre privé concernant d\'autres applications." + "Réorganiser les applications en cours d\'exécution" + "Permet à une application de placer des tâches au premier plan ou en arrière-plan. Des applications malveillantes peuvent se placer inopinément au premier plan sans votre autorisation." + "Activer le débogage de l\'application" + "Permet à une application d\'activer le mode de débogage d\'une autre application. Des applications malveillantes peuvent utiliser cette fonctionnalité pour interrompre d\'autres applications de façon inopinée." + "Modifier les paramètres de l\'IU" + "Permet à une application de modifier la configuration actuelle (par ex. : la taille de la police générale ou des paramètres régionaux)." + "Relancer d\'autres applications" + "Permet à une application de forcer le lancement d\'autres applications." + "Empêcher l\'interruption" + "Permet à une application d\'exécuter tout processus au premier plan afin qu\'il ne puisse pas être interrompu. Les applications normales ne devraient jamais nécessiter cette fonctionnalité." + "Obliger l\'application à se fermer" + "Permet à une application de forcer une autre application exécutée au premier plan à se fermer et à passer en arrière-plan. Les applications normales ne devraient jamais avoir recours à cette fonctionnalité." + "Récupérer l\'état interne du système" + "Permet à l\'application de récupérer l\'état interne du système. Des applications malveillantes peuvent obtenir de nombreuses informations personnelles et sécurisées auxquelles elles ne devraient pas avoir accès." + "Éditer des services à faible niveau" + "Permet à l\'application de publier ses propres services de système de niveau inférieur. Des applications malveillantes peuvent prendre le contrôle du système et voler ou corrompre les données qu\'il contient." + "Surveiller et contrôler tout lancement d\'application" + "Permet à une application de suivre et de contrôler la façon dont le système lance des activités. Des applications malveillantes peuvent entièrement déstabiliser le système. Cette autorisation est uniquement nécessaire au développement et non pour l\'utilisation normale du téléphone." + "Envoyer une diffusion sans paquet" + "Permet à une application de diffuser une notification lorsqu\'un paquet d\'application a été supprimé. Des applications malveillantes peuvent utiliser cette fonctionnalité pour interrompre d\'autres applications en cours d\'exécution." + "Envoyer une diffusion reçue par SMS" + "Permet à une application de diffuser une notification lors de la réception d\'un message SMS. Des applications malveillantes peuvent utiliser cette fonctionnalité pour falsifier des messages SMS entrants." + "Envoyer une diffusion de réception de WAP PUSH" + "Permet à une application d\'envoyer une notification lors de la réception d\'un message WAP PUSH. Des applications malveillantes peuvent utiliser cette fonctionnalité pour créer de faux accusés de réception de MMS ou remplacer le contenu de toute page Internet par des données malveillantes." + "Limiter le nombre de processus en cours d\'exécution" + "Permet à une application de contrôler le nombre de processus maximal exécutés en même temps. Les applications normales n\'ont jamais recours à cette fonctionnalité." + "Fermer toutes les applications en tâche de fond" + "Permet à une application de vérifier si des activités sont systématiquement interrompues lorsqu\'elles sont placées en tâche de fond. Cette fonctionnalité n\'est jamais utilisée par les applications normales." + "Installer automatiquement les mises à jour du système" + "Permet à une application de recevoir des notifications concernant des mises à jour système en cours et de lancer leur installation. Des applications malveillantes peuvent utiliser cette fonctionnalité pour corrompre le système avec des mises à jour non autorisées ou plus généralement, pour interférer avec le processus de mise à jour." + "Modifier les statistiques de la batterie" + "Autoriser la modification des statistiques de la batterie. Les applications normales n\'utilisent pas cette fonctionnalité." + "Afficher les fenêtres non autorisées" + "Permet de créer des fenêtres conçues pour l\'interface utilisateur du système interne. Les applications normales n\'utilisent pas cette fonctionnalité." + "Afficher les alertes au niveau du système" + "Permet à une application d\'afficher des fenêtres d\'alerte système. Des applications malveillantes peuvent masquer la totalité de l\'écran du téléphone." + "Modifier la vitesse générale des animations" + "Permet à une application de modifier à tout moment la vitesse globale des animations (pour les rendre plus lentes ou plus rapides)." + "Gérer les repères des applications" + "Permet à des applications de créer et gérer leurs propres jetons en ignorant leur ordre de plan normal. Les applications normales ne devraient jamais avoir recours à cette fonctionnalité." + "Appuyer sur des touches ou contrôler des commandes" + "Permet à une application de fournir ses propres commandes (touches enfoncées, etc.) à d\'autres applications. Des applications malveillantes peuvent utiliser cette fonctionnalité pour prendre le contrôle de votre téléphone." + "Enregistrer le texte saisi et les actions effectuées" + "Permet à des applications d\'identifier les touches sur lesquelles vous appuyez même lorsque vous utilisez une autre application (lors de la saisie d\'un mot de passe, par exemple). Les applications normales ne devraient jamais avoir recours à cette fonctionnalité." + "connecter à un mode de saisie" + "Permet au support de se connecter à l\'interface de plus haut niveau d\'un mode de saisie. Les applications normales ne devraient jamais avoir recours à cette fonctionnalité." + "Changer l\'orientation de l\'écran" + "Permet à une application de modifier la rotation de l\'écran à tout moment. Les applications normales ne devraient jamais avoir recours à cette fonctionnalité." + "Envoyer des signaux Linux aux applications" + "Permet à une application de demander que le signal fourni soit envoyé à tous les processus persistants." + "Exécuter l\'application en continu" + "Permet à une application de perdurer en partie afin que le système ne puisse pas l\'utiliser pour d\'autres applications." + "Supprimer des applications" + "Permet à une application de supprimer des paquets de données Android. Des applications malveillantes peuvent utiliser cette fonctionnalité pour supprimer des applications importantes." + "Supprimer les données d\'autres applications" + "Permet à une application d\'effacer les données de l\'utilisateur." + "Supprimer le cache d\'autres applications" + "Permet à une application de supprimer des fichiers du cache." + "Évaluer l\'espace de stockage de l\'application" + "Permet à une application de récupérer la taille de son code, de ses données et de son cache." + "Installer directement les applications" + "Permet à une application d\'installer des nouveaux paquets de données ou des mises à jour Android. Des applications malveillantes peuvent utiliser cette fonctionnalité pour ajouter de nouvelles applications disposant d\'autorisations anormalement élevées." + "Effacer les données du cache de toutes les applications" + "Permet à une application de libérer de l\'espace dans la mémoire du téléphone en supprimant des fichiers du répertoire du cache des applications. Cet accès est en général limité aux processus système." + "Lire les fichiers journaux du système" + "Permet à une application de lire les différents fichiers journaux du système afin d\'obtenir des informations générales sur la façon dont vous utilisez votre téléphone, sans pour autant récupérer des informations d\'ordre personnel ou privé." + "Lire/écrire dans les ressources appartenant aux diagnostics" + "Permet à une application de lire et d\'éditer toute ressource appartenant au groupe de diagnostics (par exemple, les fichiers in/dev). Ceci peut affecter la stabilité et la sécurité du système. Cette fonctionnalité est UNIQUEMENT réservée aux diagnostics matériels effectués par le fabricant ou l\'opérateur." + "Activer ou désactiver des éléments de l\'application" + "Permet à une application de modifier l\'état d\'activation/désactivation d\'un élément d\'une autre application. Des applications malveillantes peuvent utiliser cette fonctionnalité pour désactiver des options importantes du téléphone. Soyez prudent en utilisant cette autorisation, car il est possible que certains éléments deviennent instables, incohérents ou inutilisables." + "Définir les applications préférées" + "Permet à une application de modifier vos applications préférées. Des applications malveillantes peuvent utiliser cette fonctionnalité pour modifier discrètement les applications en cours d\'exécution, en imitant vos applications existantes afin de récupérer des données personnelles vous concernant." + "Modifier les paramètres généraux du système" + "Permet à une application de modifier les données des paramètres du système. Des applications malveillantes peuvent utiliser cette fonctionnalité pour corrompre la configuration de votre système." + "Modifier les paramètres de sécurité du système" + "Permet à une application de modifier les données des paramètres de sécurité du système. Les applications normales n\'utilisent pas cette fonctionnalité." + "Modifier la carte des services Google" + "Permet à une application de modifier la carte des services Google. Les applications normales n\'utilisent pas cette fonctionnalité." + "Lancer automatiquement au démarrage" + "Permet à une application de se lancer dès la fin du démarrage du système. Ceci peut rallonger le temps de démarrage requis par le téléphone. L\'application étant alors constamment en cours d\'exécution, le fonctionnement général du téléphone risque d\'être ralenti." + "Envoyer une diffusion persistante" + "Permet à une application d\'envoyer des diffusions \"persistantes\", qui perdurent après la fin de la diffusion. Des applications malveillantes peuvent ainsi ralentir le téléphone ou le rendre instable en l\'obligeant à utiliser trop de mémoire." + "Lire les données des contacts" + "Permet à une application de lire toutes les données des contacts (adresses) enregistrées sur votre téléphone. Des applications malveillantes peuvent utiliser cette fonctionnalité pour envoyer vos données à d\'autres personnes." + "Éditer les données d\'un contact" + "Permet à une application de modifier toutes les données de contact (adresses) enregistrées sur le téléphone. Des applications malveillantes peuvent utiliser cette fonctionnalité pour effacer ou modifier vos données de contact." + "Éditer les données du propriétaire" + "Permet à une application de modifier les données du propriétaire du téléphone enregistrées sur votre appareil. Des applications malveillantes peuvent utiliser cette fonctionnalité pour effacer ou modifier ces données." + "Lire des données du propriétaire" + "Permet à une application de lire les données du propriétaire du téléphone enregistrées sur votre appareil. Des applications malveillantes peuvent utiliser cette fonctionnalité pour lire ces données." + "Lire les données du calendrier" + "Permet à une application de lire tous les événements du calendrier enregistrés sur votre téléphone. Des applications malveillantes peuvent utiliser cette fonctionnalité pour envoyer les événements de votre calendrier à d\'autres personnes." + "Écrire les données du calendrier" + "Permet à une application de modifier les événements du calendrier enregistrés sur votre téléphone. Des applications malveillantes peuvent utiliser cette fonctionnalité pour effacer ou modifier les données de votre calendrier." + "Créer des sources géographiques fictives à des fins de test" + "Permet de créer des sources de position géographique fictives à des fins de test. Des applications malveillantes peuvent utiliser cette fonctionnalité pour remplacer la position géographique et/ou l\'état fournis par des sources réelles comme le GPS ou les fournisseurs d\'accès." + "Accéder à des commandes de fournisseur de position géographique supplémentaires" + "Permet d\'accéder à des commandes de fournisseur de position géographique supplémentaires. Des applications malveillantes peuvent utiliser cette fonctionnalité pour interférer avec l\'utilisation du GPS ou d\'autres sources de positionnement géographique." + "Position géographique précise (GPS)" + "Permet d\'accéder à des sources de positionnement géographique précises comme le Global Positioning System (GPS) sur le téléphone, lorsque ces services sont disponibles. Des applications malveillantes peuvent utiliser cette fonctionnalité pour déterminer l\'endroit où vous vous trouvez et augmenter la consommation de la batterie de votre téléphone." + "Position géographique approximative (selon le réseau)" "Accéder à des sources de positionnement géographique approximatif (par ex. des bases de données de réseaux mobiles) pour déterminer la position géographique du téléphone, lorsque cette option est disponible. Des applications malveillantes peuvent utiliser cette fonctionnalité pour déterminer approximativement l\'endroit où vous vous trouvez." - "accéder à SurfaceFlinger" - "Permettre à certaines applications d\'utiliser les fonctionnalités SurfaceFlinger de faible niveau." - "lire le tampon graphique" - "Permettre aux applications de lire/utiliser le contenu du tampon graphique." - "modifier les paramètres audio" - "Permettre à l\'application de modifier les paramètres audio généraux (par ex. : le volume et le transfert)." - "enregistrer un fichier audio" - "Permettre à l\'application d\'accéder au chemin d\'enregistrement audio." - "prendre des photos" - "Permettre à l\'application de prendre des clichés avec l\'appareil photo. Cette fonctionnalité permet à l\'application de récupérer à tout moment les images perçues par l\'appareil." - "désactiver le téléphone de façon permanente" - "Permettre à l\'application de désactiver définitivement le téléphone. Cette fonctionnalité est très dangereuse." - "forcer le redémarrage du téléphone" - "Permettre à l\'application d\'obliger le téléphone à redémarrer." - "monter et démonter des systèmes de fichiers" - "Permettre à l\'application de monter et démonter des systèmes de fichiers pour des périphériques de stockage amovibles." - "contrôler le mode vibration" - "Permettre à l\'application de contrôler le mode vibration." - "contrôler la lampe de poche" - "Permettre à l\'application de contrôler la lampe de poche." - "tester le matériel" - "Permettre à l\'application de contrôler différents périphériques à des fins de test matériel." - "appeler directement des numéros de téléphone" - "Permettre à l\'application d\'appeler des numéros de téléphone sans votre intervention. Des applications malveillantes peuvent ainsi ajouter des appels non désirés à votre facture téléphonique. Sachez que cette fonctionnalité ne permet pas à l\'application d\'appeler des numéros d\'urgence." - "appeler directement tout numéro de téléphone" - "Permettre à une application d\'appeler tout numéro de téléphone (y compris les numéros d\'urgence) sans votre intervention. Des applications malveillantes peuvent passer des appels non nécessaires ou illégitimes à des services d\'urgence." - "contrôler les notifications de mise à jour de position géographique" - "Autoriser l\'activation/la désactivation des notifications de mises à jour de la position géographique provenant de la radio. Cette fonctionnalité n\'est pas conçue pour les applications normales." - "accéder aux propriétés d\'enregistrement" - "Donner un accès en lecture/écriture à des propriétés chargées par le service d\'inscription. Les applications normales ne devraient jamais avoir recours à cette fonctionnalité." - "modifier l\'état du téléphone" - "Permettre à une application de contrôler les fonctionnalités téléphoniques de l\'appareil. Une application bénéficiant de cette autorisation peut changer de réseau, éteindre et allumer la radio du téléphone, etc. sans vous en notifier." - "lire l\'état du téléphone" - "Permettre à l\'application d\'accéder aux fonctionnalités d\'appel du téléphone. L\'application peut alors déterminer le numéro de l\'appareil, savoir si un appel est en cours, identifier le numéro appelé, etc." - "empêcher le téléphone de passer en mode veille" - "Permettre à une application d\'empêcher votre téléphone de passer en mode veille." - "éteindre ou allumer le téléphone" - "Permettre à l\'application d\'éteindre et d\'allumer le téléphone." - "exécuter en mode Test d\'usine" - "Exécuter en tant que test fabricant de faible niveau et autoriser l\'accès au matériel du téléphone. Cette fonctionnalité est uniquement disponible lorsque le téléphone est en mode de test fabricant." - "configurer le fond d\'écran" - "Permettre à une application de configurer le fond d\'écran du système." - "configurer les conseils de taille du fond d\'écran." - "Permettre à une application de configurer les conseils de taille du fond d\'écran du système." - "réinitialiser le système à ses valeurs d\'usine" - "Permettre à une application de réinitialiser entièrement le système afin qu\'il récupère ses valeurs d\'usine, et d\'effacer toutes les données, configurations et applications installées." - "configurer le fuseau horaire" - "Permettre à l\'application de modifier le fuseau horaire du téléphone." - "identifier des comptes connus" - "Permettre à une application d\'obtenir la liste des comptes connus du téléphone." - "afficher l\'état du réseau" - "Permettre à une application d\'afficher l\'état de tous les réseaux." - "accès Internet complet" - "Permettre à une application de créer des connecteurs réseau." - "écrire les paramètres de Nom des points d\'accès" - "Permettre à une application de modifier les paramètres Nom des points d\'accès, comme le proxy ou le port de tout point d\'accès." - "modifier la connectivité du réseau" - "Permettre à une application de modifier la connectivité du réseau." - "afficher l\'état du Wi-Fi" - "Permettre à une application d\'afficher des informations concernant l\'état du Wi-Fi." - "modifier l\'état du Wi-Fi" - "Permettre à une application de se connecter à des points d\'accès Wi-Fi, de s\'en déconnecter et de modifier des réseaux Wi-Fi configurés." - "administration Bluetooth" - "Permettre à une application de configurer le téléphone Bluetooth local, d\'identifier des périphériques distants et de les associer au téléphone." - "créer des connexions Bluetooth" - "Permettre à une application d\'obtenir la configuration du téléphone Bluetooth local et de créer et accepter des connexions à des appareils associés." - "désactiver le verrouillage des touches" - "Permettre à une application de désactiver le age des touches et toute sécurité par mot de passe. Un exemple légitime : votre téléphone désactive le clavier lorsque vous recevez un appel, puis le réactive lorsque vous raccrochez." - "lire les paramètres de synchronisation" - "Permettre à une application de lire les paramètres de synchronisation (par ex. : savoir si la synchronisation est activée pour les Contacts)." - "écrire les paramètres de synchronisation" - "Permettre à une application de modifier les paramètres de synchronisation (par ex. si la synchronisation est activée pour les contacts)." - "lire les statistiques de synchronisation" - "Permettre à une application de lire les statistiques de synchronisation (par ex. l\'historique des synchronisations effectuées)." - "lire les feeds auxquels vous êtes abonné" - "Permettre à une application d\'obtenir des informations sur les feeds synchronisés récemment." - "écrire les feeds auxquels vous êtes abonné" - "Permettre à une application de modifier vos feeds synchronisés actuels. Grâce à cette fonctionnalité, des applications malveillantes peuvent modifier vos feeds synchronisés." - - - - - + "Accéder à SurfaceFlinger" + "Permet à certaines applications d\'utiliser les fonctionnalités SurfaceFlinger de bas niveau." + "Lire la mémoire tampon graphique" + "Permet aux applications de lire/utiliser le contenu de la mémoire tampon graphique." + "Modifier vos paramètres audio" + "Permet à l\'application de modifier les paramètres audio généraux (p. ex. le volume et le routage)." + "Enregistrer un fichier audio" + "Permet à l\'application d\'accéder au chemin de l\'enregistrement audio." + "Prendre des photos" + "Permet à l\'application de prendre des clichés avec l\'appareil photo. Cette fonctionnalité permet à l\'application de récupérer à tout moment les images perçues par l\'appareil." + "Désactiver définitivement le téléphone" + "Permet à l\'application de désactiver définitivement le téléphone. Cette fonctionnalité est très dangereuse." + "Forcer le redémarrage du téléphone" + "Permet à l\'application de forcer le redémarrage du téléphone." + "Monter et démonter des systèmes de fichiers" + "Permet à l\'application de monter et démonter des systèmes de fichiers pour des périphériques de stockage amovibles." + "Contrôler le vibreur" + "Permet à l\'application de contrôler le vibreur." + "Contrôler la lampe de poche" + "Permet à l\'application de contrôler la lampe de poche." + "Tester le matériel" + "Permet à l\'application de contrôler différents périphériques à des fins de test matériel." + "Appeler directement des numéros de téléphone" + "Permet à l\'application d\'appeler des numéros de téléphone sans votre intervention. Des applications malveillantes peuvent ainsi passer appels non désirés , qui s\'ajoutent à votre facture téléphonique. Sachez que cette fonctionnalité ne permet pas à l\'application d\'appeler des numéros d\'urgence." + "Appeler directement tout numéro de téléphone" + "Permet à une application d\'appeler tout numéro de téléphone (y compris les numéros d\'urgence) sans votre intervention. Des applications malveillantes peuvent passer des appels non nécessaires ou illégitimes à des services d\'urgence." + "Contrôler les notifications de mise à jour de position géographique" + "Permet l\'activation/la désactivation des notifications de mises à jour de la position géographique provenant de la radio. Les applications normales n\'utilisent pas cette fonctionnalité." + "Accéder aux propriétés d\'enregistrement" + "Permet un accès en lecture/écriture à des propriétés envoyées par le service d\'inscription. Les applications normales n\'utilisent pas cette fonctionnalité." + "Modifier l\'état du téléphone" + "Permet à une application de contrôler les fonctionnalités téléphoniques de l\'appareil. Une application bénéficiant de cette autorisation peut changer de réseau, éteindre et allumer la radio du téléphone, etc., sans vous en notifier." + "Lire l\'état du téléphone" + "Permet à l\'application d\'accéder aux fonctionnalités d\'appel du téléphone. L\'application peut alors déterminer le numéro de téléphone de l\'appareil, savoir si un appel est en cours, identifier le numéro appelé, etc." + "Empêcher le téléphone de passer en mode veille" + "Permet à une application d\'empêcher votre téléphone de passer en mode veille." + "Éteindre ou allumer le téléphone" + "Permet à l\'application d\'éteindre et d\'allumer le téléphone." + "Exécuter en mode Test d\'usine" + "Permet d\'exécuter en tant que test fabricant de faible niveau en autorisant l\'accès au matériel du téléphone. Cette fonctionnalité est uniquement disponible lorsque le téléphone est en mode de test fabricant." + "Configurer le fond d\'écran" + "Permet à une application de définir le fond d\'écran du système." + "Définir les informations relatives à la taille du fond d\'écran" + "Permet à une application de définir les informations relatives à la taille du fond d\'écran du système." + "Réinitialiser le système à ses paramètres d\'usine" + "Permet à une application de réinitialiser entièrement le système afin qu\'il récupère ses valeurs d\'usine et d\'effacer toutes les données, configurations et applications installées." + "Définir le fuseau horaire" + "Permet à l\'application de modifier le fuseau horaire du téléphone." + "Identifier des comptes connus" + "Permet à une application d\'obtenir la liste des comptes connus du téléphone." + "Afficher l\'état du réseau" + "Permet à une application d\'afficher l\'état de tous les réseaux." + "Accès Internet complet" + "Permet à une application de créer des connecteurs réseau." + "Écrire les paramètres de Nom des points d\'accès" + "Permet à une application de modifier les paramètres APN (Nom des points d\'accès), comme le proxy ou le port de tout APN." + "Modifier la connectivité du réseau" + "Permet à une application de modifier la connectivité du réseau." + "Afficher l\'état du Wi-Fi" + "Permet à une application d\'afficher des informations concernant l\'état du Wi-Fi." + "Modifier l\'état du Wi-Fi" + "Permet à une application de se connecter à des points d\'accès Wi-Fi, de s\'en déconnecter et de modifier des réseaux Wi-Fi configurés." + "Gestion Bluetooth" + "Permet à une application de configurer le téléphone Bluetooth local, d\'identifier des périphériques distants et de les associer au téléphone." + "Créer des connexions Bluetooth" + "Permet à une application d\'obtenir la configuration du téléphone Bluetooth local et de créer et accepter des connexions à des appareils associés." + "Désactiver le verrouillage des touches" + "Permet à une application de désactiver le verrouillage des touches et toute sécurité par mot de passe. Exemple : Votre téléphone désactive le verrouillage du clavier lorsque vous recevez un appel, puis le réactive lorsque vous raccrochez." + "Lire les paramètres de synchronisation" + "Permet à une application de lire les paramètres de synchronisation (par ex. savoir si la synchronisation est activée pour les Contacts)." + "Écrire les paramètres de synchronisation" + "Permet à une application de modifier les paramètres de synchronisation (p. ex. si la synchronisation est activée pour les contacts)." + "Lire les statistiques de synchronisation" + "Permet à une application de lire les statistiques de synchronisation (par ex. l\'historique des synchronisations effectuées)." + "Lire les flux auxquels vous êtes abonné" + "Permet à une application d\'obtenir des informations sur les flux récemment synchronisés." + "Écrire les flux auxquels vous êtes abonné" + "Permet à une application de modifier vos flux synchronisés actuels. Cette fonctionnalité peut permettre à des applications malveillantes de modifier vos flux synchronisés." + + "Accueil" + "Mobile" + "Bureau" + "Télécopie bureau" + "Télécopie domicile" + "Récepteur d\'appel" + "Autre" + "Personnalisé" + + + "Accueil" + "Bureau" + "Autre" + "Personnalisée" + + + "Accueil" + "Bureau" + "Autre" + "Personnalisée" + + + "Accueil" + "Bureau" + "Autre" + "Personnalisé" + + + "Bureau" + "Autre" + "Personnalisée" + "AIM" "Windows Live" @@ -331,48 +353,41 @@ "ICQ" "Jabber" - - - "Le code PIN est incorrect !" + "Saisir le code PIN" + "Le code PIN est incorrect !" "Pour débloquer le clavier, appuyez sur Menu puis sur 0." "Numéro d\'urgence" "(Aucun service)" - - + "Écran verrouillé" "Appuyez sur Menu pour débloquer le téléphone ou appeler un numéro d\'urgence" - "Appuyez sur Menu pour débloquer le téléphone." - - + "Appuyez sur Menu pour déverrouiller le téléphone." + "Dessinez un motif pour déverrouiller le téléphone" "Appel d\'urgence" - "Forme validée !" - - - "Rechargement (%d%%)" + "Combinaison correcte !" + "Désolé. Merci de réessayer" + "Chargement (%d%%)" "Branchez votre chargeur." "Aucune carte SIM n\'a été trouvée." "Aucune carte SIM n\'est insérée dans le téléphone." "Insérez une carte SIM." "Réseau bloqué" - "La carte SIM est bloquée par code PUK." + "La carte SIM est verrouillée par code PUK." "Veuillez contacter l\'assistance clientèle." "La carte SIM est bloquée." "Déblocage de la carte SIM..." - "Vous avez mal reproduit la forme de déblocage %d fois. "\n\n"Veuillez réessayer dans %d secondes." - "Vous avez mal dessiné la forme de déblocage %d fois. Au bout de %d tentatives supplémentaires, vous devrez débloquer votre téléphone avec votre identifiant Google."\n\n"Merci de réessayer dans %d secondes." - "Réessayez dans %d secondes." - "Vous avez oublié la forme à dessiner ?" - "Trop de tentatives !" - - + "Vous avez mal reproduit le motif de déverrouillage %d fois. "\n\n"Veuillez réessayer dans %d secondes." + "Vous avez mal saisi le motif de déverrouillage %d fois. Au bout de %d tentatives supplémentaires, vous devrez débloquer votre téléphone à l\'aide de votre identifiant Google."\n\n"Merci de réessayer dans %d secondes." + "Réessayez dans %d secondes." + "Motif oublié ?" + "Trop de tentatives de motif !" + "Pour débloquer votre téléphone,"\n"connectez-vous à votre compte Google" "Nom d\'utilisateur (e-mail)" "Mot de passe" "Se connecter" - "Nom d\'utilisateur ou mot de passe non valide." + "Nom d\'utilisateur ou mot de passe incorrect." "h:mm AA" - - - - + "%-l:%M%P" + "%-l:%M%p" @@ -383,38 +398,38 @@ "Notifications" - "Rechargement..." - "Veuillez brancher le chargeur" - "La batterie commence à faiblir :" - "Batterie restante : %d%%" + "Chargement..." + "Branchez le chargeur" + "La batterie commence à faiblir :" + "Batterie restante : %d%%" "Échec du test usine" "L\'action FACTORY_TEST est uniquement prise en charge pour les paquets de données installés dans in/system/app." - "Aucun paquet permettant de prendre en charge l\'action FACTORY_TEST n\'a été trouvé." + "Impossible de trouver un paquet proposant l\'action FACTORY_TEST." "Redémarrer" "Confirmer" - "Voulez-vous que le navigateur se souvienne de ce mot de passe ?" + "Voulez-vous que le navigateur se souvienne de ce mot de passe ?" "Pas maintenant" "Se souvenir du mot de passe" "Jamais" - "Vous n\'avez pas l\'autorisation d\'ouvrir cette page." + "Vous n\'êtes pas autorisé à ouvrir cette page." "Le texte a été copié dans le presse-papier." "Plus" "Menu+" "espace" "entrée" - "effacer" + "supprimer" "Rechercher" "Aujourd\'hui" "Hier" "Demain" - "Il y a 1 mois" + "Il y a 1 mois" "Il y a plus d\'un mois" - "Il y a 1 seconde" - "Il y a %d secondes" + "Il y a 1 seconde" + "Il y a %d secondes" - "Il y a 1 minute" + "Il y a 1 minute" "Il y a %d minutes" @@ -423,23 +438,23 @@ "hier" - "Il y a %d jours" + "Il y a %d jours" - "dans 1 seconde" - "dans %d secondes" + "dans 1 seconde" + "dans %d secondes" - "dans 1 minute" - "dans %d minutes" + "dans 1 minute" + "dans %d minutes" - "dans 1 heure" + "dans 1 heure" "dans %d heures" "demain" - "dans %d jours" + "dans %d jours" @@ -460,8 +475,8 @@ "%s" "à %s" "en %s" - " jour" - " jours" + "jour" + "jours" "heure" "heures" "mn" @@ -479,7 +494,7 @@ "jeudi" "vendredi" "samedi" - "Tous les jours ouvrés (lun.-vend.)" + "Tous les jours ouvrés (lun.- ven.)" "Tous les jours" "Toutes les semaines le %s" "Tous les mois" @@ -503,10 +518,10 @@ "%1$s, %2$s" - "MMMM dd yyyy" + "dd MMMM yyyy" "dd MMMM yyyy" - "MMM dd yyyy" - "dd MMM, yyyy" + "dd MMM yyyy" + "dd MMM yyyy" "h:mm a" "H:mm" "midi" @@ -534,7 +549,7 @@ "%1$s, %3$s/%2$s%6$s, %8$s/%7$s" "%3$s/%2$s/%4$s%8$s/%7$s/%9$s" "%1$s, %3$s/%2$s/%4$s%6$s, %8$s/%7$s/%9$s" - "%3$s/%2$s, %5$s%8$s/%7$s, %10$s" + "%3$s/%2$s %5$s%8$s/%7$s %10$s" "%1$s, %3$s/%2$s, %5$s%6$s, %8$s/%7$s, %10$s" "%3$s/%2$s/%4$s, %5$s%8$s/%7$s/%9$s, %10$s" "%1$s, %3$s/%2$s/%4$s, %5$s%6$s, %8$s/%7$s/%9$s, %10$s" @@ -543,7 +558,7 @@ "%3$s%8$s %2$s %9$s" "%1$s, %3$s %2$s %4$s%6$s, %8$s %7$s %9$s" "%3$s %2$s %5$s%8$s %7$s %10$s" - "%1$s, %3$s %2$s %5$s%6$s, %8$s %7$s %10$s" + "%1$s, %3$s %2$s, %5$s%6$s, %8$s %7$s, %10$s" "%3$s %2$s %4$s, %5$s%8$s %7$s %9$s, %10$s" "%1$s, %3$s %2$s %4$s, %5$s%6$s, %8$s %7$s %9$s, %10$s" "%-d %b %Y" @@ -572,22 +587,22 @@ "mar." "mer." "jeu." - "vend." + "ven." "sam." - "dim" - "lun" + "dim." + "lun." "mar." "mer." "jeu." "ven." - "sam" + "sam." "dim." "lun." - "mar." - "merc." + "Mar." + "mer." "jeu." "ven." - "sam" + "sam." "janvier" "février" "mars" @@ -613,12 +628,12 @@ "nov." "déc." "jan." - "fév." - "mar." + "ven." + "mars" "avr." "mai" "juin" - "jui." + "juil." "août" "sept." "oct." @@ -626,21 +641,17 @@ "déc." "%1$02d:%2$02d" "%1$d:%2$02d:%3$02d" - "Sélectionner tout" - - - - + "Tout sélectionner" + "Sélectionner le texte" + "Arrêter de sélectionner du texte" "Couper" - "Couper tout" + "Tout couper" "Copier" - "Copier tout" + "Tout copier" "Coller" "Copier l\'URL" - - - - + "Mode de saisie" + "Modifier le texte" "Espace disponible faible" "La mémoire du téléphone commence à être pleine." "OK" @@ -650,14 +661,14 @@ "ON" "OFF" "Terminer l\'action avec" - "Utiliser par défaut pour cette action." - "Effacer par défaut dans les Paramètres de l\'accueil > Applications > Gérer les applications." + "Utiliser cette application par défaut pour cette action." + "Effacez les paramètres par défaut dans les Paramètres d\'accueil > Applications > Gérer les applications." "Sélectionner une action" "Aucune application ne peut effectuer cette action." - "Désolé !" + "Désolé !" "L\'application %1$s (du processus %2$s) s\'est interrompue inopinément. Merci de réessayer." "Le processus %1$s s\'est interrompu de façon inopinée. Merci de réessayer." - "Désolé !" + "Désolé !" "L\'activité %1$s (de l\'application %2$s) ne répond pas." "L\'activité %1$s (du processus %2$s) ne répond pas." "L\'application %1$s (du processus %2$s) ne répond pas." @@ -667,22 +678,17 @@ "Débogage" "Sélectionner une action pour le texte" "Volume de la sonnerie" - - - - + "Volume des médias" + "Lecture via Bluetooth" "Volume des appels entrants" - - + "Lecture via Bluetooth" "Volume de l\'alarme" - - + "Volume des notifications" "Volume" "Sonnerie par défaut" "Sonnerie par défaut (%1$s)" "Silencieux" - - + "Sonneries" "Sonnerie inconnue" "Réseau Wi-Fi disponible" @@ -692,32 +698,27 @@ "Ouvrir le réseau Wi-Fi disponible" "Ouvrir les réseaux Wi-Fi disponibles" - - + "Insérer un caractère" "Application inconnue" - "Envoi des messages SMS" - "Vous allez envoyer un grand nombre de messages SMS. Sélectionnez OK pour continuer ou Annuler pour interrompre l\'envoi." + "Envoi de messages SMS" + "Vous êtes sur le point d\'envoyer un grand nombre de messages SMS. Sélectionnez OK pour continuer ou Annuler pour interrompre l\'envoi." "OK" "Annuler" - "Régler" + "Définir" "Par défaut" "Aucune autorisation requise" "Masquer" - "Afficher tout" + "Tout afficher" "Chargement..." - "Connecté avec un câble USB" - "Vous avez connecté votre téléphone à votre ordinateur avec un câble USB. Sélectionnez Monter pour copier des fichiers depuis votre ordinateur vers votre carte SD ou inversement." + "Connecté à l\'aide d\'un câble USB" + "Vous avez connecté votre téléphone à votre ordinateur à l\'aide d\'un câble USB. Sélectionnez Monter pour copier des fichiers depuis votre ordinateur vers votre carte SD ou inversement." "Monter" "Ne pas monter" "Un problème est survenu lors de l\'utilisation de votre carte SD en tant que périphérique de stockage USB." "Connecté avec un câble USB" - "Sélectionner cette option pour copier des fichiers vers/à partir de votre ordinateur." - - - - - - - - + "Sélectionnez cette option pour copier des fichiers vers/à partir de votre ordinateur." + "Sélectionner un mode de saisie" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "candidats""u>" diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 771eabda3476a..b41d449ba535d 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -25,8 +25,7 @@ "Il PUK digitato è errato." "I PIN inseriti non corrispondono." "Il PIN deve essere di 4-8 numeri." - - + "La SIM è bloccata tramite PUK. Digita il codice PUK per sbloccarla." "Digita il PUK2 per sbloccare la SIM." "ID chiamante in entrata" "ID chiamante in uscita" @@ -70,7 +69,7 @@ "Impossibile accedere al file." "Impossibile trovare il file richiesto." "Troppe richieste in fase di elaborazione. Riprova più tardi." - "Sincronizzazione" + "Sinc" "Sincronizzazione" "Troppe eliminazioni di %s." "Spazio di archiviazione del telefono esaurito. Elimina alcuni file per liberare spazio." @@ -175,10 +174,8 @@ "Consente a un\'applicazione di offrire i suoi eventi di input (pressioni di tasti etc.) ad altre applicazioni. Le applicazioni dannose possono sfruttare questa possibilità per assumere il controllo del telefono." "registrare il testo digitato e le azioni effettuate" "Consente il rilevamento da parte delle applicazioni dei tasti premuti anche durante l\'interazione con un\'altra applicazione (come nel caso di inserimento di una password). Non dovrebbe essere mai necessario per le normali applicazioni." - - - - + "associare a un metodo di inserimento" + "Consente l\'associazione all\'interfaccia principale di un metodo di inserimento. Non dovrebbe essere mai necessario per le normali applicazioni." "cambiare l\'orientamento dello schermo" "Consente a un\'applicazione di cambiare la rotazione dello schermo in qualsiasi momento. Non dovrebbe essere mai necessario per le normali applicazioni." "inviare segnali Linux alle applicazioni" @@ -202,16 +199,13 @@ "leggere/scrivere a risorse di proprietà di diag" "Consente a un\'applicazione di leggere le risorse del gruppo diag e scrivere a esse, per esempio i file in /dev. Questa capacità potrebbe influire sulla stabilità e sicurezza del sistema. Dovrebbe essere utilizzata SOLTANTO per diagnostiche specifiche dell\'hardware effettuate dal produttore o dall\'operatore." "attivare o disattivare componenti delle applicazioni" - - + "Consente a un\'applicazione di attivare o disattivare un componente di un\'altra applicazione. Le applicazioni dannose possono sfruttare questa possibilità per disattivare importanti funzionalità del telefono. Prestare attenzione con questa autorizzazione perché è possibile rendere inutilizzabili, incoerenti o instabili i componenti delle applicazioni." "impostare le applicazioni preferite" "Consente la modifica da parte di un\'applicazione delle applicazioni preferite. Le applicazioni dannose potrebbero essere in grado di modificare automaticamente le applicazioni in esecuzione, effettuando lo spoofing delle applicazioni esistenti per raccogliere dati riservati." "modificare le impostazioni di sistema globali" "Consente la modifica in un\'applicazione dei dati delle impostazioni del sistema. Le applicazioni dannose possono danneggiare la configurazione del sistema." - - - - + "modificare le impostazioni di protezione del sistema" + "Consente a un\'applicazione di modificare i dati delle impostazioni di protezione del sistema. Da non usare per normali applicazioni." "modificare la mappa dei servizi Google" "Consente a un\'applicazione di modificare la mappa dei servizi Google. Da non usare per normali applicazioni." "aprire automaticamente all\'avvio" @@ -269,7 +263,7 @@ "accedere a proprietà di archiviazione" "Consente l\'accesso di lettura/scrittura alle proprietà caricate dal servizio di archiviazione. Da non usare per normali applicazioni." "modificare lo stato del telefono" - "Consente all\'applicazione di controllare le funzioni telefoniche del dispositivo. Un\'applicazione con questa autorizzazione può cambiare rete, accendere e spegnere la radio del telefono e così via, il tutto automaticamente." + "Consente all\'applicazione di controllare le funzioni telefoniche del dispositivo. Un\'applicazione con questa autorizzazione può cambiare rete, accendere e spegnere il modulo radio del telefono e così via, il tutto automaticamente." "leggere lo stato del telefono" "Consente l\'accesso dell\'applicazione alle funzioni telefoniche del dispositivo. Un\'applicazione con questa autorizzazione può determinare il numero del telefono in uso, se una chiamata è attiva o meno, il numero a cui è collegata la chiamata e simili." "impedire la sospensione del telefono" @@ -316,11 +310,39 @@ "Consente a un\'applicazione di ottenere dettagli sui feed attualmente sincronizzati." "scrivere feed sottoscritti" "Consente la modifica da parte di un\'applicazione dei feed attualmente sincronizzati. Le applicazioni dannose potrebbero essere in grado di modificare i feed sincronizzati." - - - - - + + "Casa" + "Cellulare" + "Lavoro" + "Fax lavoro" + "Fax abitazione" + "Cercapersone" + "Altro" + "Personale" + + + "Casa" + "Lavoro" + "Altro" + "Personale" + + + "Casa" + "Lavoro" + "Altro" + "Personale" + + + "Casa" + "Lavoro" + "Altro" + "Personale" + + + "Lavoro" + "Altro" + "Personale" + "AIM" "Windows Live" @@ -331,22 +353,18 @@ "ICQ" "Jabber" - - + "Inserisci il PIN" "Codice PIN errato." - "Per sbloccare, premere Menu, poi 0." + "Per sbloccare, premi Menu, poi 0." "Numero di emergenza" "(Nessun servizio)" - - + "Schermo bloccato." "Premi Menu per sbloccare o effettuare chiamate di emergenza." "Premi Menu per sbloccare." - - + "Traccia la sequenza di sblocco" "Chiamata di emergenza" "Corretta." - - + "Riprova" "In carica (%d%%)" "Collega il caricabatterie." "Nessuna SIM presente." @@ -362,17 +380,14 @@ "Riprova fra %d secondi." "Hai dimenticato la sequenza?" "Troppi tentativi di inserimento della sequenza." - - + "Per sbloccare,"\n"accedi tramite il tuo account Google" "Nome utente (email)" "Password" "Accedi" "Password o nome utente non valido." "h:mm AA" - - - - + "%-l:%M%P" + "%-l:%M%p" @@ -517,7 +532,7 @@ - "%-d %B, %Y" + "%-d %B %Y" "%H:%M:%S" @@ -529,7 +544,7 @@ "%3$s %2$s, %5$s%8$s %7$s, %10$s" "%1$s, %3$s %2$s, %5$s%6$s, %8$s %7$s, %10$s" "%3$s %2$s, %4$s, %5$s%8$s %7$s, %9$s, %10$s" - "%1$s, %3$s %2$s, %4$s, %5$s%6$s, %8$s %7$s, %9$s, %10$s" + "%1$s, %3$s %2$s %4$s, %5$s%6$s, %8$s %7$s %9$s, %10$s" "%3$s/%2$s%8$s/%7$s" "%1$s, %3$s/%2$s%6$s, %8$s/%7$s" "%3$s/%2$s/%4$s%8$s/%7$s/%9$s" @@ -544,7 +559,7 @@ "%1$s, %3$s %2$s, %4$s%6$s, %8$s %7$s, %9$s" "%3$s %2$s, %5$s%8$s %7$s, %10$s" "%1$s, %3$s %2$s, %5$s%6$s, %8$s %7$s, %10$s" - "%3$s %2$s, %4$s, %5$s%8$s %7$s, %9$s, %10$s" + "%3$s %2$s %4$s, %5$s%8$s %7$s %9$s, %10$s" "%1$s, %3$s %2$s, %4$s, %5$s%6$s, %8$s %7$s, %9$s, %10$s" "%-d %b, %Y" @@ -584,7 +599,7 @@ "D" "Lun" "M" - "Mer" + "Me" "G" "V" "Sa" @@ -614,7 +629,7 @@ "Dic" "G" "F" - "Mar" + "M" "Ap" "Mag" "Gi" @@ -627,20 +642,16 @@ "%1$02d:%2$02d" "%1$d:%2$02d:%3$02d" "Seleziona tutto" - - - - + "Seleziona testo" + "Termina selezione testo" "Taglia" "Taglia tutto" "Copia" "Copia tutto" "Incolla" "Copia URL" - - - - + "Metodo inserimento" + "Modifica testo" "Spazio in esaurimento" "Spazio di archiviazione del telefono in esaurimento." "OK" @@ -651,7 +662,7 @@ "OFF" "Completa l\'azione con" "Usa come predefinita per questa azione." - "Cancella predefinita in Impostazioni home > Applicazioni > Gestisci applicazioni." + "Cancella predefinita in Home > Impostazioni > Applicazioni > Gestisci applicazioni." "Seleziona un\'azione" "Nessuna applicazione è in grado di svolgere questa azione." "Spiacenti." @@ -667,22 +678,17 @@ "Debug" "Seleziona un\'azione per il testo" "Volume suoneria" - - - - + "Volume media" + "Riproduzione tramite Bluetooth" "Volume chiamate" - - + "Riproduzione tramite Bluetooth" "Volume allarme" - - + "Volume notifiche" "Volume" "Suoneria predefinita" "Suoneria predefinita (%1$s)" "Silenzioso" - - + "Suonerie" "Suoneria sconosciuta" "Rete Wi-Fi disponibile" @@ -692,8 +698,7 @@ "Rete Wi-Fi aperta disponibile" "Reti Wi-Fi aperte disponibili" - - + "Inserisci carattere" "Applicazione sconosciuta" "Invio SMS" "È in corso l\'invio di numerosi SMS. Seleziona \"OK\" per continuare, oppure \"Annulla\" per interrompere l\'invio." @@ -712,12 +717,8 @@ "Problema di utilizzo della scheda SD per l\'archiviazione USB." "USB collegata" "Seleziona per copiare file sul/dal computer in uso." - - - - - - - - + "Seleziona metodo di inserimento" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "candidati""u>" diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index b402c7f85ce5c..93b66f35ddd58 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -8,7 +8,7 @@ "TB" "PB" "<無題>" - "…" + "..." "(電話番号なし)" "(不明)" "ボイスメール" @@ -25,13 +25,12 @@ "入力したPUKは正しくありません。" "入力したPINが一致しません。" "4~8桁の数字のPINを入力してください。" - - + "SIMカードはPUKでロックされています。ロックを解除するにはPUKコードを入力してください。" "SIMカードのロック解除のためPUK2を入力します。" "着信時の発信者番号" "発信時の発信者番号" "電話の転送" - "待機中の着信" + "通話中着信" "発信制限" "パスワードの変更" "PINの変更" @@ -82,7 +81,7 @@ "画面をロック" "電源オフ" "シャットダウン中..." - "携帯電話は停止されます。" + "携帯電話の電源をオフにします。" "最近使ったアプリケーションはありません。" "携帯電話オプション" "画面をロック" @@ -104,7 +103,7 @@ "Googleアカウント" "利用可能なGoogleアカウントへのアクセス" "ハードウェアの制御" - "ハンドセットのハードウェアへの直接アクセス" + "携帯電話のハードウェアに直接アクセスします。" "電話の発信" "通話の監視、記録、処理" "システムツール" @@ -112,7 +111,7 @@ "開発ツール" "アプリケーションのデベロッパーにのみ必要な機能です。" "ステータスバーを無効にしたり変更する" - "ステータスバーを無効にしたり、システムアイコンを追加や削除することをアプリケーションに許可します。" + "ステータスバーの無効化や、システムアイコンの追加や削除をアプリケーションに許可します。" "ステータスバーの拡大/縮小" "ステータスバーの拡大や縮小をアプリケーションに許可します。" "発信の傍受" @@ -130,7 +129,7 @@ "WAPの受信" "WAPメッセージの受信と処理をアプリケーションに許可します。悪意のあるアプリケーションがメッセージを監視したり、表示せずに削除する恐れがあります。" "実行中のアプリケーションの取得" - "現在実行中または最近実行したタスクに関する情報の取得をアプリケーションに許可します。悪意のあるアプリケーションが他のアプリケーションから非公開情報を取得する恐れがあります。" + "現在実行中または最近実行したタスクに関する情報の取得をアプリケーションに許可します。悪意のあるアプリケーションが他のアプリケーションの非公開情報を取得する恐れがあります。" "実行中のアプリケーションの順序の変更" "タスクをフォアグラウンドやバックグラウンドに移動することをアプリケーションに許可します。悪意のあるアプリケーションが優先されて、コントロールできなくなる恐れがあります。" "アプリケーションのデバッグを有効にする" @@ -140,7 +139,7 @@ "他のアプリケーションの再起動" "他のアプリケーションの強制的な再起動をアプリケーションに許可します。" "停止の阻止" - "フォアグラウンドでプロセスを実行して、終了できないようにすることをアプリケーションに許可します。通常のアプリケーションではまったく必要ありません。" + "フォアグラウンドでプロセスを実行して、強制終了できないようにすることをアプリケーションに許可します。通常のアプリケーションではまったく必要ありません。" "アプリケーションの強制終了" "フォアグラウンドで実行されている操作を強制終了して戻ることをアプリケーションに許可します。通常のアプリケーションではまったく必要ありません。" "システムの内部状態の取得" @@ -149,19 +148,19 @@ "独自の低レベルのシステムサービスを公開することをアプリケーションに許可します。悪意のあるアプリケーションがシステムを乗っ取って、データの盗用や破壊をする恐れがあります。" "起動中のすべてのアプリケーションの監視と制御" "システムが起動する操作の監視と制御をアプリケーションに許可します。悪意のあるアプリケーションがシステムを完全に破壊する恐れがあります。この許可は開発にのみ必要で、携帯電話の通常の使用にはまったく必要ありません。" - "パッケージが削除されたブロードキャストの配信" - "アプリケーションパッケージの削除の通知を配信することをアプリケーションに許可します。これにより悪意のあるアプリケーションが、他の実行中のアプリケーションを強制終了する恐れがあります。" - "SMS受信ブロードキャストの配信" + "パッケージ削除ブロードキャストの送信" + "アプリケーションパッケージの削除通知を配信することをアプリケーションに許可します。これにより悪意のあるアプリケーションが、他の実行中のアプリケーションを強制終了する恐れがあります。" + "SMS受信ブロードキャストの送信" "SMSメッセージの受信通知の配信をアプリケーションに許可します。これにより悪意のあるアプリケーションが、受信SMSメッセージを偽造する恐れがあります。" - "WAP-PUSH受信ブロードキャストの配信" - "WAP PUSHメッセージの受信の通知を配信することをアプリケーションに許可します。これにより悪意のあるアプリケーションが、MMS受信メッセージを偽造したり、ウェブページのコンテンツを密かに改ざんする恐れがあります。" + "WAP-PUSH受信ブロードキャストの送信" + "WAP PUSHメッセージの受信通知を配信することをアプリケーションに許可します。これにより悪意のあるアプリケーションが、MMS受信メッセージを偽造したり、ウェブページのコンテンツを密かに改ざんしたりする恐れがあります。" "実行中のプロセスの数を制限" "実行するプロセス数の上限の制御をアプリケーションに許可します。通常のアプリケーションにはまったく必要ありません。" - "バックグラウンドアプリケーションをすべて閉じる" + "バックグラウンドアプリケーションをすべて終了する" "バックグラウンドになり次第必ず操作を終了させるかどうかの制御をアプリケーションに許可します。通常のアプリケーションではまったく必要ありません。" "システムアップデートの自動インストール" "保留中のシステムアップデートに関する通知を受信してインストールを開始することをアプリケーションに許可します。これにより悪意のあるアプリケーションが、許可なく更新を行ってシステムを破壊したり、更新処理を妨害する恐れがあります。" - "バッテリの統計の変更" + "バッテリ統計の変更" "収集されたバッテリの統計の変更を許可します。通常のアプリケーションでは使用しません。" "未許可のウィンドウの表示" "内部システムのユーザーインターフェースで使用するためのウィンドウ作成を許可します。通常のアプリケーションでは使用しません。" @@ -175,14 +174,12 @@ "入力イベント (キーを押すなど) を別のアプリケーションに伝えることをアプリケーションに許可します。これにより悪意のあるアプリケーションが、携帯電話を乗っ取る恐れがあります。" "入力や操作の記録" "別のアプリケーションへの入力 (パスワードなど) でもキー入力を監視することをアプリケーションに許可します。通常のアプリケーションではまったく必要ありません。" - - - - + "入力方法に関連付ける" + "入力方法のトップレベルインターフェースに関連付けることを所有者に許可します。通常のアプリケーションにはまったく必要ありません。" "画面の向きの変更" "いつでも画面の回転を変更することをアプリケーションに許可します。通常のアプリケーションにはまったく必要ありません。" "Linuxのシグナルをアプリケーションに送信" - "すべての永続プロセスへの指定の信号の送信要求をアプリケーションに許可します。" + "すべての永続プロセスに特定の信号を送信するリクエストをアプリケーションに許可します。" "アプリケーションを常に実行する" "自身を部分的に永続させて、他のアプリケーション用にはその領域をシステムに使わせないようにすることをアプリケーションに許可します。" "アプリケーションの削除" @@ -200,22 +197,19 @@ "システムログファイルの読み取り" "システムのさまざまなログファイルの読み取りをアプリケーションに許可します。これにより携帯電話の使用状況に関する全般情報が取得されますが、個人情報や非公開情報が含まれることはありません。" "diagが所有するリソースの読み書き" - "diagグループが所有するリソース (例、/dev内のファイル) への読み書きをアプリケーションに許可します。これはシステムの安定性とセキュリティに影響する恐れがあります。メーカーまたはオペレータによるハードウェア固有の診断以外には使用しないでください。" + "diagグループが所有するリソース (/dev内のファイルなど) への読み書きをアプリケーションに許可します。これはシステムの安定性とセキュリティに影響する恐れがあります。メーカーまたはオペレータによるハードウェア固有の診断以外には使用しないでください。" "アプリケーションのコンポーネントを有効/無効にする" - - + "別アプリケーションのコンポーネントの有効/無効を変更することをアプリケーションに許可します。これにより悪意のあるアプリケーションが、携帯電話の重要な機能を無効にする恐れがあります。アプリケーションコンポーネントが利用できない、整合性が取れない、または不安定な状態になる恐れがあるので、許可には注意が必要です。" "優先アプリケーションの設定" "優先アプリケーションを変更することをアプリケーションに許可します。これにより悪意のあるアプリケーションが、実行中のアプリケーションを密かに変更し、既存のアプリケーションになりすまして、非公開データを収集する恐れがあります。" "システム全般の設定の変更" "システム設定データの変更をアプリケーションに許可します。悪意のあるアプリケーションがシステム設定を破壊する恐れがあります。" - - - - + "システムのセキュリティ設定の変更" + "システムのセキュリティ設定の変更をアプリケーションに許可します。通常のアプリケーションでは使用しません。" "Googleサービスの地図の変更" "Googleサービスマップの変更をアプリケーションに許可します。通常のアプリケーションでは使用しません。" "起動時に自動的に開始" - "システムの起動後に、自動的に起動することをアプリケーションに許可します。これにより携帯電話の起動に時間がかかるようになり、アプリケーションが常に実行されるために携帯電話の全体的な動作が遅くなります。" + "システムの起動直後に自動的に起動することをアプリケーションに許可します。これにより携帯電話の起動に時間がかかるようになります。また、アプリケーションが常に実行中となるため、携帯電話の全体的な動作が遅くなります。" "stickyブロードキャストの配信" "配信が終了してもメモリに残るようなstickyブロードキャストをアプリケーションに許可します。悪意のあるアプリケーションがメモリを使いすぎて、携帯電話の動作が遅くなったり、不安定になる恐れがあります。" "連絡先データの読み取り" @@ -223,7 +217,7 @@ "連絡先データの書き込み" "携帯電話に保存した連絡先 (アドレス) データの変更をアプリケーションに許可します。これにより悪意のあるアプリケーションが、連絡先データを消去や変更する恐れがあります。" "所有者データの書き込み" - "携帯電話に保存した所有者のデータの変更をアプリケーションに許可します。これにより悪意のあるアプリケーションが、所有者のデータを消去や変更する恐れがあります。" + "携帯電話に保存した所有者のデータの変更をアプリケーションに許可します。これにより悪意のあるアプリケーションが、所有者のデータを消去または変更する恐れがあります。" "所有者データの読み取り" "携帯電話に保存した所有者データの読み取りをアプリケーションに許可します。これにより悪意のあるアプリケーションが、所有者データを読み取る恐れがあります。" "カレンダーデータの読み取り" @@ -235,7 +229,7 @@ "位置情報プロバイダのその他のコマンドへのアクセス" "位置情報プロバイダのその他のコマンドにアクセスします。これにより悪意のあるアプリケーションが、GPSなどの位置情報源の動作を妨害する恐れがあります。" "正確な (GPS) 位置" - "GPSなど、携帯電話の正確な位置情報源に、可能な場合アクセスします。これにより悪意のあるアプリケーションが、ユーザーの現在地を特定したり、バッテリの消費が増える恐れがあります。" + "GPSなど、携帯電話の正確な位置情報源に、可能な場合アクセスします。これにより悪意のあるアプリケーションが、ユーザーの現在地を特定したり、バッテリの消費を増やしたりする恐れがあります。" "おおよその (ネットワーク情報による) 位置" "セルラーネットワークデータベースなど、携帯電話のおおよその位置を特定する情報源が利用可能な場合にアクセスします。これにより悪意のあるアプリケーションが、ユーザーのおおよその位置を特定できる恐れがあります。" "SurfaceFlingerへのアクセス" @@ -316,11 +310,39 @@ "現在同期しているフィードの詳細の取得をアプリケーションに許可します。" "登録したフィードの書き込み" "現在同期しているフィードの変更をアプリケーションに許可します。悪意のあるアプリケーションが同期フィードを変更する恐れがあります。" - - - - - + + "自宅" + "携帯" + "勤務先" + "勤務先FAX" + "自宅FAX" + "ポケベル" + "その他" + "カスタム" + + + "自宅" + "勤務先" + "その他" + "カスタム" + + + "自宅" + "勤務先" + "その他" + "カスタム" + + + "自宅" + "勤務先" + "その他" + "カスタム" + + + "勤務先" + "その他" + "カスタム" + "AIM" "Windows Live" @@ -331,22 +353,18 @@ "ICQ" "Jabber" - - + "PINコードを入力" "PINコードが正しくありません。" "ロックを解除するには、Menu、0キーの順に押します。" "緊急電話番号" "(サービスなし)" - - + "画面がロックされています。" "Menuキーを押してロックを解除するか、緊急電話をかけます。" "ロックを解除するにはMenuキーを押します。" - - + "ロックを解除するパターンを入力" "緊急電話" "一致しました" - - + "もう一度試してください" "充電中 (%d%%)" "充電してください。" "SIMカードがありません。" @@ -362,17 +380,14 @@ "%d秒後にもう一度試してください。" "パターンを忘れた場合" "パターンの指定回数が多すぎる" - - + "ロックを解除するには、"\n"Googleアカウントでログインしてください。" "ユーザー名 (メール)" "パスワード" "ログイン" "ユーザー名またはパスワードが正しくありません。" "h:mm AA" - - - - + "%-l:%M%P" + "%-l:%M%p" @@ -403,7 +418,7 @@ "Space" "Enter" "Del" - "Search" + "検索" "今日" "昨日" "明日" @@ -441,6 +456,22 @@ "明日" "%d日後" + + + + + + + + + + + + + + + + "%s" "%s" "%s年" @@ -473,7 +504,7 @@ "OK" "AM" "PM" - "%Y/%d/%m" + "%Y/%m/%d" "%2$s (%1$s) %3$s%5$s (%4$s) %6$s" "%2$s (%1$s)~%5$s (%4$s)" "%2$s %3$s%5$s %6$s" @@ -481,8 +512,12 @@ "%1$s%2$s" "%3$s (%2$s) %1$s" "%3$s (%2$s)" - "%3$s %1$s" - "%2$s %1$s" + "%3$s%1$s" + + + + + "%2$s%1$s" "yyyy\'年\'MMMMdd\'日\'" "yyyy\'年\'MMMMdd\'日\'" "yyyy\'年\'MMMdd\'日\'" @@ -565,7 +600,7 @@ "月" "火" "水" - "木" + "火" "金" "土" "1月" @@ -594,7 +629,7 @@ "12月" "1" "2" - "3" + "月" "4" "5" "6" @@ -607,16 +642,16 @@ "%1$02d:%2$02d" "%1$d:%2$02d:%3$02d" "すべて選択" + "テキストを選択" + "テキストの選択を終了" "切り取り" "すべて切り取り" "コピー" "すべてコピー" "貼り付け" "URLをコピー" - - - - + "入力方法" + "テキストを編集" "空き容量低下" "携帯電話の空き容量が少なくなっています。" "OK" @@ -629,7 +664,7 @@ "この操作にデフォルトで使用します。" "ホームの[設定]>[アプリケーション]>[アプリケーションを管理]で、デフォルトをクリアします。" "操作の選択" - "この操作を実行するアプリケーションはありません。" + "この操作を実行できるアプリケーションはありません。" "エラー" "アプリケーション%1$s (%2$sプロセス) が予期せず停止しました。もう一度試してください。" "%1$sプロセスが予期せず停止しました。もう一度試してください。" @@ -643,23 +678,18 @@ "デバッグ" "テキストの操作の選択" "着信音の音量" - - - - + "メディアの音量" + "Bluetooth経由で再生中です" "着信音の音量" - - + "Bluetooth経由で再生中です" "アラームの音量" - - + "通知音の音量" "音量" "デフォルトの着信音" "デフォルトの着信音 (%1$s)" "無音" - - - "不明の着信音" + "着信音" + "不明時着信音" "Wi-Fiネットワークが利用可能" "Wi-Fiネットワークが利用可能" @@ -668,8 +698,7 @@ "Wi-Fiオープンネットワークが利用できます" "Wi-Fiオープンネットワークが利用できます" - - + "文字を挿入" "不明なアプリケーション" "SMSメッセージの送信中" "大量のSMSメッセージが送信されます。送信するには[OK]、中止するには[キャンセル]を選択します。" @@ -688,12 +717,8 @@ "USBメモリにSDカードを使用する際に問題が発生しました。" "USB接続" "パソコンとの間でファイルをコピーします。" - - - - - - - - + "入力方法の選択" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "候補" diff --git a/core/res/res/values-mcc204-cs/strings.xml b/core/res/res/values-mcc204-cs/strings.xml new file mode 100644 index 0000000000000..c846c60ac6ff5 --- /dev/null +++ b/core/res/res/values-mcc204-cs/strings.xml @@ -0,0 +1,5 @@ + + + "nl_nl" + diff --git a/core/res/res/values-mcc204-de/strings.xml b/core/res/res/values-mcc204-de/strings.xml index 1b2f85b07bda1..c846c60ac6ff5 100644 --- a/core/res/res/values-mcc204-de/strings.xml +++ b/core/res/res/values-mcc204-de/strings.xml @@ -1,6 +1,5 @@ - - + "nl_nl" diff --git a/core/res/res/values-mcc204-es/strings.xml b/core/res/res/values-mcc204-es/strings.xml new file mode 100644 index 0000000000000..c846c60ac6ff5 --- /dev/null +++ b/core/res/res/values-mcc204-es/strings.xml @@ -0,0 +1,5 @@ + + + "nl_nl" + diff --git a/core/res/res/values-mcc204-fr/strings.xml b/core/res/res/values-mcc204-fr/strings.xml index 1b2f85b07bda1..c846c60ac6ff5 100644 --- a/core/res/res/values-mcc204-fr/strings.xml +++ b/core/res/res/values-mcc204-fr/strings.xml @@ -1,6 +1,5 @@ - - + "nl_nl" diff --git a/core/res/res/values-mcc204-it/strings.xml b/core/res/res/values-mcc204-it/strings.xml index 1b2f85b07bda1..c846c60ac6ff5 100644 --- a/core/res/res/values-mcc204-it/strings.xml +++ b/core/res/res/values-mcc204-it/strings.xml @@ -1,6 +1,5 @@ - - + "nl_nl" diff --git a/core/res/res/values-mcc204-ja/strings.xml b/core/res/res/values-mcc204-ja/strings.xml index 1b2f85b07bda1..c846c60ac6ff5 100644 --- a/core/res/res/values-mcc204-ja/strings.xml +++ b/core/res/res/values-mcc204-ja/strings.xml @@ -1,6 +1,5 @@ - - + "nl_nl" diff --git a/core/res/res/values-mcc204-nl/strings.xml b/core/res/res/values-mcc204-nl/strings.xml new file mode 100644 index 0000000000000..c846c60ac6ff5 --- /dev/null +++ b/core/res/res/values-mcc204-nl/strings.xml @@ -0,0 +1,5 @@ + + + "nl_nl" + diff --git a/core/res/res/values-mcc204-pl/strings.xml b/core/res/res/values-mcc204-pl/strings.xml new file mode 100644 index 0000000000000..c846c60ac6ff5 --- /dev/null +++ b/core/res/res/values-mcc204-pl/strings.xml @@ -0,0 +1,5 @@ + + + "nl_nl" + diff --git a/core/res/res/values-mcc204-ru/strings.xml b/core/res/res/values-mcc204-ru/strings.xml new file mode 100644 index 0000000000000..c846c60ac6ff5 --- /dev/null +++ b/core/res/res/values-mcc204-ru/strings.xml @@ -0,0 +1,5 @@ + + + "nl_nl" + diff --git a/core/res/res/values-mcc204-zh-rCN/strings.xml b/core/res/res/values-mcc204-zh-rCN/strings.xml index 1b2f85b07bda1..c846c60ac6ff5 100644 --- a/core/res/res/values-mcc204-zh-rCN/strings.xml +++ b/core/res/res/values-mcc204-zh-rCN/strings.xml @@ -1,6 +1,5 @@ - - + "nl_nl" diff --git a/core/res/res/values-mcc204-zh-rTW/strings.xml b/core/res/res/values-mcc204-zh-rTW/strings.xml new file mode 100644 index 0000000000000..c846c60ac6ff5 --- /dev/null +++ b/core/res/res/values-mcc204-zh-rTW/strings.xml @@ -0,0 +1,5 @@ + + + "nl_nl" + diff --git a/core/res/res/values-mcc230-cs/strings.xml b/core/res/res/values-mcc230-cs/strings.xml new file mode 100644 index 0000000000000..fd82191feaa0e --- /dev/null +++ b/core/res/res/values-mcc230-cs/strings.xml @@ -0,0 +1,5 @@ + + + "cs_cz" + diff --git a/core/res/res/values-mcc230-de/strings.xml b/core/res/res/values-mcc230-de/strings.xml index 46bdbda078672..fd82191feaa0e 100644 --- a/core/res/res/values-mcc230-de/strings.xml +++ b/core/res/res/values-mcc230-de/strings.xml @@ -1,6 +1,5 @@ - - + "cs_cz" diff --git a/core/res/res/values-mcc230-es/strings.xml b/core/res/res/values-mcc230-es/strings.xml new file mode 100644 index 0000000000000..fd82191feaa0e --- /dev/null +++ b/core/res/res/values-mcc230-es/strings.xml @@ -0,0 +1,5 @@ + + + "cs_cz" + diff --git a/core/res/res/values-mcc230-fr/strings.xml b/core/res/res/values-mcc230-fr/strings.xml index 46bdbda078672..fd82191feaa0e 100644 --- a/core/res/res/values-mcc230-fr/strings.xml +++ b/core/res/res/values-mcc230-fr/strings.xml @@ -1,6 +1,5 @@ - - + "cs_cz" diff --git a/core/res/res/values-mcc230-it/strings.xml b/core/res/res/values-mcc230-it/strings.xml index 46bdbda078672..fd82191feaa0e 100644 --- a/core/res/res/values-mcc230-it/strings.xml +++ b/core/res/res/values-mcc230-it/strings.xml @@ -1,6 +1,5 @@ - - + "cs_cz" diff --git a/core/res/res/values-mcc230-ja/strings.xml b/core/res/res/values-mcc230-ja/strings.xml index 46bdbda078672..fd82191feaa0e 100644 --- a/core/res/res/values-mcc230-ja/strings.xml +++ b/core/res/res/values-mcc230-ja/strings.xml @@ -1,6 +1,5 @@ - - + "cs_cz" diff --git a/core/res/res/values-mcc230-nl/strings.xml b/core/res/res/values-mcc230-nl/strings.xml new file mode 100644 index 0000000000000..fd82191feaa0e --- /dev/null +++ b/core/res/res/values-mcc230-nl/strings.xml @@ -0,0 +1,5 @@ + + + "cs_cz" + diff --git a/core/res/res/values-mcc230-pl/strings.xml b/core/res/res/values-mcc230-pl/strings.xml new file mode 100644 index 0000000000000..fd82191feaa0e --- /dev/null +++ b/core/res/res/values-mcc230-pl/strings.xml @@ -0,0 +1,5 @@ + + + "cs_cz" + diff --git a/core/res/res/values-mcc230-ru/strings.xml b/core/res/res/values-mcc230-ru/strings.xml new file mode 100644 index 0000000000000..fd82191feaa0e --- /dev/null +++ b/core/res/res/values-mcc230-ru/strings.xml @@ -0,0 +1,5 @@ + + + "cs_cz" + diff --git a/core/res/res/values-mcc230-zh-rCN/strings.xml b/core/res/res/values-mcc230-zh-rCN/strings.xml index 46bdbda078672..fd82191feaa0e 100644 --- a/core/res/res/values-mcc230-zh-rCN/strings.xml +++ b/core/res/res/values-mcc230-zh-rCN/strings.xml @@ -1,6 +1,5 @@ - - + "cs_cz" diff --git a/core/res/res/values-mcc230-zh-rTW/strings.xml b/core/res/res/values-mcc230-zh-rTW/strings.xml new file mode 100644 index 0000000000000..fd82191feaa0e --- /dev/null +++ b/core/res/res/values-mcc230-zh-rTW/strings.xml @@ -0,0 +1,5 @@ + + + "cs_cz" + diff --git a/core/res/res/values-mcc232-cs/strings.xml b/core/res/res/values-mcc232-cs/strings.xml new file mode 100644 index 0000000000000..1376f0ccf6b59 --- /dev/null +++ b/core/res/res/values-mcc232-cs/strings.xml @@ -0,0 +1,5 @@ + + + "de_at" + diff --git a/core/res/res/values-mcc232-de/strings.xml b/core/res/res/values-mcc232-de/strings.xml index 0a20691bfe540..1376f0ccf6b59 100644 --- a/core/res/res/values-mcc232-de/strings.xml +++ b/core/res/res/values-mcc232-de/strings.xml @@ -1,6 +1,5 @@ - - + "de_at" diff --git a/core/res/res/values-mcc232-es/strings.xml b/core/res/res/values-mcc232-es/strings.xml new file mode 100644 index 0000000000000..1376f0ccf6b59 --- /dev/null +++ b/core/res/res/values-mcc232-es/strings.xml @@ -0,0 +1,5 @@ + + + "de_at" + diff --git a/core/res/res/values-mcc232-fr/strings.xml b/core/res/res/values-mcc232-fr/strings.xml index 0a20691bfe540..1376f0ccf6b59 100644 --- a/core/res/res/values-mcc232-fr/strings.xml +++ b/core/res/res/values-mcc232-fr/strings.xml @@ -1,6 +1,5 @@ - - + "de_at" diff --git a/core/res/res/values-mcc232-it/strings.xml b/core/res/res/values-mcc232-it/strings.xml index 0a20691bfe540..1376f0ccf6b59 100644 --- a/core/res/res/values-mcc232-it/strings.xml +++ b/core/res/res/values-mcc232-it/strings.xml @@ -1,6 +1,5 @@ - - + "de_at" diff --git a/core/res/res/values-mcc232-ja/strings.xml b/core/res/res/values-mcc232-ja/strings.xml index 0a20691bfe540..1376f0ccf6b59 100644 --- a/core/res/res/values-mcc232-ja/strings.xml +++ b/core/res/res/values-mcc232-ja/strings.xml @@ -1,6 +1,5 @@ - - + "de_at" diff --git a/core/res/res/values-mcc232-nl/strings.xml b/core/res/res/values-mcc232-nl/strings.xml new file mode 100644 index 0000000000000..1376f0ccf6b59 --- /dev/null +++ b/core/res/res/values-mcc232-nl/strings.xml @@ -0,0 +1,5 @@ + + + "de_at" + diff --git a/core/res/res/values-mcc232-pl/strings.xml b/core/res/res/values-mcc232-pl/strings.xml new file mode 100644 index 0000000000000..1376f0ccf6b59 --- /dev/null +++ b/core/res/res/values-mcc232-pl/strings.xml @@ -0,0 +1,5 @@ + + + "de_at" + diff --git a/core/res/res/values-mcc232-ru/strings.xml b/core/res/res/values-mcc232-ru/strings.xml new file mode 100644 index 0000000000000..1376f0ccf6b59 --- /dev/null +++ b/core/res/res/values-mcc232-ru/strings.xml @@ -0,0 +1,5 @@ + + + "de_at" + diff --git a/core/res/res/values-mcc232-zh-rCN/strings.xml b/core/res/res/values-mcc232-zh-rCN/strings.xml index 0a20691bfe540..1376f0ccf6b59 100644 --- a/core/res/res/values-mcc232-zh-rCN/strings.xml +++ b/core/res/res/values-mcc232-zh-rCN/strings.xml @@ -1,6 +1,5 @@ - - + "de_at" diff --git a/core/res/res/values-mcc232-zh-rTW/strings.xml b/core/res/res/values-mcc232-zh-rTW/strings.xml new file mode 100644 index 0000000000000..1376f0ccf6b59 --- /dev/null +++ b/core/res/res/values-mcc232-zh-rTW/strings.xml @@ -0,0 +1,5 @@ + + + "de_at" + diff --git a/core/res/res/values-mcc234-cs/strings.xml b/core/res/res/values-mcc234-cs/strings.xml new file mode 100644 index 0000000000000..44a78410acf69 --- /dev/null +++ b/core/res/res/values-mcc234-cs/strings.xml @@ -0,0 +1,5 @@ + + + "en_gb" + diff --git a/core/res/res/values-mcc234-de/strings.xml b/core/res/res/values-mcc234-de/strings.xml index 44a7f03443db2..44a78410acf69 100644 --- a/core/res/res/values-mcc234-de/strings.xml +++ b/core/res/res/values-mcc234-de/strings.xml @@ -1,6 +1,5 @@ - - + "en_gb" diff --git a/core/res/res/values-mcc234-es/strings.xml b/core/res/res/values-mcc234-es/strings.xml new file mode 100644 index 0000000000000..44a78410acf69 --- /dev/null +++ b/core/res/res/values-mcc234-es/strings.xml @@ -0,0 +1,5 @@ + + + "en_gb" + diff --git a/core/res/res/values-mcc234-fr/strings.xml b/core/res/res/values-mcc234-fr/strings.xml index 44a7f03443db2..44a78410acf69 100644 --- a/core/res/res/values-mcc234-fr/strings.xml +++ b/core/res/res/values-mcc234-fr/strings.xml @@ -1,6 +1,5 @@ - - + "en_gb" diff --git a/core/res/res/values-mcc234-it/strings.xml b/core/res/res/values-mcc234-it/strings.xml index 44a7f03443db2..44a78410acf69 100644 --- a/core/res/res/values-mcc234-it/strings.xml +++ b/core/res/res/values-mcc234-it/strings.xml @@ -1,6 +1,5 @@ - - + "en_gb" diff --git a/core/res/res/values-mcc234-ja/strings.xml b/core/res/res/values-mcc234-ja/strings.xml index 44a7f03443db2..44a78410acf69 100644 --- a/core/res/res/values-mcc234-ja/strings.xml +++ b/core/res/res/values-mcc234-ja/strings.xml @@ -1,6 +1,5 @@ - - + "en_gb" diff --git a/core/res/res/values-mcc234-nl/strings.xml b/core/res/res/values-mcc234-nl/strings.xml new file mode 100644 index 0000000000000..44a78410acf69 --- /dev/null +++ b/core/res/res/values-mcc234-nl/strings.xml @@ -0,0 +1,5 @@ + + + "en_gb" + diff --git a/core/res/res/values-mcc234-pl/strings.xml b/core/res/res/values-mcc234-pl/strings.xml new file mode 100644 index 0000000000000..44a78410acf69 --- /dev/null +++ b/core/res/res/values-mcc234-pl/strings.xml @@ -0,0 +1,5 @@ + + + "en_gb" + diff --git a/core/res/res/values-mcc234-ru/strings.xml b/core/res/res/values-mcc234-ru/strings.xml new file mode 100644 index 0000000000000..44a78410acf69 --- /dev/null +++ b/core/res/res/values-mcc234-ru/strings.xml @@ -0,0 +1,5 @@ + + + "en_gb" + diff --git a/core/res/res/values-mcc234-zh-rCN/strings.xml b/core/res/res/values-mcc234-zh-rCN/strings.xml index 44a7f03443db2..44a78410acf69 100644 --- a/core/res/res/values-mcc234-zh-rCN/strings.xml +++ b/core/res/res/values-mcc234-zh-rCN/strings.xml @@ -1,6 +1,5 @@ - - + "en_gb" diff --git a/core/res/res/values-mcc234-zh-rTW/strings.xml b/core/res/res/values-mcc234-zh-rTW/strings.xml new file mode 100644 index 0000000000000..44a78410acf69 --- /dev/null +++ b/core/res/res/values-mcc234-zh-rTW/strings.xml @@ -0,0 +1,5 @@ + + + "en_gb" + diff --git a/core/res/res/values-mcc260-cs/strings.xml b/core/res/res/values-mcc260-cs/strings.xml new file mode 100644 index 0000000000000..2e40a50278bd5 --- /dev/null +++ b/core/res/res/values-mcc260-cs/strings.xml @@ -0,0 +1,5 @@ + + + "pl_pl" + diff --git a/core/res/res/values-mcc260-de/strings.xml b/core/res/res/values-mcc260-de/strings.xml new file mode 100644 index 0000000000000..2e40a50278bd5 --- /dev/null +++ b/core/res/res/values-mcc260-de/strings.xml @@ -0,0 +1,5 @@ + + + "pl_pl" + diff --git a/core/res/res/values-mcc260-es/strings.xml b/core/res/res/values-mcc260-es/strings.xml new file mode 100644 index 0000000000000..2e40a50278bd5 --- /dev/null +++ b/core/res/res/values-mcc260-es/strings.xml @@ -0,0 +1,5 @@ + + + "pl_pl" + diff --git a/core/res/res/values-mcc260-fr/strings.xml b/core/res/res/values-mcc260-fr/strings.xml index ddf5b9f3a0940..2e40a50278bd5 100644 --- a/core/res/res/values-mcc260-fr/strings.xml +++ b/core/res/res/values-mcc260-fr/strings.xml @@ -1,6 +1,5 @@ - - + "pl_pl" diff --git a/core/res/res/values-mcc260-it/strings.xml b/core/res/res/values-mcc260-it/strings.xml index ddf5b9f3a0940..2e40a50278bd5 100644 --- a/core/res/res/values-mcc260-it/strings.xml +++ b/core/res/res/values-mcc260-it/strings.xml @@ -1,6 +1,5 @@ - - + "pl_pl" diff --git a/core/res/res/values-mcc260-ja/strings.xml b/core/res/res/values-mcc260-ja/strings.xml new file mode 100644 index 0000000000000..2e40a50278bd5 --- /dev/null +++ b/core/res/res/values-mcc260-ja/strings.xml @@ -0,0 +1,5 @@ + + + "pl_pl" + diff --git a/core/res/res/values-mcc260-nl/strings.xml b/core/res/res/values-mcc260-nl/strings.xml new file mode 100644 index 0000000000000..2e40a50278bd5 --- /dev/null +++ b/core/res/res/values-mcc260-nl/strings.xml @@ -0,0 +1,5 @@ + + + "pl_pl" + diff --git a/core/res/res/values-mcc260-pl/strings.xml b/core/res/res/values-mcc260-pl/strings.xml new file mode 100644 index 0000000000000..2e40a50278bd5 --- /dev/null +++ b/core/res/res/values-mcc260-pl/strings.xml @@ -0,0 +1,5 @@ + + + "pl_pl" + diff --git a/core/res/res/values-mcc260-ru/strings.xml b/core/res/res/values-mcc260-ru/strings.xml new file mode 100644 index 0000000000000..2e40a50278bd5 --- /dev/null +++ b/core/res/res/values-mcc260-ru/strings.xml @@ -0,0 +1,5 @@ + + + "pl_pl" + diff --git a/core/res/res/values-mcc260-zh-rCN/strings.xml b/core/res/res/values-mcc260-zh-rCN/strings.xml index ddf5b9f3a0940..2e40a50278bd5 100644 --- a/core/res/res/values-mcc260-zh-rCN/strings.xml +++ b/core/res/res/values-mcc260-zh-rCN/strings.xml @@ -1,6 +1,5 @@ - - + "pl_pl" diff --git a/core/res/res/values-mcc260-zh-rTW/strings.xml b/core/res/res/values-mcc260-zh-rTW/strings.xml new file mode 100644 index 0000000000000..2e40a50278bd5 --- /dev/null +++ b/core/res/res/values-mcc260-zh-rTW/strings.xml @@ -0,0 +1,5 @@ + + + "pl_pl" + diff --git a/core/res/res/values-mcc262-cs/strings.xml b/core/res/res/values-mcc262-cs/strings.xml new file mode 100644 index 0000000000000..c4b1b7230af09 --- /dev/null +++ b/core/res/res/values-mcc262-cs/strings.xml @@ -0,0 +1,5 @@ + + + "de_de" + diff --git a/core/res/res/values-mcc262-de/strings.xml b/core/res/res/values-mcc262-de/strings.xml index fad4872435175..c4b1b7230af09 100644 --- a/core/res/res/values-mcc262-de/strings.xml +++ b/core/res/res/values-mcc262-de/strings.xml @@ -1,6 +1,5 @@ - - + "de_de" diff --git a/core/res/res/values-mcc262-es/strings.xml b/core/res/res/values-mcc262-es/strings.xml new file mode 100644 index 0000000000000..c4b1b7230af09 --- /dev/null +++ b/core/res/res/values-mcc262-es/strings.xml @@ -0,0 +1,5 @@ + + + "de_de" + diff --git a/core/res/res/values-mcc262-fr/strings.xml b/core/res/res/values-mcc262-fr/strings.xml index fad4872435175..c4b1b7230af09 100644 --- a/core/res/res/values-mcc262-fr/strings.xml +++ b/core/res/res/values-mcc262-fr/strings.xml @@ -1,6 +1,5 @@ - - + "de_de" diff --git a/core/res/res/values-mcc262-it/strings.xml b/core/res/res/values-mcc262-it/strings.xml index fad4872435175..c4b1b7230af09 100644 --- a/core/res/res/values-mcc262-it/strings.xml +++ b/core/res/res/values-mcc262-it/strings.xml @@ -1,6 +1,5 @@ - - + "de_de" diff --git a/core/res/res/values-mcc262-ja/strings.xml b/core/res/res/values-mcc262-ja/strings.xml index fad4872435175..c4b1b7230af09 100644 --- a/core/res/res/values-mcc262-ja/strings.xml +++ b/core/res/res/values-mcc262-ja/strings.xml @@ -1,6 +1,5 @@ - - + "de_de" diff --git a/core/res/res/values-mcc262-nl/strings.xml b/core/res/res/values-mcc262-nl/strings.xml new file mode 100644 index 0000000000000..c4b1b7230af09 --- /dev/null +++ b/core/res/res/values-mcc262-nl/strings.xml @@ -0,0 +1,5 @@ + + + "de_de" + diff --git a/core/res/res/values-mcc262-pl/strings.xml b/core/res/res/values-mcc262-pl/strings.xml new file mode 100644 index 0000000000000..c4b1b7230af09 --- /dev/null +++ b/core/res/res/values-mcc262-pl/strings.xml @@ -0,0 +1,5 @@ + + + "de_de" + diff --git a/core/res/res/values-mcc262-ru/strings.xml b/core/res/res/values-mcc262-ru/strings.xml new file mode 100644 index 0000000000000..c4b1b7230af09 --- /dev/null +++ b/core/res/res/values-mcc262-ru/strings.xml @@ -0,0 +1,5 @@ + + + "de_de" + diff --git a/core/res/res/values-mcc262-zh-rCN/strings.xml b/core/res/res/values-mcc262-zh-rCN/strings.xml index fad4872435175..c4b1b7230af09 100644 --- a/core/res/res/values-mcc262-zh-rCN/strings.xml +++ b/core/res/res/values-mcc262-zh-rCN/strings.xml @@ -1,6 +1,5 @@ - - + "de_de" diff --git a/core/res/res/values-mcc262-zh-rTW/strings.xml b/core/res/res/values-mcc262-zh-rTW/strings.xml new file mode 100644 index 0000000000000..c4b1b7230af09 --- /dev/null +++ b/core/res/res/values-mcc262-zh-rTW/strings.xml @@ -0,0 +1,5 @@ + + + "de_de" + diff --git a/core/res/res/values-nl/arrays.xml b/core/res/res/values-nl/arrays.xml new file mode 100644 index 0000000000000..f9c904be4c64c --- /dev/null +++ b/core/res/res/values-nl/arrays.xml @@ -0,0 +1,4 @@ + + + diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml new file mode 100644 index 0000000000000..54a7321a8a7ce --- /dev/null +++ b/core/res/res/values-nl/strings.xml @@ -0,0 +1,724 @@ + + + "B" + "kB" + "MB" + "GB" + "TB" + "PB" + "<zonder titel>" + "…" + "(Geen telefoonnummer)" + "(Onbekend)" + "Voicemail" + "MSISDN1" + "Verbindingsprobleem of ongeldige MMI-code." + "Service is ingeschakeld." + "Service is ingeschakeld voor:" + "Service is uitgeschakeld." + "De registratie is voltooid." + "Wissen uitgevoerd." + "Onjuist wachtwoord." + "MMI voltooid." + "De oude PIN-code die u heeft ingevoerd, is onjuist." + "De PUK-code die u heeft ingevoerd, is onjuist." + "De PIN-codes die u heeft ingevoerd, komen niet overeen." + "Voer een PIN-code van 4 tot 8 cijfers in." + "Uw SIM-kaart is geblokkeerd met de PUK-code. Typ de PUK-code om de blokkering op te heffen." + "Voer de PUK2-code in om de SIM-kaart te deblokkeren." + "Inkomende beller-id" + "Uitgaande beller-id" + "Oproep doorschakelen" + "Wisselgesprek" + "Oproep blokkeren" + "Wachtwoordwijziging" + "PIN-wijziging" + "Beller-id standaard ingesteld op \'beperkt\'. Volgende oproep: beperkt." + "Beller-id standaard ingesteld op \'beperkt\'. Volgende oproep: onbeperkt." + "Beller-id standaard ingesteld op \'onbeperkt\'. Volgende oproep: beperkt." + "Beller-id standaard ingesteld op \'onbeperkt\'. Volgende oproep: onbeperkt." + "Service niet voorzien." + "De instelling voor beller-id kan niet worden gewijzigd." + "Spraak" + "Gegevens" + "FAX" + "SMS" + "Asynchroon" + "Synchroniseren" + "Pakket" + "PAD" + "{0}: niet doorgeschakeld" + "{0}: {1}" + "{0}: {1} na {2} seconden" + "{0}: niet doorgeschakeld" + "{0}: niet doorgeschakeld" + "OK" + "De webpagina bevat een fout." + "De URL kan niet worden gevonden." + "Het schema voor de siteverificatie wordt niet ondersteund." + "Verificatie mislukt." + "Verificatie via de proxyserver is mislukt." + "Er kan geen verbinding met de server worden gemaakt." + "De server kan niet communiceren. Probeer het later opnieuw." + "Er is een time-out voor de serververbinding opgetreden." + "De pagina bevat te veel serveromleidingen." + "Het protocol wordt niet ondersteund." + "Er kan geen beveiligde verbinding tot stand worden gebracht." + "De pagina kan niet worden geopend, omdat de URL ongeldig is." + "Het bestand kan niet worden geopend." + "Het opgevraagde bestand is niet gevonden." + "Er worden te veel aanvragen verwerkt. Probeer het later opnieuw." + "Synchroniseren" + "Synchroniseren" + "Te veel verwijderen voor %s." + "Telefoongeheugen is vol! Verwijder enkele bestanden om ruimte vrij te maken." + "Ik" + "Telefoonopties" + "Stille modus" + "Draadloos inschakelen" + "Draadloos uitschakelen" + "Schermblokkering" + "Uitschakelen" + "Uitschakelen..." + "Uw telefoon wordt uitgeschakeld." + "Geen recente toepassingen." + "Telefoonopties" + "Schermblokkering" + "Uitschakelen" + "Stille modus" + "Geluid is UIT" + "Geluid is AAN" + "Veilige modus" + "Services waarvoor u moet betalen" + "Toepassingen toestaan activiteiten uit te voeren waarvoor mogelijk kosten in rekening worden gebracht." + "Uw berichten" + "SMS, e-mail en andere berichten lezen en schrijven." + "Uw persoonlijke informatie" + "Rechtstreekse toegang tot de op uw telefoon opgeslagen contactpersonen en agenda." + "Uw locatie" + "Uw fysieke locatie bijhouden" + "Netwerkcommunicatie" + "Toepassingen toestaan verschillende netwerkfuncties te openen." + "Uw Google-accounts" + "Toegang tot de beschikbare Google-accounts." + "Bedieningselementen hardware" + "Rechtstreekse toegang tot hardware op de handset." + "Telefoonoproepen" + "Oproepen bijhouden, registreren en verwerken." + "Systeemhulpprogramma\'s" + "Toegang tot en beheer van het systeem op lager niveau." + "Ontwikkelingshulpprogramma\'s" + "Functies die alleen door toepassingsontwikkelaars worden gebruikt." + "statusbalk uitschakelen of wijzigen" + "Hiermee kan een toepassing de statusbalk uitschakelen of systeempictogrammen toevoegen en verwijderen." + "statusbalk uitvouwen/samenvouwen" + "Hiermee kan de toepassing de statusbalk uitvouwen of samenvouwen." + "uitgaande oproepen onderscheppen" + "Hiermee kan een toepassing uitgaande oproepen verwerken en het nummer wijzigen dat wordt gebeld. Schadelijke toepassingen kunnen uitgaande oproepen bijhouden, omleiden of tegenhouden." + "SMS ontvangen" + "Hiermee kan een toepassing SMS-berichten ontvangen en verwerken. Schadelijke toepassingen kunnen uw berichten bijhouden of deze verwijderen zonder dat u ze te zien krijgt." + "MMS ontvangen" + "Hiermee kan een toepassing MMS-berichten ontvangen en verwerken. Schadelijke toepassingen kunnen uw berichten bijhouden of deze verwijderen zonder dat u ze te zien krijgt." + "SMS-berichten verzenden" + "Hiermee kan de toepassing SMS-berichten verzenden. Schadelijke toepassingen kunnen u geld kosten door berichten te verzenden zonder uw toestemming." + "SMS of MMS lezen" + "Hiermee kan een toepassing de op uw telefoon of SIM-kaart opgeslagen SMS-berichten lezen. Schadelijke toepassingen kunnen uw vertrouwelijke berichten mogelijk lezen." + "SMS of MMS bewerken" + "Hiermee kan een toepassing naar de op uw telefoon of SIM-kaart opgeslagen SMS-berichten schrijven. Schadelijke toepassingen kunnen uw berichten mogelijk verwijderen." + "WAP ontvangen" + "Hiermee kan een toepassing WAP-berichten ontvangen en verwerken. Schadelijke toepassingen kunnen uw berichten bijhouden of deze verwijderen zonder dat u ze te zien krijgt." + "actieve toepassingen ophalen" + "Hiermee kan een toepassing informatie over huidige en recent uitgevoerde taken ophalen. Schadelijke toepassingen kunnen op deze manier mogelijk privé-informatie over andere toepassingen achterhalen." + "actieve toepassingen opnieuw indelen" + "Hiermee kan een toepassing taken naar de voor- en achtergrond verplaatsen. Schadelijke toepassingen kunnen zichzelf op de voorgrond plaatsen zonder dat u hier iets aan kunt doen." + "foutopsporing in toepassingen inschakelen" + "Hiermee kan een toepassing de foutopsporing voor een andere toepassing inschakelen. Schadelijke toepassingen kunnen dit gebruiken om andere toepassingen af te sluiten." + "uw UI-instellingen wijzigen" + "Hiermee kan een toepassing de huidige configuratie, zoals de landinstelling of de algemene lettergrootte, wijzigen." + "andere toepassingen opnieuw starten" + "Hiermee kan een toepassing andere toepassingen opnieuw starten." + "stoppen voorkomen" + "Hiermee kan een toepassing ervoor zorgen dat elk willekeurig proces op de voorgrond wordt uitgevoerd en dus niet kan worden afgesloten. Nooit vereist voor normale toepassingen." + "toepassing gedwongen sluiten" + "Hiermee kan een toepassing elke willekeurige activiteit die op de voorgrond wordt uitgevoerd, sluiten en naar de achtergrond verplaatsen. Nooit vereist voor normale toepassingen." + "interne systeemstatus ophalen" + "Hiermee kan een toepassing de interne status van het systeem ophalen. Schadelijke toepassingen kunnen privé- of veiligheidsgegevens ophalen die ze normaal niet nodig hebben." + "services op laag niveau publiceren" + "Hiermee kunnen toepassingen hun eigen systeemservices op laag niveau publiceren. Schadelijke toepassingen kunnen het systeem mogelijk kapen en willekeurige gegevens van het systeem stelen of beschadigen." + "alle startende toepassingen bijhouden en beheren" + "Hiermee kan een toepassing de manier waarop het systeem activiteiten start, bijhouden en beheren. Schadelijke toepassingen kunnen het systeem volledig in gevaar brengen. Deze machtiging is alleen voor ontwikkeling vereist, nooit voor normaal telefoongebruik." + "melding verzenden dat pakket is verwijderd" + "Hiermee kan een toepassing een melding verzenden dat een toepassingspakket is verwijderd. Schadelijke toepassingen kunnen hiervan gebruik maken om alle andere actieve toepassingen af te sluiten." + "melding over ontvangen SMS-bericht verzenden" + "Hiermee kan een toepassing een melding verzenden dat een SMS-bericht is ontvangen. Schadelijke toepassingen kunnen hiervan gebruik maken om inkomende SMS-berichten te vervalsen." + "melding over ontvangen WAP-PUSH-bericht verzenden" + "Hiermee kan een toepassing een melding verzenden dat een WAP PUSH-bericht is ontvangen. Schadelijke toepassingen kunnen hiervan gebruik maken om een valse MMS-ontvangst te melden of de inhoud van willekeurige webpagina\'s door schadelijke varianten te vervangen." + "aantal actieve processen beperken" + "Hiermee kan een toepassing het maximum aantal processen bepalen dat wordt uitgevoerd. Nooit vereist voor normale toepassingen." + "alle achtergrondtoepassingen sluiten" + "Hiermee kan een toepassing bepalen of activiteiten altijd worden afgesloten zodra deze naar de achtergrond gaan. Nooit nodig voor normale toepassingen." + "systeemupdates automatisch installeren" + "Hiermee ontvangt een toepassing meldingen over beschikbare systeemupdates en kan hun installatie starten. Schadelijke toepassingen kunnen hiervan gebruik maken om het systeem met ongeautoriseerde updates te beschadigen of het updateproces in het algemeen te verstoren." + "accustatistieken aanpassen" + "Hiermee kunnen verzamelde accustatistieken worden gewijzigd. Niet voor gebruik door normale toepassingen." + "niet-geautoriseerde vensters weergeven" + "Hiermee kunnen vensters worden gemaakt die door de interne systeemgebruikersinterface worden gebruikt. Niet voor gebruik door normale toepassingen." + "waarschuwingen op systeemniveau weergeven" + "Hiermee kan een toepassing systeemwaarschuwingen weergeven. Schadelijke toepassingen kunnen op deze manier het hele scherm van de telefoon overnemen." + "algemene animatiesnelheid wijzigen" + "Hiermee kan een toepassing op elk gewenst moment de algemene animatiesnelheid wijzigen (snellere of tragere animaties)." + "toepassingstokens beheren" + "Hiermee kunnen toepassingen hun eigen tokens maken en beheren, waarbij de normale Z-volgorde wordt overgeslagen. Nooit nodig voor normale toepassingen." + "drukken op toetsen en bedieningselementen" + "Hiermee kan een toepassing zijn eigen invoergebeurtenissen (toetsaanslagen, enzovoort) aan andere toepassingen doorgeven. Schadelijke toepassingen kunnen dit gebruiken om de telefoon over te nemen." + "uw invoer en acties vastleggen" + "Hiermee kan een toepassing uw toetsaanslagen registreren, zelfs tijdens de interactie met een andere toepassing (zoals de invoer van een wachtwoord). Nooit vereist voor normale toepassingen." + "verbinden aan een invoermethode" + "Hiermee staat u de houder toe zich te verbinden met de hoofdinterface van een invoermethode. Nooit vereist voor normale toepassingen." + "schermstand wijzigen" + "Hiermee kan een toepassing op elk gewenst moment de oriëntatie van het scherm wijzigen. Nooit vereist voor normale toepassingen." + "Linux-signalen verzenden naar toepassingen" + "Hiermee kan de toepassing ervoor zorgen dat het geleverde signaal wordt verzonden naar alle persistente processen." + "toepassing altijd laten uitvoeren" + "Hiermee kan een toepassing delen van zichzelf persistent maken, zodat het systeem dat deel niet voor andere toepassingen kan gebruiken." + "toepassingen verwijderen" + "Hiermee kan een toepassing Android-pakketten verwijderen. Schadelijke toepassingen kunnen dit gebruiken om belangrijke toepassingen te verwijderen." + "gegevens van andere toepassingen verwijderen" + "Hiermee kan een toepassing gebruikersgegevens wissen." + "caches van andere toepassingen verwijderen" + "Hiermee kan een toepassing cachebestanden verwijderen." + "opslagruimte van toepassing bepalen" + "Hiermee kan een toepassing de bijbehorende code, gegevens en cachegrootten ophalen." + "toepassingen rechtstreeks installeren" + "Hiermee kan een toepassing nieuwe of bijgewerkte Android-pakketten installeren. Schadelijke toepassingen kunnen hiervan gebruik maken om nieuwe toepassingen met willekeurig krachtige machtigingen toe te voegen." + "alle cachegegevens van toepassing verwijderen" + "Hiermee kan een toepassing opslagruimte op de telefoon vrij maken door bestanden te verwijderen uit de cachemap van de toepassing. De toegang is doorgaans beperkt tot het systeemproces." + "systeemlogbestanden lezen" + "Hiermee kan een toepassing de verschillende logbestanden van het systeem lezen. De toepassing kan op deze manier algemene informatie achterhalen over uw telefoongebruik. Hierin is geen persoonlijke of privé-informatie opgenomen." + "lezen/schrijven naar bronnen van diag" + "Hiermee kan een toepassing lezen en schrijven naar elke bron die hoort bij de diagnostische groep, zoals bestanden in /dev. Hierdoor kan de systeemstabiliteit en -veiligheid worden beïnvloed. Dit mag ALLEEN worden gebruikt voor hardwarespecifieke diagnostiek door de fabrikant of operator." + "toepassingscomponenten in- of uitschakelen" + "Hiermee kan een toepassing bepalen of een component van een andere toepassing is ingeschakeld. Schadelijke toepassingen kunnen hiervan gebruik maken om belangrijke telefoonfuncties uit te schakelen. Een machtiging moet zorgvuldig worden overwogen, aangezien toepassingscomponenten onbruikbaar, inconsistent of instabiel kunnen worden." + "voorkeurstoepassingen instellen" + "Hiermee kan een toepassing uw voorkeurstoepassingen wijzigen. Schadelijke toepassingen kunnen op deze manier de actieve toepassingen zonder uw medeweten wijzigen en uw bestaande toepassingen doorzoeken om privégegevens van u te verzamelen." + "algemene systeeminstellingen wijzigen" + "Hiermee kan een toepassing de systeeminstellingen wijzigen. Schadelijke toepassingen kunnen hiermee uw systeemconfiguratie beschadigen." + "beveiligde systeeminstellingen wijzigen" + "Hiermee kan een toepassing beveiligde systeeminstellingen wijzigen. Niet voor gebruik door normale toepassingen." + "de Google-serviceskaart wijzigen" + "Hiermee kan een toepassing de Google-serviceskaart wijzigen. Niet voor gebruik door normale toepassingen." + "automatisch starten bij opstarten" + "Hiermee kan een toepassing zichzelf starten zodra het systeem klaar is met opstarten. Hierdoor kan het langer duren voordat de telefoon is opgestart en kan de toepassing de telefoonprocessen vertragen door altijd actief te zijn." + "sticky broadcast verzenden" + "Hiermee kan een toepassing sticky broadcasts verzenden die achterblijven als de broadcast eindigt. Schadelijke toepassingen kunnen hiermee de telefoon traag of instabiel maken door ervoor te zorgen dat er te veel geheugenruimte wordt gebruikt." + "contactgegevens lezen" + "Hiermee kan een toepassing alle contactgegevens (adresgegevens) zien die op uw telefoon zijn opgeslagen. Schadelijke toepassingen kunnen hiervan gebruik maken om uw gegevens te verzenden naar andere personen." + "contactgegevens schrijven" + "Hiermee kan een toepassing de op uw telefoon opgeslagen contactgegevens (adresgegevens) wijzigen. Schadelijke toepassingen kunnen hiermee uw contactgegevens verwijderen of wijzigen." + "gegevens eigenaar schrijven" + "Hiermee kan een toepassing de op uw telefoon opgeslagen gegevens van de eigenaar wijzigen. Schadelijke toepassingen kunnen hiermee gegevens van de eigenaar verwijderen of wijzigen." + "gegevens eigenaar lezen" + "Hiermee kan een toepassing de op uw telefoon opgeslagen gegevens van de eigenaar lezen. Schadelijke toepassingen kunnen hiermee gegevens van de eigenaar lezen." + "agendagegevens lezen" + "Hiermee kan een toepassing alle agendagebeurtenissen lezen die zijn opgeslagen op uw telefoon. Schadelijke toepassingen kunnen hiervan gebruik maken om uw agendagebeurtenissen te verzenden naar andere personen." + "agendagegevens schrijven" + "Hiermee kan een toepassing de op uw telefoon opgeslagen agendagebeurtenissen wijzigen. Schadelijke toepassingen kunnen hiermee uw agendagegevens verwijderen of wijzigen." + "neplocatiebronnen voor test" + "Neplocatiebronnen voor testdoeleinden maken. Schadelijke toepassingen kunnen dit gebruiken om de locatie en/of status te overschrijven die door de echte locatiebronnen wordt aangegeven, zoals GPS of netwerkaanbieders." + "toegang opdrachten aanbieder extra locaties" + "Toegang tot opdrachten aanbieder extra locaties. Schadelijke toepassingen kunnen hiervan gebruik maken om de werking van GPS of andere locatiebronnen te verstoren." + "nauwkeurige (GPS) locatie" + "Toegang tot exacte locatiebronnen, zoals het Global Positioning System op de telefoon, indien beschikbaar. Schadelijke toepassingen kunnen dit gebruiken om te bepalen waar u zich bevindt en mogelijk extra acculading verbruiken." + "globale (netwerkgebaseerde) locatie" + "Toegang tot globale locatiebronnen, zoals de mobiele netwerkdatabase om een globale telefoonlocatie te bepalen, indien beschikbaar. Schadelijke toepassingen kunnen hiervan gebruik maken om bij benadering te bepalen waar u zich bevindt." + "toegang tot SurfaceFlinger" + "Hiermee kan een toepassing SurfaceFlinger-functies op laag niveau gebruiken." + "framebuffer lezen" + "Hiermee kan een toepassing de inhoud van de framebuffer lezen." + "uw audio-instellingen wijzigen" + "Hiermee kan een toepassing de algemene audio-instellingen, zoals volume en omleiding, wijzigen." + "audio opnemen" + "Hiermee krijgt de toepassing toegang tot het audio-opnamepad." + "foto\'s maken" + "Hiermee kan een toepassing foto\'s maken met de camera. De toepassing kan op deze manier op elk gewenste moment foto\'s verzamelen van wat de camera ziet." + "telefoon permanent uitschakelen" + "Hiermee kan de toepassing de telefoon permanent uitschakelen. Dit is erg gevaarlijk." + "telefoon gedwongen opnieuw opstarten" + "Hiermee kan de toepassing de telefoon gedwongen opnieuw opstarten." + "bestandssystemen koppelen en ontkoppelen" + "Hiermee kan de toepassing bestandssystemen koppelen en ontkoppelen voor verwisselbare opslagruimte." + "trilstand beheren" + "Hiermee kan de toepassing de trilstand beheren." + "zaklamp bedienen" + "Hiermee kan de toepassing de zaklamp bedienen." + "hardware testen" + "Hiermee kan de toepassing verschillende randapparaten beheren om de hardware te testen." + "telefoonnummers rechtstreeks bellen" + "Hiermee kan de toepassing telefoonnummers bellen zonder uw tussenkomst. Door schadelijke toepassingen kunnen onverwachte oproepen op uw telefoonrekening verschijnen. De toepassing kan hiermee geen alarmnummers bellen." + "alle telefoonnummers rechtstreeks bellen" + "Hiermee kan een toepassing elk telefoonnummer, inclusief alarmnummers, bellen zonder uw tussenkomst. Schadelijke toepassingen kunnen onnodige en illegale oproepen uitvoeren naar alarmdiensten." + "meldingen over locatie-updates beheren" + "Hiermee kunnen updatemeldingen voor locaties van de radio worden ingeschakeld/uitgeschakeld. Niet voor gebruik door normale toepassingen." + "toegang tot checkin-eigenschappen" + "Hiermee wordt lees-/schrijftoegang gegeven tot eigenschappen die door de checkin-service zijn geüpload. Niet voor gebruik door normale toepassingen." + "telefoonstatus wijzigen" + "Hiermee kan de toepassing de telefoonfuncties van het apparaat beheren. Een toepassing met deze machtiging kan schakelen tussen netwerken, de radio van de telefoon in- of uitschakelen en dergelijke zonder dat u hiervan op de hoogte wordt gesteld." + "telefoonstatus lezen" + "Hiermee krijgt de toepassing toegang tot de telefoonfuncties van het apparaat. Een toepassing met de betreffende machtiging kan het telefoonnummer van deze telefoon achterhalen, bepalen of een oproep actief is, het gekozen nummer achterhalen en dergelijke." + "voorkomen dat telefoon overschakelt naar slaapmodus" + "Hiermee kan een toepassing voorkomen dat de telefoon overschakelt naar de slaapmodus." + "telefoon in- of uitschakelen" + "Hiermee kan de toepassing de telefoon in- of uitschakelen." + "uitvoeren in fabriekstestmodus" + "Uitvoeren als fabrikanttest op laag niveau, waardoor toegang wordt gegeven tot de hardware van de telefoon. Alleen beschikbaar als een telefoon zich in de fabrikanttestmodus bevindt." + "achtergrond instellen" + "Hiermee kan de toepassing de systeemachtergrond instellen." + "grootte achtergrond instellen" + "Hiermee kan de toepassing de grootte van de achtergrond instellen." + "systeem terugzetten op fabrieksinstellingen" + "Hiermee kan een toepassing het systeem terugzetten op de fabrieksinstellingen, waarbij alle gegevens, configuraties en geïnstalleerde toepassingen worden verwijderd." + "tijdzone instellen" + "Hiermee kan een toepassing de tijdzone van de telefoon wijzigen." + "bekende accounts zoeken" + "Hiermee kan een toepassing de lijst met accounts van een telefoon ophalen." + "netwerkstatus bekijken" + "Hiermee kan een toepassing de status van alle netwerken bekijken." + "volledige internettoegang" + "Hiermee kan een toepassing netwerksockets maken." + "instellingen voor toegangspuntnaam schrijven" + "Hiermee kan een toepassing de APN-instellingen, zoals proxy en poort, van elke APN wijzigen." + "netwerkverbinding wijzigen" + "Hiermee kan een toepassing de verbindingsstatus van het netwerk wijzigen." + "Wi-Fi-status bekijken" + "Hiermee kan een toepassing informatie over de Wi-Fi-status bekijken." + "Wi-Fi-status wijzigen" + "Hiermee kan een toepassing zich koppelen aan en loskoppelen van Wi-Fi toegangspunten en wijzigingen aanbrengen in geconfigureerde Wi-Fi-netwerken." + "bluetooth-beheer" + "Hiermee kan een toepassing de lokale Bluetooth-telefoon configureren en externe apparaten zoeken en aansluiten." + "Bluetooth-verbindingen maken" + "Hiermee kan een toepassing de configuratie van een lokale Bluetooth-telefoon bekijken en verbindingen met gekoppelde apparaten maken en accepteren." + "toetsblokkering uitschakelen" + "Hiermee kan een toepassing de toetsblokkering en bijbehorende wachtwoordbeveiliging uitschakelen. Een voorbeeld: de telefoon schakelt de toetsblokkering uit als er een oproep binnenkomt en schakelt de toetsblokkering weer in als de oproep is beëindigd." + "synchronisatie-instellingen lezen" + "Hiermee kan een toepassing de synchronisatie-instellingen lezen, bijvoorbeeld of de synchronisatie van contactpersonen is ingeschakeld." + "synchronisatie-instellingen schrijven" + "Hiermee kan een toepassing uw synchronisatie-instellingen wijzigen, bijvoorbeeld of de synchronisatie van contactpersonen is ingeschakeld." + "synchronisatiestatistieken lezen" + "Hiermee kan een toepassing de synchronisatiestatistieken lezen, zoals de geschiedenis van uitgevoerde synchronisaties." + "geabonneerde feeds lezen" + "Hiermee kan een toepassing details over de huidige gesynchroniseerde feeds achterhalen." + "geabonneerde feeds schrijven" + "Hiermee kan een toepassing uw huidige gesynchroniseerde feeds wijzigen. Een schadelijke toepassing kan op deze manier uw gesynchroniseerde feeds wijzigen." + + "Thuis" + "Mobiel" + "Werk" + "Fax werk" + "Fax thuis" + "Semafoon" + "Overig" + "Aangepast" + + + "Thuis" + "Werk" + "Overig" + "Aangepast" + + + "Thuis" + "Werk" + "Overig" + "Aangepast" + + + "Thuis" + "Werk" + "Overig" + "Aangepast" + + + "Werk" + "Overig" + "Aangepast" + + + "AIM" + "Windows Live" + "Yahoo" + "Skype" + "QQ" + "Google Talk" + "ICQ" + "Jabber" + + "PIN-code invoeren" + "Onjuiste PIN-code!" + "Druk op \'Menu\' en vervolgens op 0 om te deblokkeren." + "Alarmnummer" + "(Geen service)" + "Scherm geblokkeerd." + "Druk op \'Menu\' om te deblokkeren of noodoproep te plaatsen." + "Druk op \'Menu\' om te deblokkeren." + "Patroon tekenen om te deblokkeren" + "Noodoproep" + "Juist!" + "Probeer het opnieuw" + "Opladen (%d%%)" + "Sluit de oplader aan." + "Geen SIM-kaart." + "Geen SIM-kaart in telefoon." + "Plaats een SIM-kaart." + "Netwerk geblokkeerd" + "SIM-kaart is geblokkeerd met PUK-code." + "Neem contact op met de klantenservice." + "SIM-kaart is geblokkeerd." + "SIM-kaart deblokkeren..." + "U heeft uw deblokkeringspatroon %d keer onjuist getekend. "\n\n"Probeer het over %d seconden opnieuw." + "U heeft uw deblokkeringspatroon %d keer onjuist getekend. Na nog eens %d mislukte pogingen, wordt u gevraagd om uw telefoon te deblokkeren met uw Google aanmelding."\n\n" Probeer het over %d seconden opnieuw." + "Probeer het over %d seconden opnieuw." + "Patroon vergeten?" + "Te veel patroonpogingen!" + "U moet zich aanmelden bij uw Google-account"\n"om te deblokkeren" + "Gebruikersnaam (e-mail)" + "Wachtwoord" + "Aanmelden" + "Gebruikersnaam of wachtwoord ongeldig." + "h:mm AA" + "%-l:%M%P" + "%-l:%M%p" + + + + + "Meldingen wissen" + "Geen meldingen" + "Actief" + "Meldingen" + + + "Opladen..." + "Sluit de oplader aan" + "De accu raakt op:" + "minder dan %d%% resterend." + "Fabriekstest mislukt" + "De actie FACTORY_TEST wordt alleen ondersteund voor pakketten die zijn geïnstalleerd in /system/app." + "Er is geen pakket gevonden dat de actie FACTORY_TEST levert." + "Opnieuw opstarten" + "Bevestigen" + "Wilt u dat de browser dit wachtwoord onthoudt?" + "Niet nu" + "Onthouden" + "Nooit" + "U heeft geen toestemming om deze pagina te openen." + "Tekst naar klembord gekopieerd." + "Meer" + "Menu+" + "ruimte" + "invoeren" + "verwijderen" + "Zoeken" + "Vandaag" + "Gisteren" + "Morgen" + "1 maand geleden" + "Meer dan 1 maand geleden" + + "1 seconde geleden" + "%d seconden geleden" + + + "1 minuut geleden" + "%d minuten geleden" + + + "1 uur geleden" + "%d uur geleden" + + + "gisteren" + "%d dagen geleden" + + + "over 1 seconde" + "over %d seconden" + + + "over 1 minuut" + "over %d minuten" + + + "over 1 uur" + "over %d uur" + + + "morgen" + "over %d dagen" + + + + + + + + + + + + + + + + + + "op %s" + "om %s" + "in %s" + "dag" + "dagen" + "uur" + "uren" + "min" + "minuten" + "sec" + "seconden" + "week" + "weken" + "jaar" + "jaren" + "Zondag" + "Maandag" + "Dinsdag" + "Woensdag" + "Donderdag" + "Vrijdag" + "Zaterdag" + "Elke weekdag (ma-vr)" + "Dagelijks" + "Wekelijks op %s" + "Maandelijks" + "Jaarlijks" + "Video kan niet worden afgespeeld" + "Deze video kan niet worden afgespeeld." + "OK" + "am" + "pm" + "%m/%d/%Y" + "%1$s, %2$s, %3$s%4$s, %5$s, %6$s" + "%1$s, %2$s%4$s, %5$s" + "%2$s, %3$s%5$s, %6$s" + "%2$s%5$s" + "%1$s%2$s" + "%1$s, %2$s, %3$s" + "%2$s, %3$s" + "%1$s, %3$s" + + + + + "%1$s, %2$s" + "MMMM dd, yyyy" + "dd MMMM, yyyy" + "MMM dd, yyyy" + "dd MMM, yyyy" + "h:mm a" + "H:mm" + "twaalf uur \'s middags" + "Twaalf uur \'s middags" + "middernacht" + "Middernacht" + + + + + "%B %-d, %Y" + + + "%H:%M:%S" + "%H:%M:%S %B %-d, %Y" + "%2$s %3$s%7$s %8$s" + "%1$s, %2$s %3$s%6$s, %7$s %8$s" + "%2$s %3$s%7$s %8$s, %9$s" + "%1$s, %2$s %3$s%6$s, %7$s %8$s, %9$s" + "%2$s %3$s, %5$s%7$s %8$s, %10$s" + "%1$s, %2$s %3$s, %5$s%6$s, %7$s %8$s, %10$s" + "%2$s %3$s, %4$s, %5$s%7$s %8$s, %9$s, %10$s" + "%1$s, %2$s %3$s, %4$s, %5$s%6$s, %7$s %8$s, %9$s, %10$s" + "%2$s/%3$s%7$s/%8$s" + "%1$s, %2$s/%3$s%6$s, %7$s/%8$s" + "%2$s/%3$s/%4$s%7$s/%8$s/%9$s" + "%1$s, %2$s/%3$s/%4$s%6$s, %7$s/%8$s/%9$s" + "%2$s/%3$s, %5$s%7$s/%8$s, %10$s" + "%1$s, %2$s/%3$s, %5$s%6$s, %7$s/%8$s, %10$s" + "%2$s/%3$s/%4$s, %5$s%7$s/%8$s/%9$s, %10$s" + "%1$s, %2$s/%3$s/%4$s, %5$s%6$s, %7$s/%8$s/%9$s, %10$s" + "%2$s %3$s%8$s" + "%1$s, %2$s %3$s%6$s, %7$s %8$s" + "%2$s %3$s%8$s, %9$s" + "%1$s, %2$s %3$s, %4$s%6$s, %7$s %8$s, %9$s" + "%2$s %3$s, %5$s%7$s %8$s, %10$s" + "%1$s, %2$s %3$s, %5$s%6$s, %7$s %8$s, %10$s" + "%2$s %3$s, %4$s, %5$s%7$s %8$s, %9$s, %10$s" + "%1$s, %2$s %3$s, %4$s, %5$s%6$s, %7$s %8$s, %9$s, %10$s" + "%b %-d, %Y" + + + + + + + "Zondag" + "Maandag" + "Dinsdag" + "Woensdag" + "Donderdag" + "Vrijdag" + "Zaterdag" + "Zo" + "Ma" + "Di" + "Wo" + "Do" + "Vr" + "Za" + "Zo" + "Ma" + "Di" + "Wo" + "Do" + "Vr" + "Za" + "Zo" + "M" + "Di" + "W" + "Do" + "V" + "Za" + "Z" + "M" + "D" + "W" + "D" + "V" + "Z" + "Januari" + "Februari" + "Maart" + "April" + "Mei" + "Juni" + "Juli" + "Augustus" + "September" + "Oktober" + "November" + "December" + "Jan" + "Feb" + "Mrt" + "Apr" + "Mei" + "Jun" + "Jul" + "Aug" + "Sep" + "Okt" + "Nov" + "Dec" + "J" + "V" + "M" + "A" + "M" + "J" + "J" + "A" + "S" + "O" + "N" + "D" + "%1$02d:%2$02d" + "%1$d:%2$02d:%3$02d" + "Alles selecteren" + "Tekst selecteren" + "Stoppen met tekst selecteren" + "Knippen" + "Alles knippen" + "Kopiëren" + "Alles kopiëren" + "Plakken" + "URL kopiëren" + "Invoermethode" + "Tekst bewerken" + "Weinig ruimte" + "Opslagruimte van telefoon raakt op." + "OK" + "Annuleren" + "OK" + "Annuleren" + "AAN" + "UIT" + "Actie voltooien met" + "Standaard gebruiken voor deze actie." + "Wis standaardinstelling via startscherm: \'Instellingen\' > \'Toepassingen\' > \'Toepassingen beheren\'." + "Een actie selecteren" + "Geen enkele toepassing kan deze actie uitvoeren." + "Helaas!" + "De toepassing %1$s (proces %2$s) is onverwachts gestopt. Probeer het opnieuw." + "Het proces %1$s is onverwachts gestopt. Probeer het opnieuw." + "Helaas!" + "Activiteit %1$s (in toepassing %2$s) reageert niet." + "Activiteit %1$s (in proces %2$s) reageert niet." + "Toepassing %1$s (in proces %2$s) reageert niet." + "Proces %1$s reageert niet." + "Gedwongen sluiten" + "Wachten" + "Foutopsporing" + "Selecteer een actie voor tekst" + "Belvolume" + "Mediavolume" + "Afspelen via Bluetooth" + "Volume inkomende oproep" + "Afspelen via Bluetooth" + "Alarmvolume" + "Meldingsvolume" + "Volume" + "Standaardbeltoon" + "Standaardbeltoon (%1$s)" + "Stil" + "Beltonen" + "Onbekende beltoon" + + "Wi-Fi-netwerk beschikbaar" + "Wi-Fi-netwerken beschikbaar" + + + "Open Wi-Fi-netwerk beschikbaar" + "Open Wi-Fi-netwerken beschikbaar" + + "Teken invoegen" + "Onbekende toepassing" + "SMS-berichten verzenden" + "Er wordt een groot aantal SMS-berichten verzonden. Selecteer \'OK\' om door te gaan of \'Annuleren\' om de verzending te stoppen." + "OK" + "Annuleren" + "Instellen" + "Standaard" + "Geen machtigingen vereist" + "Verbergen" + "Alles weergeven" + "Laden..." + "USB-verbinding" + "U heeft uw telefoon via USB op uw computer aangesloten. Selecteer \'Koppelen\' als u bestanden tussen uw computer en de SD-kaart van uw telefoon wilt kopiëren." + "Koppelen" + "Niet koppelen" + "Er is een probleem bij het gebruik van uw SD-kaart voor USB-opslag." + "USB-verbinding" + "Selecteer dit om bestanden naar/van uw computer te kopiëren." + "Invoermethode selecteren" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "kandidaten""u>" + diff --git a/core/res/res/values-pl/arrays.xml b/core/res/res/values-pl/arrays.xml new file mode 100644 index 0000000000000..f9c904be4c64c --- /dev/null +++ b/core/res/res/values-pl/arrays.xml @@ -0,0 +1,4 @@ + + + diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml new file mode 100644 index 0000000000000..c3cf8a1f3de62 --- /dev/null +++ b/core/res/res/values-pl/strings.xml @@ -0,0 +1,724 @@ + + + "B" + "KB" + "MB" + "GB" + "TB" + "PB" + "<bez nazwy>" + "…" + "(Brak numeru telefonu)" + "(Nieznany)" + "Poczta głosowa" + "MSISDN1" + "Problem z połączeniem lub błędny kod MMI." + "Usługa była włączona." + "Usługa została włączona dla:" + "Usługa została wyłączona." + "Rejestracja powiodła się." + "Wymazywanie zakończone pomyślnie." + "Błędne hasło." + "MMI zakończone." + "Wprowadzony stary kod PIN jest nieprawidłowy." + "Wprowadzony kod PUK jest nieprawidłowy." + "Wprowadzone kody PIN nie są identyczne." + "Wpisz kod PIN o długości od 4 do 8 cyfr." + "Karta SIM jest zablokowana kodem PUK. Wprowadź kod PUK, aby odblokować kartę." + "Wprowadź kod PUK2, aby odblokować kartę SIM." + "Identyfikator dzwoniącego przy połączeniach przychodzących" + "Identyfikator dzwoniącego przy połączeniach wychodzących" + "Przekierowanie połączeń" + "Połączenie oczekujące" + "Blokada dzwonienia" + "Zmiana hasła" + "Zmiana kodu PIN" + "Identyfikator dzwoniącego ustawiony jest domyślnie na „zastrzeżony”. Następne połączenie: zastrzeżony" + "Identyfikator dzwoniącego ustawiony jest domyślnie na „zastrzeżony”. Następne połączenie: nie zastrzeżony" + "Identyfikator dzwoniącego ustawiony jest domyślnie na „nie zastrzeżony”. Następne połączenie: zastrzeżony" + "Identyfikator dzwoniącego ustawiony jest domyślnie na „nie zastrzeżony”. Następne połączenie: nie zastrzeżony" + "Usługa nie jest świadczona." + "Nie można zmienić ustawienia identyfikatora dzwoniącego." + "Głos" + "Dane" + "FAKS" + "SMS" + "Dane asynchroniczne" + "Synchronizacja" + "Pakiet" + "PAD" + "{0}: nieprzekierowane" + "{0}: {1}" + "{0}: {1} po {2} sekundach" + "{0}: nieprzekierowane" + "{0}: nieprzekierowane" + "OK" + "Strona sieci Web zawiera błąd." + "Nie można odszukać adresu URL." + "Schemat uwierzytelniania strony nie jest obsługiwany." + "Nieudane uwierzytelnianie." + "Autoryzacja przez serwer proxy zakończyła się niepowodzeniem." + "Nieudane połączenie z serwerem." + "Nie udało się połączyć z serwerem. Spróbuj ponownie później." + "Zbyt długi czas oczekiwania na połączenie z serwerem." + "Strona zawiera zbyt wiele przekierowań do serwerów." + "Protokół nie jest obsługiwany" + "Nie można ustanowić bezpiecznego połączenia." + "Nie można otworzyć strony, ponieważ adres URL jest nieprawidłowy." + "Nie można uzyskać dostępu do pliku." + "Nie znaleziono żądanego pliku." + "Zbyt wiele żądań jest przetwarzanych. Spróbuj ponownie później." + "Synchronizacja" + "Synchronizuj" + "Zbyt wiele usuwanych %s." + "Pamięć telefonu jest pełna! Usuń niektóre pliki, aby zwolnić miejsce." + "Ja" + "Opcje telefonu" + "Tryb cichy" + "Włącz połączenia bezprzewodowe" + "Wyłącz połączenia bezprzewodowe" + "Blokada ekranu" + "Wyłącz" + "Wyłączanie..." + "Telefon zostanie wyłączony" + "Brak ostatnio używanych aplikacji." + "Opcje telefonu" + "Blokada ekranu" + "Wyłącz" + "Tryb cichy" + "Dźwięk jest wyłączony" + "Dźwięk jest włączony" + "Tryb awaryjny" + "Usługi płatne" + "Pozwól aplikacjom na wykonywanie płatnych operacji." + "Twoje wiadomości" + "Czytanie i zapisywanie wiadomości SMS, e-mail i innych" + "Informacje osobiste" + "Bezpośredni dostęp do kontaktów i kalendarza zapisanych w telefonie." + "Twoje położenie" + "Monitorowanie fizycznego położenia" + "Połączenia sieciowe" + "Pozwól aplikacjom na dostęp do różnych funkcji sieci." + "Twoje konta Google" + "Uzyskaj dostęp do dostępnych kont Google." + "Sterowanie sprzętowe" + "Bezpośredni dostęp do elementów sprzętowych telefonu." + "Połączenia telefoniczne" + "Monitorowanie, nagrywanie i przetwarzanie połączeń telefonicznych." + "Narzędzia systemowe" + "Dostęp i kontrola systemu niższego poziomu." + "Narzędzia programistyczne" + "Funkcje potrzebne jedynie programistom" + "wyłączanie lub zmienianie paska stanu" + "Pozwala aplikacjom na wyłączenie paska stanu lub dodawanie i usuwanie ikon systemowych." + "rozwijanie/zwijanie paska stanu" + "Pozwala aplikacji na rozwijanie lub zwijanie paska stanu." + "przechwytywanie połączeń wychodzących" + "Pozwala aplikacji na przetwarzanie połączeń wychodzących i zmianę wybieranego numeru. Szkodliwe aplikacje mogą monitorować, przekierowywać lub blokować połączenia wychodzące." + "odbieranie wiadomości SMS" + "Pozwala aplikacjom na odbieranie i przetwarzanie wiadomości SMS. Szkodliwe aplikacje mogą monitorować wiadomości lub usuwać je bez wyświetlania ich użytkownikowi." + "odbieranie wiadomości MMS" + "Pozwala aplikacji na odbieranie i przetwarzanie wiadomości MMS. Szkodliwe aplikacje mogą monitorować wiadomości lub usuwać je bez pokazywania ich użytkownikowi." + "wysyłanie wiadomości SMS" + "Pozwól aplikacjom na wysyłanie wiadomości SMS. Szkodliwe aplikacje mogą generować koszty, wysyłając wiadomości bez wiedzy użytkownika." + "czytanie wiadomości SMS lub MMS" + "Pozwala aplikacji na czytanie wiadomości SMS zapisanych w telefonie lub na karcie SIM. Szkodliwe aplikacje mogą czytać poufne wiadomości." + "edytowanie wiadomości SMS lub MMS" + "Pozwala aplikacji na zapisywanie wiadomości SMS przechowywanych w telefonie lub na karcie SIM. Szkodliwe aplikacje mogą usunąć wiadomości." + "odbieranie WAP" + "Pozwala aplikacjom na odbieranie i przetwarzanie wiadomości WAP. Szkodliwe aplikacje mogą monitorować wiadomości lub usuwać je bez wyświetlania ich użytkownikowi." + "pobieranie uruchomionych aplikacji" + "Umożliwia aplikacji pobieranie informacji na temat obecnie i ostatnio uruchomionych zadań. Może pozwolić szkodliwym aplikacjom na uzyskanie prywatnych informacji na temat innych aplikacji." + "zmienianie porządku uruchomionych aplikacji" + "Pozwala aplikacji na przenoszenie zadań z tła na pierwszy plan. Szkodliwe aplikacje mogą wymusić działanie pierwszoplanowe bez kontroli użytkownika." + "włączenie debugowania aplikacji" + "Pozwala aplikacji na włączenie debugowania innej aplikacji. Szkodliwe aplikacje mogą to wykorzystać do wyłączenia innych programów." + "zmienianie ustawień interfejsu użytkownika" + "Pozwala aplikacji zmieniać bieżącą konfigurację, na przykład lokalny lub globalny rozmiar czcionki." + "resetowanie innych aplikacji" + "Pozwala aplikacji na wymuszenie ponownego uruchomienia innych aplikacji." + "zapobieganie zatrzymaniu" + "Pozwala aplikacji na uruchamianie dowolnego procesu na pierwszym planie tak, że nie można go wyłączyć. Nigdy nie powinno być potrzebne normalnym aplikacjom." + "wymuszanie zamknięcia aplikacji" + "Pozwala aplikacji na wymuszenie zamknięcia i cofnięcia dowolnej operacji działającej na pierwszym planie. Nigdy nie powinno być potrzebne normalnym aplikacjom." + "pobieranie informacji o wewnętrznym stanie systemu" + "Pozwala aplikacjom na pobieranie informacji o wewnętrznym stanie systemu. Szkodliwe aplikacje mogą pobrać szeroką gamę osobistych i zabezpieczonych informacji, które normalnie nie powinny im być nigdy potrzebne." + "publikowanie usług niskiego poziomu" + "Pozwala aplikacji na publikowanie własnych usług systemowych niskiego poziomu. Szkodliwe aplikacje mogą przejąć kontrolę nad systemem oraz wykraść lub uszkodzić znajdujące się w nim dane." + "monitorowanie i kontrolowanie wszystkich uruchamianych aplikacji" + "Pozwala aplikacji na monitorowanie i kontrolowanie sposobu, w jaki w systemie uruchamiane są różne działania. Szkodliwe aplikacje mogą całkowicie przejąć system. Te uprawnienia potrzebne są tylko programistom, nigdy w przypadku normalnego wykorzystywania telefonu." + "wysyłanie transmisji informującej o usuniętym pakiecie" + "Pozwala aplikacji na wysyłanie powiadomienia, że pakiet aplikacji został usunięty. Szkodliwe aplikacje mogą z niego skorzystać w celu wyłączania innych działających aplikacji." + "wysyłanie transmisji otrzymanych w wiadomości SMS" + "Pozwala aplikacji na wysyłanie powiadomienia, że została odebrana wiadomość SMS. Szkodliwe aplikacje mogą to wykorzystać do fałszowania przychodzących wiadomości SMS." + "wysyłanie transmisji informującej o otrzymaniu wiadomości WAP-PUSH" + "Pozwala aplikacji na nadanie powiadomienia o otrzymaniu wiadomości WAP PUSH. Szkodliwe aplikacje mogą to wykorzystać do fałszowania potwierdzenia odbioru wiadomości MMS lub do niezauważalnego podmieniania zawartości dowolnej strony internetowej jej szkodliwymi wariantami." + "ograniczanie liczby uruchomionych procesów" + "Pozwala aplikacji na kontrolowanie maksymalnej liczby uruchamianych procesów. Nigdy nie wykorzystywane przez normalne aplikacje." + "zamykanie wszystkich aplikacji działających w tle" + "Pozwala aplikacji na kontrolowanie, czy czynności są zawsze kończone, kiedy zaczynają działać w tle. Nigdy nie jest potrzebne normalnym aplikacjom." + "automatyczne instalowanie aktualizacji systemu" + "Pozwala aplikacji na otrzymywanie powiadomień o oczekujących aktualizacjach systemu i uruchamianie ich instalacji. Szkodliwe aplikacje mogą to wykorzystać do uszkodzenia systemu za pomocą nieuwierzytelnionych aktualizacji lub ogólnie wpłynąć na proces aktualizowania." + "zmienianie statystyk dotyczących baterii" + "Pozwala na zmianę zebranych statystyk dotyczących baterii. Nie do wykorzystania przez normalne aplikacje." + "wyświetlanie nieuwierzytelnionych okien" + "Pozwala na tworzenie okien, które przeznaczone są do wykorzystania przez wewnętrzny interfejs użytkownika systemu. Nie do wykorzystania przez normalne aplikacje." + "wyświetlanie ostrzeżeń systemowych" + "Pozwala aplikacji na pokazywanie okien alarmów systemowych. Szkodliwe aplikacje mogą przejąć kontrolę nad całym ekranem telefonu." + "zmienianie ogólnej prędkości animacji" + "Pozwala aplikacji na zmianę ogólnej prędkości animacji (szybsze lub wolniejsze animacje) w dowolnym momencie." + "zarządzanie tokenami aplikacji" + "Pozwala aplikacjom na tworzenie własnych tokenów i zarządzanie nimi z pominięciem zwykłego porządku warstw. Nigdy nie powinno być potrzebne normalnym aplikacjom." + "naciskanie klawiszy oraz przycisków sterujących" + "Pozwala aplikacjom na dostarczanie własnych zdarzeń wprowadzania danych (naciśnięcie klawisza itp.) do innych aplikacji. Szkodliwe aplikacje mogą to wykorzystać do przejęcia kontroli nad telefonem." + "zapamiętywanie wpisywanych znaków oraz wykonywanych czynności" + "Pozwala aplikacjom na śledzenie naciskanych klawiszy, nawet podczas pracy z innym programem (na przykład podczas wpisywania hasła). Nigdy nie powinno być potrzebne normalnym aplikacjom." + "tworzenie powiązania z metodą wejściową" + "Pozwala na tworzenie powiązania z interfejsem najwyższego poziomu metody wejściowej. To uprawnienie nie powinno być nigdy wymagane przez zwykłe aplikacje." + "zmienianie orientacji ekranu" + "Pozwala aplikacji na zmianę orientacji ekranu w dowolnym momencie. Nigdy nie powinno być potrzeby stosowania w normalnych aplikacjach." + "wysyłanie sygnałów systemu Linux do aplikacji" + "Pozwala aplikacjom żądać, aby dostarczany sygnał był wysyłany do wszystkich trwających procesów." + "sprawianie, że aplikacja jest cały czas uruchomiona" + "Dzięki temu uprawnieniu część elementów aplikacji może być trwała, przez co system nie może ich wykorzystać do innych aplikacji." + "usuwanie aplikacji" + "Pozwala aplikacjom na usuwanie pakietów systemu Android. Szkodliwe aplikacje mogą wykorzystać to do usuwania ważnych aplikacji." + "usuwanie danych innych aplikacji" + "Pozwala aplikacji na czyszczenie danych użytkowników." + "usuwanie pamięci podręcznej innych aplikacji" + "Pozwala aplikacji na usuwanie plików z pamięci podręcznej." + "mierzenie rozmiaru pamięci aplikacji" + "Pozwala aplikacji na pobieranie własnego kodu, danych oraz rozmiarów pamięci podręcznej" + "bezpośrednie instalowanie aplikacji" + "Pozwala aplikacji na instalowanie nowych lub zaktualizowanych pakietów systemu Android. Szkodliwe aplikacje mogą to wykorzystać, aby dodać nowe aplikacje z arbitralnie nadanymi rozległymi uprawnieniami." + "usuwanie wszystkich danych aplikacji z pamięci podręcznej" + "Pozwala aplikacji na zwalnianie pamięci telefonu przez usuwanie plików z katalogu pamięci podręcznej aplikacji. Dostęp jest bardzo ograniczony, z reguły do procesów systemu." + "czytanie plików dziennika systemu" + "Umożliwia aplikacji czytanie różnych plików dziennika systemowego. Pozwala to na uzyskanie ogólnych informacji o czynnościach wykonywanych w telefonie, ale bez ujawniania danych osobowych lub osobistych informacji." + "czytanie/zapisywanie w zasobach należących do diagnostyki" + "Pozwala aplikacji na czytanie i zapisywanie we wszystkich zasobach posiadanych przez diagnozowaną grupę, jak na przykład pliki w katalogu /dev. Może to potencjalnie wpłynąć na stabilność i bezpieczeństwo systemu. Powinno być wykorzystywane TYLKO w celach diagnozowania sprzętu przez producenta lub operatora." + "włączanie lub wyłączanie składników aplikacji" + "Pozwala aplikacji na włączenie lub wyłączenie składnika innej aplikacji. Szkodliwe aplikacje mogą wykorzystać to uprawnienie do wyłączenia ważnych funkcji telefonu. Przy włączaniu uprawnienia należy zachować ostrożność, ponieważ istnieje możliwość wprowadzenia składników aplikacji w stan nieużywalności, niespójności lub niestabilności." + "ustawianie preferowanych aplikacji" + "Umożliwia aplikacji zmianę preferowanych programów użytkownika. Może to pozwolić szkodliwym aplikacjom na niezauważalną podmianę uruchamianych programów, aby zbierać prywatne dane użytkownika." + "modyfikowanie ogólnych ustawień systemu" + "Pozwala aplikacji na zmianę danych ustawień systemowych. Szkodliwe aplikacje mogą uszkodzić konfigurację systemu." + "modyfikowanie ustawień systemu dotyczących zabezpieczeń" + "Pozwala aplikacji na modyfikowanie danych ustawień zabezpieczeń systemu. To uprawnienie nie jest wykorzystywane przez normalne aplikacje." + "zmienianie mapy usług Google" + "Pozwala aplikacji na modyfikowanie mapy usług Google. Nie wykorzystywane przez normalne aplikacje." + "automatyczne uruchamianie podczas uruchamiania urządzenia" + "Pozwala aplikacji na samoczynne uruchamianie zaraz po zakończeniu uruchamiania systemu. Może to spowodować, że telefon będzie się dłużej uruchamiał oraz może ogólnie spowolnić działanie urządzenia, ponieważ aplikacja będzie cały czas uruchomiona." + "wysyłanie transmisji trwałej" + "Pozwala aplikacji na wysyłanie transmisji trwałych, które pozostają aktywne po zakończeniu połączenia. Szkodliwe aplikacje mogą spowolnić lub zdestabilizować telefon, przez wymuszenie zbyt dużego zużycia pamięci." + "czytanie danych kontaktów" + "Pozwala aplikacji na czytanie wszystkich danych kontaktowych (adresowych) zapisanych w telefonie. Szkodliwe aplikacje mogą to wykorzystać, aby wysyłać dane użytkownika do innych ludzi." + "zapisywanie danych kontaktowych" + "Pozwala aplikacji na zmianę danych kontaktowych (adresowych) zapisanych w telefonie. Szkodliwe aplikacje mogą to wykorzystać, aby usunąć lub zmienić dane kontaktowe." + "zapisywanie danych właściciela" + "Pozwala aplikacji na zmianę danych właściciela zapisanych w telefonie. Szkodliwe aplikacje mogą to wykorzystać, aby wymazać lub zmienić dane właściciela." + "czytanie danych właściciela" + "Pozwala aplikacji na czytanie danych właściciela zapisanych w telefonie. Szkodliwe aplikacje mogą to wykorzystać do odczytania danych właściciela." + "czytanie danych kalendarza" + "Pozwala aplikacji na odczytywanie wszystkich wydarzeń z kalendarza, zapisanych w telefonie. Szkodliwe aplikacje mogą to wykorzystać do rozsyłania wydarzeń z kalendarza do innych ludzi." + "zapisywanie danych kalendarza" + "Pozwala aplikacji na zmianę wydarzeń z kalendarza zapisanych w telefonie. Szkodliwe aplikacje mogą to wykorzystać, aby usunąć lub zmienić dane w kalendarzu." + "udawanie źródeł położenia dla testów" + "Tworzenie pozorowanych źródeł ustalania położenia dla testów. Szkodliwe aplikacje mogą to wykorzystać, aby zastąpić prawdziwe położenie i/lub stan zwracany przez prawdziwe źródła, takie jak GPS lub dostawcy usługi sieciowej." + "dostęp do dodatkowych poleceń dostawcy informacji o położeniu" + "Dostęp do dodatkowych poleceń dostawcy informacji o położeniu. Szkodliwe aplikacje mogą go wykorzystać, aby wpływać na działanie urządzenia GPS lub innych źródeł ustalania położenia." + "dokładne położenie (GPS)" + "Uzyskiwanie dostępu do dokładnych źródeł ustalania położenia w telefonie, takich jak system GPS, tam, gdzie są one dostępne. Szkodliwe aplikacje mogą to wykorzystać do określenia położenia użytkownika oraz mogą zużywać więcej energii baterii." + "zgrubne (oparte o sieć) ustalanie położenia" + "Dostęp do źródeł, takich jak bazy danych sieci komórkowych, jeśli są dostępne, które pozwalają określić przybliżone położenie telefonu. Szkodliwe aplikacje mogą go wykorzystać do określenia, gdzie w przybliżeniu znajduje się użytkownik." + "dostęp do usługi SurfaceFlinger" + "Pozwala aplikacji na wykorzystanie funkcji niskiego poziomu usługi SurfaceFlinger." + "czytanie bufora ramki" + "Pozwala aplikacji na wykorzystanie odczytanej zawartości bufora ramki." + "zmienianie ustawień audio" + "Pozwala aplikacjom na zmianę globalnych ustawień audio, takich jak głośność i routing." + "nagrywanie dźwięku" + "Pozwala aplikacji na dostęp do ścieżki nagrywania dźwięku." + "robienie zdjęć" + "Pozwala aplikacji na wykonywanie zdjęć za pomocą aparatu. Dzięki temu może ona pobierać zdjęcia z aparatu w dowolnym momencie." + "wyłączenie telefonu na stałe" + "Pozwala aplikacji na wyłączenie całego telefonu na stałe. Jest to bardzo niebezpieczne." + "wymuszanie ponownego uruchomienia telefonu" + "Pozwala aplikacji na wymuszenie ponownego uruchomienia telefonu." + "montowanie i odmontowanie systemów plików" + "Pozwala aplikacjom na podłączanie i odłączanie systemów plików w pamięciach przenośnych." + "kontrolowanie wibracji" + "Pozwala aplikacjom na kontrolowanie wibracji." + "kontrolowanie latarki" + "Pozwala aplikacji kontrolować latarkę." + "testowanie sprzętu" + "Pozwala aplikacji na kontrolowanie różnych urządzeń peryferyjnych w celu testowania sprzętu." + "bezpośrednie wybieranie numerów telefonów" + "Pozwala aplikacjom na dzwonienie pod numery telefonów bez interwencji użytkownika. Szkodliwe aplikacje mogą powodować występowanie niespodziewanych połączeń na rachunku telefonicznym. Należy zauważyć, że aplikacje nie mogą dzwonić na numery alarmowe." + "bezpośrednie wybieranie dowolnych numerów telefonu" + "Pozwala aplikacji dzwonić na dowolny numer telefonu, włącznie z numerami alarmowymi, bez interwencji użytkownika. Szkodliwe aplikacje mogą wykonywać niepotrzebne i nielegalne połączenia z usługami alarmowymi." + "kontrolowanie powiadomień o aktualizacji położenia" + "Pozwala włączyć/wyłączyć powiadomienia o aktualizacji położenia przez radio. Nie wykorzystywane przez normalne aplikacje." + "dostęp do właściwości usługi rezerwacji" + "Pozwala na dostęp z uprawnieniami do odczytu/zapisu do właściwości przesłanych przez usługę rezerwacji. Nie wykorzystywane przez normalne aplikacje." + "zmiana stanu telefonu" + "Pozwala aplikacji na kontrolowanie funkcji telefonu w urządzeniu. Aplikacja z tymi uprawnieniami może przełączać sieci, włączać i wyłączać radio itp. bez informowania użytkownika." + "czytanie stanu telefonu" + "Pozwala aplikacji na dostęp do funkcji telefonu w urządzeniu. Aplikacja z takim uprawnieniem może określić numer tego telefonu, czy jest nawiązane połączenie, numer, z którym jest ono nawiązane, itp." + "zapobieganie przejściu telefonu w stan uśpienia" + "Pozwala aplikacji na zapobieganie przejściu telefonu w stan uśpienia." + "włączanie lub wyłączanie telefonu" + "Pozwala aplikacji włączać i wyłączać telefon." + "uruchamianie w trybie testu fabrycznego" + "Uruchom jako niskopoziomowy test producenta, pozwalając na całkowity dostęp do elementów sprzętowych telefonu. Dostępne tylko jeśli telefon działa w trybie testu producenta." + "ustawianie tapety" + "Pozwala aplikacji na ustawianie tapety systemu." + "ustawianie wskazówek dotyczących rozmiaru tapety" + "Pozwala aplikacji na ustawianie wskazówek dotyczących rozmiaru tapety." + "resetowanie systemu do ustawień fabrycznych" + "Pozwala aplikacji na całkowite zresetowanie systemu do ustawień fabrycznych, z wymazaniem wszystkich danych, konfiguracji oraz zainstalowanych aplikacji." + "ustawianie strefy czasowej" + "Pozwala aplikacji na zmianę strefy czasowej w telefonie." + "wykrywanie znanych kont" + "Pozwala aplikacji na pobranie listy kont zapisanych w telefonie." + "wyświetlanie stanu sieci" + "Pozwala aplikacji na wyświetlanie stanu wszystkich sieci." + "pełen dostęp do Internetu" + "Pozwala aplikacji na tworzenie gniazd sieciowych." + "zapisywanie ustawień nazwy punktu dostępowego (APN, Access Point Name)" + "Pozwala aplikacji na zmianę ustawień APN, takich jak serwer proxy oraz port dowolnego APN." + "zmienianie połączeń sieci" + "Pozwala aplikacji na zmianę stanu połączeń sieciowych." + "wyświetlanie stanu Wi-Fi" + "Pozwala aplikacji na wyświetlanie informacji o stanie Wi-Fi." + "zmiana stanu Wi-Fi" + "Pozwala aplikacji na łączenie i rozłączanie z punktami dostępowymi Wi-Fi oraz na dokonywanie zmian skonfigurowanych sieci Wi-Fi." + "administrowanie Bluetooth" + "Pozwala aplikacji na konfigurowanie lokalnego telefonu Bluetooth, wyszukiwanie urządzeń zdalnych i łączenie się z nimi." + "tworzenie połączeń Bluetooth" + "Pozwala aplikacji na wyświetlanie konfiguracji lokalnego telefonu Bluetooth oraz na tworzenie i akceptowanie połączeń ze sparowanymi urządzeniami." + "wyłączanie blokady klawiatury" + "Pozwala aplikacji na wyłączenie blokady klawiatury i wszystkich związanych z tym haseł zabezpieczających. Typowym przykładem takiego działania jest wyłączanie blokady klawiatury, gdy pojawia się połączenie przychodzące, a następnie ponowne jej włączanie po zakończeniu połączenia." + "czytanie ustawień synchronizowania" + "Pozwala aplikacji na czytanie ustawień synchronizacji, takich jak informacje, czy synchronizacja kontaktów jest włączona." + "zapisywanie ustawień synchronizowania" + "Pozwala aplikacji na zmianę ustawień synchronizowania, takich jak ustalenie, czy synchronizacja dla kontaktów ma być włączona." + "czytanie statystyk dotyczących synchronizowania" + "Pozwala aplikacji na czytanie statystyk synchronizowania, np. historii przeprowadzonych synchronizacji." + "czytanie subskrybowanych źródeł" + "Pozwala aplikacjom na pobieranie informacji szczegółowych na temat obecnie zsynchronizowanych źródeł." + "zapisywanie subskrybowanych źródeł" + "Umożliwia aplikacji zmianę obecnie zsynchronizowanych źródeł. Może to pozwolić szkodliwej aplikacji na zmianę zsynchronizowanych źródeł." + + "Strona główna" + "Komórka" + "Praca" + "Faks w pracy" + "Faks domowy" + "Pager" + "Inny" + "Niestandardowy" + + + "Strona główna" + "Praca" + "Inne" + "Niestandardowy" + + + "Strona główna" + "Praca" + "Inny" + "Niestandardowy" + + + "Strona główna" + "Praca" + "Inne" + "Niestandardowy" + + + "Praca" + "Inne" + "Niestandardowy" + + + "AIM" + "Windows Live" + "Yahoo" + "Skype" + "QQ" + "Google Talk" + "ICQ" + "Jabber" + + "Wprowadź kod PIN" + "Błędny kod PIN!" + "Aby odblokować, naciśnij przycisk Menu, a następnie 0." + "Numer alarmowy" + "(Brak usługi)" + "Ekran zablokowany." + "Naciśnij przycisk Menu, aby odblokować lub wykonać połączenie alarmowe." + "Naciśnij przycisk Menu, aby odblokować." + "Narysuj wzór, aby odblokować" + "Połączenie alarmowe" + "Poprawnie!" + "Niestety, spróbuj ponownie" + "Ładowanie (%d%%)" + "Podłącz ładowarkę." + "Brak karty SIM." + "Brak karty SIM w telefonie." + "Włóż kartę SIM." + "Sieć zablokowana" + "Karta SIM jest zablokowana kodem PUK." + "Skontaktuj się z działem obsługi klienta." + "Karta SIM jest zablokowana." + "Odblokowywanie karty SIM..." + "Wzór odblokowania został nieprawidłowo narysowany %d razy. "\n\n"Spróbuj ponownie za %d sekund." + "Wzór odblokowania został narysowany nieprawidłowo %d razy. Po kolejnych %d nieudanych próbach telefon trzeba będzie odblokować przez zalogowanie na koncie Google."\n\n" Spróbuj ponownie za %d sekund." + "Spróbuj ponownie za %d sekund." + "Zapomniałeś wzoru?" + "Zbyt wiele prób narysowania wzoru!" + "Aby odblokować,"\n"zaloguj się na koncie Google" + "Nazwa użytkownika (e-mail)" + "Hasło" + "Zaloguj" + "Błędna nazwa użytkownika lub hasło." + "h:mm AA" + "%-l:%M%P" + "%-l:%M%p" + + + + + "Wyczyść powiadomienia" + "Brak powiadomień" + "Trwające" + "Powiadomienia" + + + "Ładowanie..." + "Podłącz ładowarkę" + "Bateria się rozładowuje:" + "pozostało mniej niż %d%%." + "Nieudany test fabryczny" + "Czynność FACTORY_TEST jest obsługiwana tylko dla pakietów zainstalowanych w katalogu /system/app." + "Nie znaleziono żadnego pakietu, który zapewnia działanie FACTORY_TEST." + "Uruchom ponownie" + "Potwierdź" + "Czy chcesz, aby zapamiętać to hasło w przeglądarce?" + "Nie teraz" + "Zapamiętaj" + "Nigdy" + "Brak uprawnień do otwierania tej strony." + "Tekst został skopiowany do schowka." + "Więcej" + "Menu+" + "spacja" + "enter" + "usuń" + "Szukaj" + "Dzisiaj" + "Wczoraj" + "Jutro" + "miesiąc temu" + "Ponad 1 miesiąc temu" + + "sekundę temu" + "%d sekund temu" + + + "1 minutę temu" + "%d minut temu" + + + "godzinę temu" + "%d godzin temu" + + + "wczoraj" + "%d dni temu" + + + "za sekundę" + "za %d sekund" + + + "za minutę" + "za %d minut" + + + "za godzinę" + "za %d godzin" + + + "jutro" + "za %d dni" + + + + + + + + + + + + + + + + + + "dnia %s" + "o %s" + "w %s" + "dzień" + "dni" + "godzina" + "godzin" + "min" + "minut" + "s" + "S" + "tydzień" + "tygodni" + "rok" + "lat" + "Niedziela" + "Poniedziałek" + "Wtorek" + "Środa" + "Czwartek" + "Piątek" + "Sobota" + "W każdy dzień roboczy (pon–pt)" + "Codziennie" + "Co tydzień w %s" + "Miesięcznie" + "Co roku" + "Nie można odtworzyć filmu wideo" + "Niestety, nie można odtworzyć tego filmu wideo." + "OK" + "rano" + "po południu" + "%m/%d/%Y" + "%1$s, %2$s, %3$s%4$s, %5$s, %6$s" + "%1$s, %2$s%4$s, %5$s" + "%2$s, %3$s%5$s, %6$s" + "%2$s%5$s" + "%1$s%2$s" + "%1$s, %2$s, %3$s" + "%2$s, %3$s" + "%1$s, %3$s" + + + + + "%1$s, %2$s" + "MMMM dd, yyyy" + "dd MMMM, yyyy" + "MMM dd, yyyy" + "dd MMM, yyyy" + "h:mm a" + "H:mm" + "południe" + "Południe" + "północ" + "Północ" + + + + + "%B %-d, %Y" + + + "%H:%M:%S" + "%H:%M:%S %B %-d, %Y" + "%2$s %3$s%7$s %8$s" + "%1$s, %2$s %3$s%6$s, %7$s %8$s" + "%2$s %3$s%7$s %8$s, %9$s" + "%1$s, %2$s %3$s%6$s, %7$s %8$s, %9$s" + "%2$s %3$s, %5$s%7$s %8$s, %10$s" + "%1$s, %2$s %3$s, %5$s%6$s, %7$s %8$s, %10$s" + "%2$s %3$s, %4$s, %5$s%7$s %8$s, %9$s, %10$s" + "%1$s, %2$s %3$s, %4$s, %5$s%6$s, %7$s %8$s, %9$s, %10$s" + "%2$s/%3$s%7$s/%8$s" + "%1$s, %2$s/%3$s%6$s, %7$s/%8$s" + "%2$s/%3$s/%4$s%7$s/%8$s/%9$s" + "%1$s, %2$s/%3$s/%4$s%6$s, %7$s/%8$s/%9$s" + "%2$s/%3$s, %5$s%7$s/%8$s, %10$s" + "%1$s, %2$s/%3$s, %5$s%6$s, %7$s/%8$s, %10$s" + "%2$s/%3$s/%4$s, %5$s%7$s/%8$s/%9$s, %10$s" + "%1$s, %2$s/%3$s/%4$s, %5$s%6$s, %7$s/%8$s/%9$s, %10$s" + "%2$s %3$s%8$s" + "%1$s, %2$s %3$s%6$s, %7$s %8$s" + "%2$s %3$s%8$s, %9$s" + "%1$s, %2$s %3$s, %4$s%6$s, %7$s %8$s, %9$s" + "%2$s %3$s, %5$s%7$s %8$s, %10$s" + "%1$s, %2$s %3$s, %5$s%6$s, %7$s %8$s, %10$s" + "%2$s %3$s, %4$s, %5$s%7$s %8$s, %9$s, %10$s" + "%1$s, %2$s %3$s, %4$s, %5$s%6$s, %7$s %8$s, %9$s, %10$s" + "%b %-d, %Y" + + + + + + + "Niedziela" + "Poniedziałek" + "Wtorek" + "Środa" + "Czwartek" + "Piątek" + "Sobota" + "Nie" + "Pon" + "Wt" + "Śro" + "Czw" + "Pią" + "Sob" + "Nd" + "Pn" + "Wt" + "Śr" + "Czw" + "Pt" + "So" + "Nd" + "Pon" + "Wt" + "Śr" + "Czw" + "Pt" + "So" + "Nd" + "Pon" + "Czw" + "Śr" + "Czw" + "Pt" + "Sob" + "Styczeń" + "Luty" + "Marzec" + "Kwiecień" + "Maj" + "Czerwiec" + "Lipiec" + "Sierpień" + "Wrzesień" + "Październik" + "Listopad" + "Grudzień" + "Sty" + "Lut" + "Mar" + "Kwi" + "Maj" + "Cze" + "Lip" + "Sie" + "Wrz" + "Paź" + "Lis" + "Gru" + "Sty" + "Lut" + "Pon" + "Kwi" + "Maj" + "Cze" + "Lip" + "Sie" + "Wrz" + "Paź" + "Lis" + "Gru" + "%1$02d:%2$02d" + "%1$d:%2$02d:%3$02d" + "Zaznacz wszystko" + "Wybierz tekst" + "Zatrzymaj wybieranie tekstu" + "Wytnij" + "Wytnij wszystko" + "Kopiuj" + "Kopiuj wszystko" + "Wklej" + "Kopiuj adres URL" + "Metoda wejściowa" + "Edytuj tekst" + "Mało miejsca" + "Maleje ilość dostępnej pamięci telefonu." + "OK" + "Anuluj" + "OK" + "Anuluj" + "Włącz" + "Wyłącz" + "Zakończ działanie, korzystając z" + "Używaj domyślnie dla tej czynności." + "Wyczyść domyślne w: Ustawienia strony głównej > Aplikacje > Zarządzaj aplikacjami." + "Wybierz czynność" + "Żadna z aplikacji nie może wykonać tej czynności." + "Przepraszamy!" + "Aplikacja %1$s (proces %2$s) została niespodziewanie zatrzymana. Spróbuj ponownie." + "Proces %1$s został niespodziewanie zatrzymany. Spróbuj ponownie." + "Przepraszamy!" + "Działanie %1$s (w aplikacji %2$s) nie odpowiada." + "Działanie %1$s (w procesie %2$s) nie odpowiada." + "Aplikacja %1$s (w procesie %2$s) nie odpowiada." + "Proces %1$s nie odpowiada." + "Wymuś zamknięcie" + "Czekaj" + "Debuguj" + "Wybierz czynność dla wpisanego tekstu" + "Głośność dzwonka" + "Głośność multimediów" + "Odtwarzanie przez Bluetooth" + "Głośność podczas połączenia" + "Odtwarzanie przez Bluetooth" + "Głośność alarmu" + "Głośność powiadomienia" + "Głośność" + "Domyślny dzwonek" + "Domyślny dzwonek (%1$s)" + "Cichy" + "Dzwonki" + "Nieznany dzwonek" + + "Sieć Wi-Fi jest dostępna" + "Dostępne sieci Wi-Fi" + + + "Otwórz dostępne sieci Wi-Fi" + "Otwórz dostępne sieci Wi-Fi" + + "Wstaw znak" + "Nieznana aplikacja" + "Wysyłanie wiadomości SMS" + "Wysyłana jest duża liczba wiadomości SMS. Wybierz „OK”, aby kontynuować, lub „Anuluj”, aby zatrzymać wysyłanie." + "OK" + "Anuluj" + "Ustaw" + "Domyślne" + "Nie są wymagane żadne uprawnienia" + "Ukryj" + "Pokaż wszystko" + "Ładowanie..." + "Połączenie przez USB" + "Telefon został podłączony do komputera przez port USB. Wybierz polecenie „Montuj”, jeśli chcesz skopiować pliki między komputerem a kartą SD w telefonie." + "Zamontuj" + "Nie montuj" + "Wystąpił problem z wykorzystaniem karty SD dla pamięci USB." + "Połączenie przez USB" + "Wybierz, aby skopiować pliki do/z komputera" + "Wybierz metodę wejściową" + "AĄBCĆDEĘFGHIJKLŁMNŃOÓPQRSŚTUVWXYZŹŻ" + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "kandydaci" + diff --git a/core/res/res/values-ru/arrays.xml b/core/res/res/values-ru/arrays.xml new file mode 100644 index 0000000000000..f9c904be4c64c --- /dev/null +++ b/core/res/res/values-ru/arrays.xml @@ -0,0 +1,4 @@ + + + diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml new file mode 100644 index 0000000000000..8d362bdb1dee7 --- /dev/null +++ b/core/res/res/values-ru/strings.xml @@ -0,0 +1,724 @@ + + + "б" + "Кб" + "Мб" + "Гб" + "Тб" + "Пб" + "<без названия>" + "…" + "(Нет номера телефона)" + "(Неизвестно)" + "Голосовая почта" + "MSISDN1" + "Проблема с подключением или недействительный код MMI." + "Служба включена." + "Служба включена для следующего:" + "Служба отключена." + "Регистрация прошла успешно." + "Удаление прошло успешно." + "Неверный пароль." + "Код MMI завершен." + "Указан неверный старый PIN." + "Указан неверный PUK." + "Указанные PIN-коды не совпадают." + "Введите PIN, содержащий от 4 до 8 цифр." + "Ваша SIM-карта заблокирована PUK-кодом. Введите PUK, чтобы разблокировать ее." + "Введите PUK2 для разблокирования SIM-карты." + "Идентификатор звонящего" + "Идентификатор принимающего вызов" + "Перенаправление вызовов" + "Ожидание вызова" + "Запрет вызовов" + "Изменение пароля" + "Изменение PIN" + "Идентификатор звонящего по умолчанию ограничен. Следующий вызов: ограничен" + "Идентификатор звонящего по умолчанию ограничен. Следующий вызов: не ограничен" + "Идентификатор звонящего по умолчанию не ограничен. Следующий вызов: ограничен" + "Идентификатор звонящего по умолчанию не ограничен. Следующий вызов: не ограничен" + "Услуга не предоставляется." + "Нельзя изменить настройки идентификатора звонящего." + "Голос" + "Данные" + "ФАКС" + "SMS" + "Асинхр." + "Синхронизация" + "Пакетные данные" + "PAD" + "{0}: не перенаправлено" + "{0}: {1}" + "{0}: {1} через {2} сек." + "{0}: не перенаправлено" + "{0}: не перенаправлено" + "ОК" + "Веб-страница содержит ошибку." + "Не удается найти URL." + "Схема аутентификации сайта не поддерживается." + "Не удалось выполнить аутентификацию." + "Не удалось выполнить аутентификацию через прокси-сервер." + "Не удалось связаться с сервером." + "Сервер не отвечает. Повторите попытку позже." + "Время подключения к серверу истекло." + "Страница содержит слишком много перенаправлений." + "Протокол не поддерживается" + "Невозможно установить безопасное соединение." + "Невозможно открыть страницу, поскольку URL недействителен." + "Нет доступа к файлу." + "Нужный файл не найден." + "Обрабатывается слишком много запросов. Повторите попытку позже." + "Синхронизация" + "Синхронизация" + "Слишком много удалений %s." + "Память телефона полна! Удалите какие-нибудь файлы, чтобы освободить место." + "Я" + "Параметры телефона" + "Беззвучный режим" + "Включить беспроводную связь" + "Отключить беспроводную связь" + "Заблокировать экран" + "Отключить питание" + "Идет выключение…" + "Телефон будет выключен." + "Нет новых приложений." + "Параметры телефона" + "Заблокировать экран" + "Отключить питание" + "Беззвучный режим" + "Звук выключен" + "Звук включен" + "Безопасный режим" + "Платные службы" + "Разрешить приложениям выполнять действия, за которые может взиматься плата." + "Сообщения" + "Чтение и запись SMS, электронной почты и других сообщений." + "Личная информация" + "Прямой доступ к вашим контактам и календарю, сохраненным на телефоне." + "Ваше местоположение" + "Наблюдение за вашим местоположением" + "Связь с сетью" + "Разрешить приложениям использовать сетевые функции." + "Ваши аккаунты Google" + "Доступ к имеющимся аккаунтам Google." + "Управление оборудованием" + "Прямой доступ к оборудованию телефона." + "Телефонные вызовы" + "Слежение, запись и обработка вызовов." + "Системные инструменты" + "Доступ и управление системой на низком уровне." + "Средства для разработки" + "Функции, необходимые только разработчикам приложений." + "отключать или изменять панель состояния" + "Разрешает приложению отключать панель состояния или добавлять и удалять системные значки." + "разворачивать/сворачивать панель состояния" + "Разрешает приложению разворачивать и сворачивать панель состояния." + "перехватывать исходящие вызовы" + "Разрешает приложению обрабатывать исходящие вызовы и изменять набираемый номер. Вредоносное ПО может следить, перенаправлять или блокировать исходящие вызовы." + "получать SMS" + "Разрешает приложениям получать и обрабатывать сообщения SMS. Вредоносное ПО может отслеживать ваши сообщения или удалять до того, как вы их увидите." + "получать MMS" + "Разрешает приложениям получать и обрабатывать сообщения MMS. Вредоносное ПО может отслеживать ваши сообщения или удалять их, не показав вам." + "отправлять SMS" + "Разрешает приложениям отправлять SMS. Вредоносное ПО может тратить ваши деньги, отправляя сообщения без вашего ведома." + "читать SMS и MMS" + "Разрешает приложению записывать SMS, сохраненные в телефоне или на SIM-карте. Вредоносное ПО может читать конфиденциальные сообщения." + "изменять SMS и MMS" + "Разрешает приложению записывать данные в SMS, сохраненные в телефоне или на SIM-карте. Вредоносное ПО может удалять сообщения." + "получать через WAP" + "Разрешает приложениям получать и обрабатывать сообщения WAP. Вредоносное ПО может отслеживать ваши сообщения или удалять до того, как вы их увидите." + "получать работающие приложения" + "Разрешает приложению получать информацию о работающих и недавно выполненных задачах. Может позволить вредоносному ПО получать конфиденциальную информацию о других приложениях." + "переупорядочивать работающие приложения" + "Разрешает приложению изменять приоритет задач. Вредоносное ПО может выходить на передний план без вашего разрешения." + "включать отладку приложений" + "Разрешает приложению включать отладку других приложений. Вредоносное ПО может таким образом закрывать другие приложения." + "изменять настройки интерфейса" + "Позволяет приложению изменять текущую конфигурацию, например локаль и общий размер шрифта." + "перезапускать другие приложения" + "Разрешает приложению принудительно перезапускать другие приложения." + "предотвращать остановку" + "Разрешает приложению запускать любые процессы на переднем плане так, что их нельзя прекратить. Не требуется обычным приложениям." + "принудительно закрывать приложения" + "Позволяет приложению принудительно закрывать и переводить в фоновый режим действия, работающие на переднем плане. Не требуется обычным приложениям." + "получать внутреннее состояние системы" + "Разрешает приложениям получать внутреннее состояние системы. Вредоносное ПО может получать множество личной и защищенной информации, которая обычно не была бы им доступна." + "публиковать службы низкого уровня" + "Разрешает приложению публиковать собственные системные службы низкого уровня. Вредоносное ПО может взломать систему и украсть или повредить данные в ней." + "наблюдать и управлять запуском всех приложений" + "Разрешает приложению следить и управлять тем, как система запускает действия. Вредоносное ПО может полностью нарушить работу системы. Это разрешение нужно только для разработки, но не при обычном использовании телефона." + "отправлять оповещения об удалении пакетов" + "Позволяет приложению распространять уведомление об удалении пакета приложения. Вредоносное ПО может использовать это для остановки любых других работающих приложений." + "отправлять оповещения о получении SMS" + "Разрешает приложению распространять уведомление о том, что получено сообщение SMS. Вредоносное ПО может пользоваться этим для фальсификации входящих сообщений SMS." + "отправлять оповещения о получении WAP-PUSH" + "Разрешает приложению распространять уведомление о получении сообщения WAP PUSH. Вредоносное ПО может использовать это для подделки отчета о получении MMS или просто заменять содержание любой веб-страницы вредоносными вариантами." + "ограничивать количество выполняемых процессов" + "Позволяет приложению контролировать максимальное количество выполняемых процессов. Не требуется обычным приложениям." + "закрывать все фоновые приложения" + "Разрешает приложению следить, чтобы действия всегда завершались после перехода в фоновый режим. Не требуется обычным приложениям." + "автоматически устанавливать системные обновления" + "Разрешает приложению получать уведомления о предстоящих обновлениях системы и запускать их установку. Это дает вредоносному ПО возможность повредить систему неавторизованными обновлениями или помешать выполнению обновления." + "изменять данные о батарее" + "Разрешает изменять данные о батарее. Не используется обычными приложениями." + "отображать неавторизованные окна" + "Разрешает создавать окна, используемые внутренним системным интерфейсом пользователя. Не для использования обычными программами." + "отображать системные предупреждения" + "Разрешает приложению показывать окна системных предупреждений. Вредоносное ПО может захватить весь экран телефона." + "изменять общую скорость анимации" + "Позволяет приложению в любой момент изменять общую скорость анимации (ускорять и замедлять анимацию)." + "управлять маркерами приложений" + "Разрешает приложениям создавать и управлять собственными маркерами вместо обычного порядка Z. Не требуется обычным приложениям." + "нажимать на клавиши и кнопки управления" + "Позволяет приложению передавать другим приложениям собственные события ввода (нажатия клавиш и т.д.). Вредоносное ПО может воспользоваться этим для захвата телефона." + "записывать нажимаемые клавиши и действия" + "Разрешает приложениям отслеживать нажимаемые клавиши даже при работе в другом приложении (например набор пароля). Никогда не используется обычными приложениями." + "выполнять привязку к способу ввода" + "Разрешает владельцу привязку к интерфейсу верхнего уровня способа ввода. Не требуется обычным приложениям." + "изменять положение экрана" + "Позволяет приложению в любой момент изменять положение экрана. Не требуется обычным приложениям." + "отправлять приложениям Linux-сигналы" + "Разрешает приложению запрашивать отправку поступающего сигнала всем постоянным процессам." + "выполнять приложение постоянно" + "Позволяет приложению переводить свои компоненты в постоянное состояние так, что система не сможет использовать их для других приложений." + "удалять приложения" + "Разрешает приложению удалять пакеты Android. Вредоносное ПО может воспользоваться этим для удаления важных приложений." + "удалять данные других приложений" + "Разрешает приложению удалять данные пользователя." + "удалять кэш других приложений" + "Позволяет приложению удалять файлы из кэша." + "измерять место для хранения данных приложений" + "Разрешает приложению получать размеры своего кода, данных и кэша" + "напрямую устанавливать приложения" + "Разрешает приложению устанавливать новые или обновленные пакеты Android. Вредоносное ПО может использовать это для добавления новых приложений с абсолютными полномочиями." + "удалять все данные из кэша приложений" + "Разрешает приложению освобождать место на телефоне, удаляя файлы из каталога кэша приложения. Обычно доступ разрешен только системным процессам." + "читать файлы системного журнала" + "Разрешает приложению считывать различные файлы журналов системы. Это позволяет получать сведения о том, что вы делаете с телефоном, но в этих файлах не должно быть личной или конфиденциальной информации." + "считывать и записывать ресурсы, принадлежащих diag" + "Разрешает приложению считывать и записывать в любой ресурс, принадлежащий группе diag, например файлы в /dev. Это может влиять на стабильность и безопасность системы. Следует использовать ТОЛЬКО при диагностике оборудования производителем или оператором." + "включать и выключать компоненты приложений" + "Разрешает приложению включать или отключать компоненты другого приложения. Вредоносное ПО сможет отключать важные функции телефона. Эту возможность следует использовать с осторожностью, так как можно привести компоненты приложений в нерабочее, несовместимое или нестабильное состояние." + "задавать предпочитаемые приложения" + "Позволяет приложению изменять предпочитаемые приложения. Это может позволить вредоносному ПО незаметно изменить работающие приложения поддельными и собрать ваши личные данные." + "изменять глобальные настройки системы" + "Разрешает приложению изменять данные настройки системы. Вредоносное ПО может повредить конфигурацию вашей системы." + "изменять защищенные настройки системы" + "Разрешает приложению изменять данные в защищенных настройках системы. Не используется обычными приложениями." + "изменять карту служб Google" + "Разрешает приложению изменять карту служб Google. Не используется обычными приложениями." + "автоматически запускаться при загрузке" + "Разрешает приложению запускаться сразу после загрузки системы. Это может увеличить время запуска телефона, а постоянная работа приложения может снизить общую скорость работы." + "отправлять постоянное оповещение" + "Разрешает приложению отправлять постоянные оповещения, остающиеся после окончания рассылки. Вредоносное ПО может замедлить работу телефона или привести к нестабильности, используя слишком много памяти." + "считывать данные контактов" + "Разрешает приложению считывать полную контактную информацию (адрес), сохраненную в вашем телефоне. Может использоваться вредоносным ПО для отправки этих данных другим людям." + "записывать данные контактов" + "Разрешает приложению изменять контактную информацию (адрес), сохраненную в телефоне. Вредоносное ПО может использовать это для удаления или изменения данных контактов." + "записывать данные о владельце" + "Разрешает приложению изменять данные о владельце, сохраненные в телефоне. Вредоносное ПО может использовать это для удаления или изменения данных о владельце." + "считывать данные о владельце" + "Разрешает приложению считывать данные о владельце, сохраненные в телефоне. Вредоносное ПО может использовать это для чтения данных о владельце." + "считывать данные календаря" + "Разрешает приложению считывать все события календаря, сохраненные в телефоне. Вредоносное ПО может использовать это для отправки событий вашего календаря другим людям." + "записывать данные календаря" + "Позволяет приложению изменять сохраненные в телефоне события календаря. Вредоносное ПО сможет стирать или изменять данные календаря." + "имитировать источники данных о положении для тестирования" + "Создание имитаций источников данных о местоположении для тестирования. Вредоносное ПО может использовать это для изменения данных о местоположении и/или состоянии, сообщаемых настоящими источниками таких данных, например GPS или оператором связи." + "получать доступ к дополнительным командам местоположения от поставщика связи" + "Доступ к дополнительным командам местоположения от поставщика связи. Это дает вредоносному ПО возможность мешать работе GPS или других источников данных о местоположении." + "определять точное местоположение (GPS)" + "Доступ к имеющимся источникам точных данных о местоположении телефона, например к GPS. Вредоносное ПО сможет узнать, где вы находитесь, а также истратить заряд батареи." + "определять приблизительное местоположение (на основе данных сети)" + "Доступ (при наличии) к источникам сведений о приблизительном расположении, например базам данных сотовой сети. Вредоносное ПО может использовать эту функцию для того, чтобы определять ваше местоположение." + "открывать SurfaceFlinger" + "Разрешает приложению использовать функции SurfaceFlinger низкого уровня." + "считывать данные из буфера фреймов" + "Разрешает приложению считывать содержание буфера фрейма." + "изменять настройки звука" + "Разрешает приложениям изменять глобальные настройки звука, например громкость и маршрут сигнала." + "записывать звук" + "Разрешает приложению получать доступ к пути записи звука." + "снимать фотографии" + "Разрешает приложению делать снимки с помощью камеры. Это позволяет приложению в любой момент записывать то, что видно через камеру." + "отключать телефон навсегда" + "Разрешает приложению навсегда отключить телефон. Это очень опасно." + "принудительно перезагружать телефон" + "Разрешает приложению принудительно перезагружать телефон." + "подключаться и отключаться от файловых систем" + "Разрешает приложению подключаться и отключаться от файловых систем съемных устройств хранения." + "управлять вибрацией" + "Разрешает приложению управлять вибровызовом." + "управлять фонарем" + "Разрешает приложению управлять фонарем." + "проверять оборудование" + "Разрешает приложению управлять внешними устройствами для тестирования оборудования." + "напрямую вызывать телефонные номера" + "Разрешает приложениям вызывать телефонные номера без вашего участия. Вредоносное ПО может выполнять вызовы, за которые придется платить. Заметьте, что это не разрешает приложению вызывать номера экстренных служб." + "напрямую вызывать любые телефонные номера" + "Разрешает приложению вызывать любой номер, включая экстренные, без вашего участия. Вредоносное ПО может совершать ненужные и незаконные вызовы в службы неотложной помощи." + "управлять уведомлениями об обновлении местоположения" + "Разрешает включение/отключение уведомлений о местоположении по радиосвязи. Не используется обычными приложениями." + "открывать свойства проверки" + "Разрешает доступ на чтение и запись к свойствам, загруженным службой проверки. Не используется обычными приложениями." + "изменять состояние телефона" + "Позволяет приложению управлять телефонными функциями устройства. Приложение с такими полномочиями может переключать сети, включать и выключать радиосвязь и т.д., не сообщая вам об этом." + "считывать состояние телефона" + "Разрешает приложению использовать телефонные функции устройства. Приложение с такими полномочиями может определить номер данного телефона, наличие вызова, номер, с которым связан вызов и так далее." + "предотвращать переход телефона в режим ожидания" + "Разрешает приложению блокировать переход телефона в режим ожидания." + "включать и отключать телефон" + "Позволяет приложениям включать и выключать телефон." + "работа в режиме заводского тестирования" + "Работа в качестве теста производителя низкого уровня, что дает полный доступ к оборудованию телефона. Доступно только при работе телефона в режиме теста производителя." + "устанавливать фоновый рисунок" + "Разрешает приложению устанавливать системный фоновый рисунок." + "устанавливать подсказки по размеру фонового рисунка" + "Разрешает приложению устанавливать системные подсказки по размеру фонового рисунка." + "выполнять сброс системы и восстановление заводских настроек" + "Разрешает приложению полностью сбрасывать настройки системы до заводских, удаляя все данные, конфигурацию и установленные приложения." + "устанавливать часовой пояс" + "Разрешает приложению изменять часовой пояс телефона." + "обнаруживать известные аккаунты" + "Разрешает приложению получать список аккаунтов, известных телефону." + "просматривать состояние сети" + "Позволяет приложению видеть состояние всех сетей." + "обладать полным доступом в Интернет" + "Позволяет приложению создавать сетевые сокеты." + "записывать настройки названий точек доступа" + "Разрешает приложению изменять настройки APN, например прокси и порт любого APN." + "изменять подключение к сети" + "Позволяет приложению изменять подключение к сети." + "просматривать состояние Wi-Fi" + "Разрешает приложению просматривать сведения о состоянии Wi-Fi." + "изменять состояние Wi-Fi" + "Разрешает приложению подключаться и отключаться от точек доступа Wi-Fi и вносить изменения в настроенные сети Wi-Fi." + "управлять Bluetooth" + "Разрешает приложению настраивать локальный телефон с Bluetooth, а также обнаруживать удаленные устройства и соединяться с ними." + "создавать Bluetooth-подключения" + "Позволяет приложению просматривать конфигурацию локального телефона Bluetooth, создавать и разрешать подключение к связанным устройствам." + "отключать блокировку клавиатуры" + "Разрешает приложению отключать блокировку клавиш и связанную с ней защиту паролем. Пример нормального использования – отключение блокировки телефоном, когда он принимает вызов, и ее включение после окончания вызова." + "считывать настройки синхронизации" + "Разрешает приложению считывать настройки синхронизации, например наличие синхронизации контактов." + "записывать настройки синхронизации" + "Разрешает приложению изменять настройки синхронизации, например синхронизацию контактов." + "считывать данные о синхронизации" + "Разрешает приложению считывать данные о синхронизации, например историю выполненных синхронизаций." + "считывать фиды с подпиской" + "Позволяет приложению получать сведения о синхронизированных фидах." + "записывать фиды с подпиской" + "Разрешает приложению изменять ваши синхронизированные фиды. Это может позволить вредоносному ПО изменять ваши синхронизированные фиды." + + "Домашний" + "Мобильный" + "Рабочий" + "Рабочий факс" + "Домашний факс" + "Пейджер" + "Другое" + "Другой" + + + "Домашний" + "Рабочий" + "Другое" + "Другой" + + + "Домашний" + "Рабочий" + "Другое" + "Другой" + + + "Домашний" + "Рабочий" + "Другое" + "Другой" + + + "Рабочий" + "Другое" + "Другой" + + + "AIM" + "Windows Live" + "Yahoo" + "Skype" + "QQ" + "Google Talk" + "ICQ" + "Jabber" + + "Введите PIN-код" + "Неверный PIN-код!" + "Для разблокировки нажмите Menu и 0." + "Номер экстренной службы" + "(Вне зоны обслуживания)" + "Экран заблокирован." + "Нажмите Menu для разблокировки или выполните экстренный вызов." + "Чтобы снять блокировку, нажмите Menu." + "Для разблокировки воспроизведите комбинацию" + "Экстренный вызов" + "Верно!" + "Неверно, попробуйте еще раз" + "Зарядка (%d%%)" + "Подключите зарядное устройство." + "Нет SIM-карты." + "В телефоне нет SIM-карты." + "Вставьте SIM-карту." + "Заблокирована сетью" + "SIM-карта заблокирована PUK-кодом." + "Свяжитесь со службой поддержки." + "SIM-карта заблокирована." + "Разблокировка SIM-карты..." + "Вы неправильно воспроизвели комбинацию разблокировки %d раз. "\n\n"Повторите попытку через %d сек." + "Вы неверно воспроизвели комбинацию разблокировки %d раз(а). После %d неудачных попыток(ки) придется разблокировать телефон с помощью входа Google."\n\n" Повторите попытку через %d сек." + "Повторите попытку через %d сек." + "Забыли комбинацию?" + "Слишком много попыток ввести комбинацию!" + "Для разблокировки"\n"войдите с помощью своего аккаунта Google" + "Имя пользователя (адрес электронной почты)" + "Пароль" + "Войти" + "Недействительное имя пользователя или пароль." + "h:mm AA" + "%-l:%M%P" + "%-l:%M%p" + + + + + "Очистить уведомления" + "Нет уведомлений" + "Текущие" + "Уведомления" + + + "Идет зарядка..." + "Подключите зарядное устройство" + "Батарея садится:" + "осталось менее %d%%." + "Ошибка заводского теста" + "Действие FACTORY_TEST поддерживается только для пакетов, установленных в папке /system/app." + "Пакет, предоставляющий действие FACTORY_TEST, не найден." + "Перезагрузить" + "Подтверждение" + "Сохранить этот пароль в браузере?" + "Не сейчас" + "Запомнить" + "Никогда" + "У вас нет разрешения открывать эту страницу." + "Текст скопирован в буфер обмена." + "Еще" + "Мenu+" + "место" + "ввод" + "удалить" + "Поиск" + "Сегодня" + "Вчера" + "Завтра" + "1 месяц назад" + "Больше 1 месяца назад" + + "1 секунду назад" + "%d сек. назад" + + + "1 минуту назад" + "%d мин. назад" + + + "1 час назад" + "%d ч. назад" + + + "вчера" + "%d дн. назад" + + + "через 1 секунду" + "через %d сек." + + + "через 1 минуту" + "через %d мин." + + + "через 1 час" + "через %d час." + + + "завтра" + "через %d дн." + + + + + + + + + + + + + + + + + + "%s" + "в %s" + "в %s" + "день" + "дни" + "час" + "часы" + "мин" + "мин." + "сек" + "сек." + "неделя" + "недели" + "год" + "годы" + "воскресенье" + "понедельник" + "вторник" + "среда" + "четверг" + "пятница" + "суббота" + "По рабочим дням (пн-пт)" + "Ежедневно" + "Еженедельно в: %s" + "Ежемесячно" + "Ежегодно" + "Не удается воспроизвести видео" + "К сожалению, это видео нельзя воспроизвести." + "ОК" + "AM" + "PM" + "%d/%m/%Y" + "%1$s, %2$s, %3$s%4$s, %5$s, %6$s" + "%1$s, %2$s%4$s, %5$s" + "%2$s, %3$s%5$s, %6$s" + "%2$s%5$s" + "%1$s%2$s" + "%1$s, %2$s, %3$s" + "%2$s, %3$s" + "%1$s, %3$s" + + + + + "%1$s, %2$s" + "dd MMMM yyyy" + "dd MMMM yyyy" + "dd MMM yyyy" + "dd MMM yyyy" + "h:mm a" + "H:mm" + "полдень" + "Полдень" + "полночь" + "Полночь" + + + + + "%-d %B %Y" + + + "%H:%M:%S" + "%H:%M:%S %-d %B %Y" + "%3$s %2$s%8$s %7$s" + "%1$s, %3$s %2$s%6$s, %8$s %7$s" + "%3$s %2$s%8$s %7$s %9$s" + "%1$s, %3$s %2$s%6$s, %8$s %7$s %9$s" + "%3$s %2$s, %5$s%8$s %7$s, %10$s" + "%1$s, %3$s %2$s, %5$s%6$s, %8$s %7$s, %10$s" + "%3$s %2$s %4$s, %5$s%8$s %7$s %9$s, %10$s" + "%1$s, %3$s %2$s %4$s, %5$s%6$s, %8$s %7$s %9$s, %10$s" + "%3$s/%2$s%8$s/%7$s" + "%1$s, %3$s/%2$s%6$s, %8$s/%7$s" + "%3$s/%2$s/%4$s%8$s/%7$s/%9$s" + "%1$s, %3$s/%2$s/%4$s%6$s, %8$s/%7$s/%9$s" + "%3$s/%2$s, %5$s%8$s/%7$s, %10$s" + "%1$s, %3$s/%2$s, %5$s%6$s, %8$s/%7$s, %10$s" + "%3$s/%2$s/%4$s, %5$s%8$s/%7$s/%9$s, %10$s" + "%1$s, %3$s/%2$s/%4$s, %5$s%6$s, %8$s/%7$s/%9$s, %10$s" + "%3$s%8$s %2$s" + "%1$s, %3$s %2$s%6$s, %8$s %7$s" + "%3$s%8$s %2$s %9$s" + "%1$s, %3$s %2$s %4$s%6$s, %8$s %7$s %9$s" + "%3$s %2$s, %5$s%8$s %7$s, %10$s" + "%1$s, %3$s %2$s, %5$s%6$s, %8$s %7$s, %10$s" + "%3$s %2$s %4$s, %5$s%8$s %7$s %9$s, %10$s" + "%1$s, %3$s %2$s %4$s, %5$s%6$s, %8$s %7$s %9$s, %10$s" + "%-d %b %Y" + + + + + + + "воскресенье" + "понедельник" + "вторник" + "среда" + "четверг" + "пятница" + "суббота" + "вс" + "пн" + "вт" + "ср" + "чт" + "пт" + "сб" + "вс" + "пн" + "вт" + "ср" + "чт" + "пт" + "сб" + "вс" + "пн" + "вт" + "с" + "чт" + "пт" + "сб" + "в" + "п" + "в" + "с" + "ч" + "п" + "с" + "январь" + "февраль" + "март" + "апрель" + "май" + "июнь" + "июль" + "август" + "сентябрь" + "октябрь" + "ноябрь" + "декабрь" + "янв" + "фев" + "мар" + "апр" + "май" + "июн" + "июл" + "авг" + "сен" + "окт" + "ноя" + "дек" + "Я" + "ф" + "м" + "а" + "м" + "и" + "и" + "а" + "с" + "о" + "н" + "д" + "%1$02d:%2$02d" + "%1$d:%2$02d:%3$02d" + "Выбрать все" + "Выбрать текст" + "Прекратить выбор текста" + "Вырезать" + "Вырезать все" + "Копировать" + "Копировать все" + "Вставить" + "Копировать URL" + "Способ ввода" + "Правка текста" + "Недостаточно места" + "В памяти телефона осталось мало места." + "ОК" + "Отмена" + "ОК" + "Отмена" + "ВКЛ" + "ВЫКЛ" + "Выполнить действие с помощью" + "Использовать для этого действия по умолчанию." + "Значения по умолчанию можно сбросить в разделе Настройки главного экрана > Приложения > Управление приложениями." + "Выберите действие" + "Нет приложений, которые могли бы выполнить это действие." + "Ой!" + "Приложение %1$s (процесс %2$s) неожиданно остановилось. Повторите попытку." + "Процесс %1$s неожиданно остановился. Повторите попытку." + "Ой!" + "Действие %1$s (в приложении %2$s) не отвечает." + "Действие %1$s (в процессе %2$s) не отвечает." + "Приложение %1$s (в процессе %2$s) не отвечает." + "Процесс %1$s не отвечает." + "Закрыть принудительно" + "Подождать" + "Отладка" + "Выберите действие для текста" + "Громкость звонка" + "Громкость звука мультимедиа" + "Воспроизводится через Bluetooth" + "Громкость звонка" + "Воспроизводится через Bluetooth" + "Громкость будильника" + "Громкость уведомления" + "Громкость" + "Мелодия звонка по умолчанию" + "Мелодия звонка по умолчанию (%1$s)" + "Тишина" + "Мелодии звонка" + "Неизвестная мелодия звонка" + + "Доступна сеть Wi-Fi" + "Доступны сети Wi-Fi" + + + "Доступна открытая сеть Wi-Fi" + "Доступны открытые сети Wi-Fi" + + "Вставка символа" + "Неизвестное приложение" + "Отправка SMS" + "Отправляется большое количество сообщений SMS. Выберите \"ОК\", чтобы продолжить, или \"Отмена\", чтобы остановить отправку." + "ОК" + "Отмена" + "Установить" + "По умолчанию" + "Не требуется разрешений" + "Скрыть" + "Показать все" + "Идет загрузка…" + "Подключение через USB" + "Вы подключили телефон к компьютеру через USB. Выберите \"Подключиться\" для копирования файлов между компьютером и картой SD телефона." + "Подключиться" + "Не подключаться" + "Не удается использовать карту SD в качестве USB-хранилища." + "Подключение через USB" + "Выберите для копирования файлов на/с компьютера." + "Выбор способа ввода" + "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ" + "0123456789АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ" + "кандидаты""u>" + diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index e30e31b2d68b8..27b8feac45e0c 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -18,23 +18,22 @@ "已针对以下内容启用了服务:" "服务已被禁用。" "注册成功。" - "清除成功" + "清除已成功。" "密码不正确。" - "MMI 已完成。" - "您键入的旧 PIN 不正确。" - "您键入的 PUK 不正确。" - "您输入的 PIN 不匹配。" - "键入一个 4 到 8 位数的 PIN。" - - - "键入 PUK2 以解锁 SIM 卡。" + "MMI 码已完成。" + "您键入的旧 PIN 码不正确。" + "您键入的 PUK 码不正确。" + "您输入的 PIN 码不匹配。" + "键入一个 4 到 8 位数的 PIN 码。" + "已对 SIM 卡进行 PUK 码锁定。键入 PUK 码将其解锁。" + "键入 PUK2 码以解锁 SIM 卡。" "来电者 ID" "去电者 ID" "呼叫转移" "呼叫等待" "呼叫限制" "密码更改" - "PIN 更改" + "PIN 码更改" "呼叫者 ID 默认情况下受限制。下一个呼叫:受限制" "呼叫者 ID 默认情况下受限制。下一个呼叫:不受限制" "呼叫者 ID 默认情况下不受限制。下一个呼叫:受限制" @@ -82,18 +81,18 @@ "屏幕锁定" "关机" "正在关机..." - "您的手机会关闭。" + "您的手机会关机。" "没有最近的应用程序。" "手机选项" "屏幕锁定" "关机" "静音模式" "声音已关闭" - "声音已“开启”" + "声音已开启" "安全模式" "需要您支付费用的服务" "允许应用程序执行可能需要您支付费用的操作。" - "您的消息" + "您的信息" "阅读并编写您的短信、电子邮件和其他消息。" "您的个人信息" "直接访问手机中存储的联系人和日历。" @@ -116,26 +115,26 @@ "展开/收拢状态栏" "允许应用程序展开或收拢状态栏。" "拦截去电" - "允许应用程序处理去电和更改要拨打的号码。恶意应用程序可能会监视、重定向或阻止去电。" + "允许应用程序处理去电和更改要拨打的号码。恶意应用程序可能会借此监视、重定向或阻止去电。" "接收短信" - "允许应用程序接收和处理短信。恶意应用程序可能监视您的消息,或将消息删除,而不向您显示。" + "允许应用程序接收和处理短信。恶意应用程序可能会借此监视您的信息,或将信息删除,而不向您显示。" "接收彩信" "允许应用程序接收和处理彩信。恶意应用程序可能会借此监视您的信息,或在您尚未看到的情况下就将其删除。" "发送短信" - "允许应用程序发送短信。恶意应用程序可能会在未经您确认的情况下发送消息从而让您支付费用。" + "允许应用程序发送短信。恶意应用程序可能会借此在未经您确认的情况下发送信息从而让您支付费用。" "读取短信或彩信" - "允许应用程序读取您的手机或 SIM 卡中存储的短信。恶意应用程序可能会读取您的机密消息。" + "允许应用程序读取您的手机或 SIM 卡中存储的短信。恶意应用程序可能会借此读取您的机密信息。" "编辑短信或彩信" - "允许应用程序写入手机或 SIM 卡中存储的短信。恶意应用程序可能会借此删除您的消息。" + "允许应用程序写入手机或 SIM 卡中存储的短信。恶意应用程序可能会借此删除您的信息。" "接收 WAP" - "允许应用程序接收和处理 WAP 消息。恶意应用程序可能监视您的消息,或将消息删除,而不向您显示。" - "检索运行的应用程序" - "允许应用程序检索有关当前和最近运行的任务的信息。恶意应用程序可能会利用此权限发现有关其他应用程序的私有信息。" + "允许应用程序接收和处理 WAP 信息。恶意应用程序可能会借此监视您的信息,或将信息删除,而不向您显示。" + "检索正在运行的应用程序" + "恶意应用程序可能会借此找到有关其他应用程序的私有信息。恶意应用程序可能会借此发现有关其他应用程序的私有信息。" "对正在运行的应用程序重新排序" "允许应用程序将任务移至前端和后台。恶意应用程序可能会借此强行进到前台,而不受您的控制。" "启用应用程序调试" - "允许应用程序启动对其他应用程序的调试。恶意应用程序可能利用此权限终止其他应用程序。" - "更改 UI 设置" + "允许应用程序启动对其他应用程序的调试。恶意应用程序可能会借此终止其他应用程序。" + "更改您的 UI 设置" "允许应用程序更改当前配置,例如语言设置或整体的字体大小。" "重新启动其他应用程序" "允许应用程序强制重新启动其他应用程序。" @@ -144,41 +143,39 @@ "强制应用程序关闭" "允许应用程序强制前台的任何活动关闭和重新开始。普通应用程序从不需要使用此权限。" "检索系统内部状态" - "允许应用程序检索系统的内部状态。恶意应用程序可能会检索通常它们本不需要的各种私有和安全信息。" + "允许应用程序检索系统的内部状态。恶意应用程序可能会借此检索通常它们本不需要的各种私有和安全信息。" "发布低级服务" - "允许应用程序发布自己的低级系统服务。恶意应用程序可能会攻击系统,以及盗取或破坏系统中的任何数据。" + "允许应用程序发布自己的低级系统服务。恶意应用程序可能会借此攻击系统,以及盗取或破坏系统中的任何数据。" "监视和控制所有应用程序启动" - "允许应用程序监视和控制系统启动活动的方式。恶意应用程序可能会彻底损坏系统。此权限仅在开发时才需要,普通的手机应用不需要。" + "允许应用程序监视和控制系统启动活动的方式。恶意应用程序可能会借此彻底损坏系统。此权限仅在开发时才需要,普通的手机应用不需要。" "发送包删除的广播" - "允许应用程序广播已删除某应用程序包的通知。恶意应用程序可能会利用此权限终止任何其他正在运行的应用程序。" + "允许应用程序广播已删除某应用程序包的通知。恶意应用程序可能会借此来终止任何其他正在运行的应用程序。" "发送短信收到的广播" - "允许应用程序广播已收到短信的通知。恶意应用程序可能会利用此权限伪造收到的短信。" + "允许应用程序广播已收到短信的通知。恶意应用程序可能会借此伪造收到的短信。" "发送 WAP-PUSH 收到的广播" - "允许应用程序播报收到 WAP PUSH 消息的通知。恶意应用程序可能会利用此权限乱发彩信或暗中用恶意内容替换任意网页中的内容。" - "限制运行进程的数量" - "允许应用程序控制运行的最大进程数。普通应用程序从不需要使用此权限。" + "允许应用程序播报收到 WAP PUSH 消息的通知。恶意应用程序可能会借此乱发彩信或暗中用恶意内容替换任意网页中的内容。" + "限制正在运行的进程数" + "允许应用程序控制运行的进程数上限。普通应用程序从不需要使用此权限。" "关闭所有后台应用程序" "允许应用程序控制活动是否始终是一转至后台就完成。普通应用程序从不需要使用此权限。" "自动安装系统更新" - "允许应用程序接收有关未决系统更新的通知并安装这些更新。恶意应用程序可能会利用此权限通过未经授权的更新破坏系统,通常情况下,它们会干扰更新过程。" + "允许应用程序接收有关未决系统更新的通知并安装这些更新。恶意应用程序可能会借此通过未经授权的更新破坏系统,通常情况下,它们会干扰更新过程。" "修改电池统计信息" "允许修改收集的电池统计信息。普通应用程序不能使用此权限。" "显示未授权的窗口" "允许创建专用于内部系统用户界面的窗口。普通应用程序不能使用此权限。" "显示系统级警报" - "允许应用程序显示系统警报窗口。恶意应用程序可能借此掌控整个手机屏幕。" + "允许应用程序显示系统警报窗口。恶意应用程序可能会借此掌控整个手机屏幕。" "修改全局动画速度" "允许应用程序随时更改全局动画速度(加快或减慢动画)。" "管理应用程序令牌" "允许应用程序创建和管理自己的令牌,从而绕开其常规的 Z 方向。普通应用程序从不需要使用此权限。" "按键和控制按钮" - "允许应用程序将其自己的输入活动(按键等)提供给其他应用程序。恶意应用程序可能会利用此权限掌控手机。" + "允许应用程序将其自己的输入活动(按键等)提供给其他应用程序。恶意应用程序可能会借此掌控手机。" "记录您键入的内容和执行的操作" "即使在与其他应用程序交互时(例如输入密码),也允许应用程序查看您按的键。普通应用程序从不需要使用此权限。" - - - - + "绑定到输入方法" + "允许持有者绑定到输入方法的顶级接口。普通应用程序从不需要使用此权限。" "更改屏幕方向" "允许应用程序随时更改屏幕的旋转方向。普通应用程序从不需要使用此权限。" "向应用程序发送 Linux 信号" @@ -186,7 +183,7 @@ "让应用程序始终运行" "允许应用程序部分持续运行,这样系统便不能将其用于其他应用程序。" "删除应用程序" - "允许应用程序删除 Android 包。恶意应用程序可能利用此权限删除重要的应用程序。" + "允许应用程序删除 Android 包。恶意应用程序可能会借此删除重要的应用程序。" "删除其他应用程序的数据" "允许应用程序清除用户数据。" "删除其他应用程序的缓存" @@ -194,7 +191,7 @@ "计算应用程序存储空间" "允许应用程序检索其代码、数据和缓存大小" "直接安装应用程序" - "允许应用程序安装新的或更新的 Android 程序包。恶意应用程序可能会利用此权限添加其具有任意权限的新应用程序。" + "允许应用程序安装新的或更新的 Android 包。恶意应用程序可能会借此添加其具有任意权限的新应用程序。" "删除所有应用程序缓存数据" "允许应用程序通过删除应用程序缓存目录中的文件释放手机存储空间。通常只限于访问系统进程。" "读取系统日志文件" @@ -202,42 +199,39 @@ "读取/写入诊断拥有的资源" "允许应用程序读取和写入诊断组拥有的任何资源;例如 /dev 中的文件。这可能会潜在地影响系统稳定性和安全性。此权限只应用于由制造商或操作员执行的硬件特定的诊断。" "启用或禁用应用程序组件" - - + "允许应用程序更改是否启用其他应用程序的组件。恶意应用程序可能会借此来禁用重要的手机功能。使用此权限时务必谨慎,因为这可能导致应用程序组件进入不可用、不一致或不稳定的状态。" "设置首选的应用程序" - "允许应用程序修改首选的应用程序。恶意应用程序可能会利用此权限暗中更改运行的应用程序,从而骗过您的现有应用程序来收集您的私密数据。" + "允许应用程序修改首选的应用程序。恶意应用程序可能会借此暗中更改运行的应用程序,从而骗过您的现有应用程序来收集您的私有数据。" "修改全局系统设置" - "允许应用程序修改系统的设置数据。恶意应用程序可能借此破坏您的系统配置。" - - - - + "允许应用程序修改系统的设置数据。恶意应用程序可能会借此破坏您的系统配置。" + "修改安全系统设置" + "允许应用程序修改系统安全设置数据。普通应用程序不能使用此权限。" "修改 Google 服务地图" "允许应用程序修改 Google 服务地图。普通应用程序不能使用此权限。" "引导时自动启动" "允许应用程序在系统完成引导后即自行启动。这样会加长启动手机所需的时间,而且如果应用程序一直运行,会降低手机的整体速度。" "发送顽固广播" - "允许应用程序发送顽固广播,这些广播在结束后仍会保留。恶意应用程序可能会使手机使用太多内存,从而降低其速度和稳定性。" + "允许应用程序发送顽固广播,这些广播在结束后仍会保留。恶意应用程序可能会借此使手机使用太多内存,从而降低其速度和稳定性。" "读取联系数据" - "允许应用程序读取您手机中存储的所有联系(地址)数据。恶意应用程序可能利用此权限将您的数据发送给其他人。" + "允许应用程序读取您手机中存储的所有联系(地址)数据。恶意应用程序可能会借此将您的数据发送给其他人。" "写入联系数据" - "允许应用程序修改您手机中存储的联系(地址)数据。恶意应用程序可能会利用此权限清除或修改您的联系数据。" + "允许应用程序修改您手机中存储的联系(地址)数据。恶意应用程序可能会借此清除或修改您的联系数据。" "写入所有者数据" - "允许应用程序修改您手机中存储的手机所有者数据。恶意应用程序可能会利用此权限清除或修改所有者数据。" + "允许应用程序修改您手机中存储的手机所有者数据。恶意应用程序可能会借此清除或修改所有者数据。" "读取所有者数据" - "允许应用程序读取您手机中存储的手机所有者数据。恶意应用程序可能会利用此权限读取手机所有者数据。" + "允许应用程序读取您手机中存储的手机所有者数据。恶意应用程序可能会借此读取手机所有者数据。" "读取日历数据" - "允许应用程序读取您手机中存储的所有日历活动。恶意应用程序可能利用此权限将您的日历活动发送给其他人。" + "允许应用程序读取您手机中存储的所有日历活动。恶意应用程序可能会借此将您的日历活动发送给其他人。" "写入日历数据" - "允许应用程序修改您手机中存储的日历活动。恶意应用程序可能会利用此权限清除或修改您的日历数据。" + "允许应用程序修改您手机中存储的日历活动。恶意应用程序可能会借此清除或修改您的日历数据。" "用于测试的模仿位置源" - "创建用于测试的模仿位置源。恶意应用程序可能会利用此权限替代真正的位置源(例如 GPS 或网络提供商)返回的位置和/或状态。" + "创建用于测试的模仿位置源。恶意应用程序可能会借此替代真正的位置源(例如 GPS 或网络提供商)返回的位置和/或状态。" "访问额外的位置提供程序命令" - "访问额外的位置提供程序命令。恶意应用程序可能会利用此权限干扰 GPS 或其他位置源的操作。" + "访问额外的位置提供程序命令。恶意应用程序可能会借此干扰 GPS 或其他位置源的操作。" "精准 (GPS) 位置" - "访问精准的位置源,例如手机上的全球定位系统(如果有)。恶意应用程序可能会利用此权限确定您所处的位置,并可能消耗额外的电池电量。" + "访问精准的位置源,例如手机上的全球定位系统(如果有)。恶意应用程序可能会借此确定您所处的位置,并可能消耗额外的电池电量。" "粗略(基于网络的)位置" - "访问粗略的位置源(例如蜂窝网络数据库)以确定手机的大体位置(如果适用)。恶意应用程序可能利用此权限来确定您所处的大体位置。" + "访问粗略的位置源(例如蜂窝网络数据库)以确定手机的大体位置(如果适用)。恶意应用程序可能会借此来确定您的大体位置。" "访问 SurfaceFlinger" "允许应用程序使用 SurfaceFlinger 低级功能。" "读取帧缓冲区" @@ -247,7 +241,7 @@ "录音" "允许应用程序访问录音路径。" "拍照" - "允许应用程序通过相机拍照。此权限使应用程序可随时收集相机正在拍摄的图片。" + "允许应用程序通过相机拍照。这样应用程序可随时收集相机正在拍摄的图片。" "永久禁用手机" "允许应用程序永久禁用整个手机,这是很危险的。" "强制手机重新引导" @@ -261,9 +255,9 @@ "测试硬件" "允许应用程序控制各外围设备以进行硬件测试。" "直接呼叫电话号码" - "允许应用程序在没有您干预的情况下呼叫电话号码。恶意应用程序可能在您的电话帐单上产生意外呼叫。请注意,此权限不允许应用程序呼叫紧急电话号码。" + "允许应用程序在没有您干预的情况下呼叫电话号码。恶意应用程序可能会借此在您的电话帐单上产生意外呼叫。请注意,此权限不允许应用程序呼叫紧急电话号码。" "直接呼叫任何电话号码" - "允许应用程序在没有您干预的情况下呼叫任何电话号码(包括紧急电话号码)。恶意应用程序可能对紧急服务拨打骚扰电话和非法电话。" + "允许应用程序在没有您干预的情况下呼叫任何电话号码(包括紧急电话号码)。恶意应用程序可能会借此对紧急服务拨打骚扰电话和非法电话。" "控制位置更新通知" "允许启用/禁用来自收音机的位置更新通知。普通应用程序不能使用此权限。" "访问检入属性" @@ -271,7 +265,7 @@ "修改手机状态" "允许应用程序控制设备的手机功能。具有此权限的应用程序可能会切换网络,打开和关闭手机收音机以及类似操作,而不会通知您。" "读取手机状态" - "允许应用程序访问设备的电话功能。具有这种权限的应用程序可确定此电话的电话号码、是否在进行通话以及通话对方的号码等。" + "允许应用程序访问设备的电话功能。具有此权限的应用程序可确定此电话的电话号码、是否在进行通话以及通话对方的号码等。" "防止手机休眠" "允许应用程序防止手机进入休眠状态。" "开机或关机" @@ -280,8 +274,8 @@ "作为一项低级制造商测试来运行,从而允许对手机硬件进行完全访问。此权限仅当手机在制造商测试模式下运行时才可用。" "设置壁纸" "允许应用程序设置系统壁纸。" - "精确设置壁纸大小" - "允许应用程序精确设置系统壁纸大小。" + "大体设置壁纸大小" + "允许应用程序大体设置系统壁纸大小。" "将系统重设为出厂默认值" "允许应用程序将系统完全重设为其出厂设置,即清除所有数据、配置和安装的应用程序。" "设置时区" @@ -307,7 +301,7 @@ "禁用键锁" "允许应用程序禁用键锁和任何关联的密码安全措施。这种情况的一个恰当示例就是这样一个手机:当收到来电时禁用键锁,当通话结束后再重新启用键锁。" "读取同步设置" - "允许应用程序读取同步设置,例如是否针对“联系人”启用同步。" + "允许应用程序读取同步设置,例如是否为“联系人”启用同步。" "写入同步设置" "允许应用程序修改同步设置,例如是否针对“联系人”启用同步。" "读取同步统计信息" @@ -316,11 +310,39 @@ "允许应用程序获取有关当前同步的供稿的详情。" "写入订阅的供稿" "允许应用程序修改您当前同步的供稿。这样恶意程序可以更改您同步的供稿。" - - - - - + + "家庭" + "手机" + "工作" + "工作传真" + "家庭传真" + "寻呼机" + "其他" + "自定义" + + + "家庭" + "工作" + "其他" + "自定义" + + + "家庭" + "工作" + "其他" + "自定义" + + + "家庭" + "工作" + "其他" + "自定义" + + + "工作" + "其他" + "自定义" + "AIM" "Windows Live" @@ -331,29 +353,25 @@ "ICQ" "Jabber" - - + "输入 PIN 码" "PIN 码不正确!" "要解锁,请按“菜单”,然后按 0。" "紧急电话号码" "(无服务)" - - + "屏幕已锁定。" "按“菜单”解锁或拨打紧急电话。" "按“菜单”解锁。" - - + "绘制解锁图案" "紧急电话" "正确!" - - + "很抱歉,请重试" "正在充电 (%d%%)" "连接您的充电器。" "没有 SIM 卡。" "手机中无 SIM 卡。" "请插入 SIM 卡。" "网络已锁定" - "SIM 卡已被 PUK 锁定。" + "已对 SIM 卡进行 PUK 码锁定。" "请联系客服部门。" "SIM 卡已被锁定。" "正在解锁 SIM 卡..." @@ -362,17 +380,14 @@ "%d 秒后重试。" "忘记了图案?" "图案尝试次数太多!" - - + "要解锁,"\n"请用您的 Google 帐户登录" "用户名(电子邮件)" "密码" "登录" "用户名或密码无效。" "h:mm AA" - - - - + "%-l:%M%P" + "%-l:%M%p" @@ -386,7 +401,7 @@ "正在充电..." "请连接充电器" "电量在减少:" - "剩余电量不足 %d%%" + "剩余电量不足 %d%%。" "出厂测试失败" "只有在 /system/app 中安装的包支持 FACTORY_TEST 操作。" "未发现支持 FACTORY_TEST 操作的包。" @@ -487,11 +502,11 @@ "无法播放视频" "很抱歉,此视频不能播放。" "确定" - "AM" - "PM" + "上午" + "下午" "%Y%m%d 日" "%2$s%1$s %3$s%5$s%4$s %6$s" - "%2$s%1$s%5$s%4$s" + "%2$s%1$s%5$s%4$s" "%2$s %3$s%5$s %6$s" "%2$s%5$s" "%1$s%2$s" @@ -506,7 +521,7 @@ "yyyyMMMMdd 日" "yyyyMMMMdd 日" "yyyyMMMdd 日" - "yyyyMMMdd 日" + "yyyyddMMM 日" "h:mm a" "H:mm" "中午" @@ -529,7 +544,7 @@ "%2$s%3$s%5$s%7$s%8$s%10$s" "%2$s%3$s%1$s %5$s%7$s%8$s%6$s %10$s" "%4$s%2$s%3$s%5$s%9$s%7$s%8$s%10$s" - "%4$s%2$s%3$s%1$s %5$s%9$s%7$s%8$s%6$s %10$s" + "%4$s%2$s%3$s%1$s %5$s 至 – %9$s%7$s%8$s%6$s %10$s" "%2$s%3$s 日至 %7$s%8$s 日" "%2$s%3$s%1$s%7$s%8$s%6$s" "%4$s%2$s%3$s 日至 %9$s%7$s%8$s 日" @@ -537,7 +552,7 @@ "%2$s%3$s%5$s%7$s%8$s%10$s" "%2$s%3$s%1$s %5$s%7$s%8$s%6$s %10$s" "%4$s%2$s%3$s%5$s%9$s%7$s%8$s%10$s" - ",%4$s%2$s%3$s%1$s %5$s%9$s%7$s%8$s%6$s %10$s" + "%4$s%2$s%3$s%1$s %5$s%9$s%7$s%8$s%6$s %10$s" "%2$s%3$s 日至 %8$s 日" "%2$s%3$s%1$s%7$s%8$s%6$s" "%9$s%2$s%3$s 日至 %8$s 日" @@ -627,20 +642,16 @@ "%1$02d:%2$02d" "%1$d:%2$02d:%3$02d" "全选" - - - - + "选择文本" + "停止选择文本" "剪切" "全部剪切" "复制" "全部复制" "粘贴" "复制网址" - - - - + "输入方法" + "编辑文本" "存储空间不足" "手机存储空间在减少。" "正常" @@ -666,24 +677,19 @@ "等待" "调试" "选择一个文本操作" - "铃声音量" - - - - + "响铃音量" + "媒体音量" + "正通过蓝牙播放" "来电音量" - - + "正通过蓝牙播放" "警告音量" - - + "通知音量" "音量" "默认的手机铃声" - "删除手机铃声(%1$s)" + "默认的手机铃声(%1$s)" "静音" - - - "未知的手机铃声" + "铃声" + "未知手机铃声" "有可用的 Wi-Fi 网络" "有可用的 Wi-Fi 网络" @@ -692,9 +698,8 @@ "打开可用的 Wi-Fi 网络" "打开可用的 Wi-Fi 网络" - - - "未知的应用程序" + "插入字符" + "未知应用程序" "正在发送短信" "正在发送大量短信。选择“确定”继续,或选择“取消”停止发送。" "确定" @@ -712,12 +717,8 @@ "使用 SD 卡进行 USB 存储时出现问题。" "USB 已连接" "选择以将文件复制到计算机或从计算机复制文件。" - - - - - - - - + "选择输入方法" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "候选人""u>" diff --git a/core/res/res/values-zh-rTW/arrays.xml b/core/res/res/values-zh-rTW/arrays.xml new file mode 100644 index 0000000000000..f9c904be4c64c --- /dev/null +++ b/core/res/res/values-zh-rTW/arrays.xml @@ -0,0 +1,4 @@ + + + diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml new file mode 100644 index 0000000000000..b95ca98c191db --- /dev/null +++ b/core/res/res/values-zh-rTW/strings.xml @@ -0,0 +1,724 @@ + + + "位元組" + "KB" + "MB" + "GB" + "TB" + "PB" + "(未命名)" + "..." + "(沒有電話號碼)" + "(未知的)" + "語音信箱" + "MSISDN1" + "連線發生問題或錯誤的 MMI 碼。" + "服務已啟動。" + "已啟動服務:" + "服務已停用。" + "註冊成功。" + "清除成功。" + "密碼錯誤。" + "MMI 完成。" + "您輸入的舊 PIN 不正確。" + "您輸入的 PUK 不正確。" + "您輸入的 PIN 不符合。" + "輸入 4~8 個數字的 PIN。" + "SIM 卡的 PUK 已鎖定。請輸入 PUK 碼解除鎖定。" + "請輸入 PUK2 以解鎖 SIM 卡。" + "來電號碼" + "發話號碼" + "通話指定轉接" + "話中插接" + "通話限制" + "變更密碼" + "PIN 已變更" + "預設不顯示本機號碼,下一通也不顯示。" + "預設不顯示本機號碼,但下一通電話顯示。" + "預設顯示本機號碼,但下一通不顯示。" + "預設顯示本機號碼,下一通也顯示。" + "服務未設定完成。" + "本機號碼設定無法變更。" + "語音" + "資料" + "傳真" + "SMS" + "非同步" + "同步處理" + "封包" + "按鍵" + "{0}:未轉接" + "{0}: {1}" + "{0}{2} 秒後 {1}" + "{0}:未轉接" + "{0}:未轉接" + "確定" + "網頁內容錯誤。" + "找不到網址。" + "不支援此網站驗證機制。" + "驗證失敗。" + "透過 proxy 伺服器驗證失敗。" + "連線到伺服器失敗。" + "無法與伺服器溝通,請稍後再試一次 。" + "連線到伺服器逾時。" + "此網頁包含太多伺服器轉址。" + "不支援此通訊協定。" + "無法建立安全連線。" + "由於網址錯誤,無法開啟此網頁。" + "無法存取此檔案。" + "找不到要求的檔案。" + "太多執行要求。請稍後再試一次。" + "同步處理" + "同步處理" + "太多 %s 要刪除。" + "手機儲存空間已滿!請刪除一些檔案增加空間。" + "我" + "電話選項" + "靜音模式" + "開啟無線網路" + "關閉無線網路" + "螢幕鎖定" + "關機" + "關機中..." + "手機即將關機。" + "最近沒有存取應用程式。" + "電話選項" + "螢幕鎖定" + "關機" + "靜音模式" + "音效已關閉" + "聲音已開啟" + "安全模式" + "需要額外費用的服務。" + "若您允許應用程式執行此操作,可能需要支付一些費用。" + "您的簡訊" + "讀取編輯 SMS、電子郵件與其他簡訊。" + "您的個人資訊" + "直接存取手機上的通訊錄與行事曆。" + "您的位置" + "監視實際位置" + "網路通訊" + "允許應用程式存取多項網路功能。" + "您的 Google 帳戶" + "存取可用 Google 帳戶。" + "硬體控制" + "在免持設備上直接存取硬體。" + "撥打電話" + "監控、記錄與進行通話。" + "系統工具" + "系統低階存取與控制。" + "開發工具" + "只有開發者需要此功能。" + "停用或變更狀態列" + "允許應用程式停用狀態列或新增、移除系統圖示。" + "展開/收攏狀態列" + "允許應用程式展開或收攏狀態列。" + "攔截發話" + "允許應用程式撥打電話、變更撥號號碼。惡意程式可能會以此監控,轉向或阻擋發話。" + "接收 SMS" + "允許應用程式接收、處理 SMS 簡訊。惡意程式可使用此功能監控簡訊或在您讀取前擅自刪除。" + "接收 MMS" + "允許應用程式接收、處理 MMS 簡訊。惡意程式可使用此功能監控簡訊或在您讀取前擅自刪除。" + "傳送 SMS 簡訊" + "允許應用程式傳送 SMS 簡訊。惡意程式可能會擅自傳送簡訊,增加您的花費。" + "讀取 SMS 或 MMS" + "允許應用程式讀取手機或 SIM 卡上的 SMS 簡訊。惡意程式可能會利用此功能讀取您的機密簡訊。" + "編輯 SMS 或 MMS" + "允許應用程式編輯 SMS 簡訊,存入手機或 SIM 卡。惡意程式可能會刪除您的簡訊。" + "接收 WAP" + "允許應用程式接收、處理 WAP 簡訊。惡意程式可使用此功能監控簡訊或在您讀取前擅自刪除。" + "取得執行中應用程式" + "允許應用程式取得最近執行任務的資訊。惡意程式可利用此功能找出其他應用程式的隱私資訊。" + "重新安排執行中的應用程式" + "允許應用程式將任務移至前端與背景處理。惡意程式可使用此功能將自己強制拉到前端。" + "啟動應用程式除錯" + "允許應用程式為其他程式開啟除錯功能。惡意程式可利用此功能終止其他應用程式。" + "變更介面設定" + "允許應用程式變更目前設定,例如:地區或字型大小。" + "重新啟動其他應用程式" + "允許應用程式強制重新啟動其他應用程式。" + "保持已停止狀態" + "允許應用程式在前端執行任何程序 (無法中止)。一般應用程式不需要此功能。" + "強制關閉應用程式" + "允許應用程式強制關閉在前端運作的活動並返回。一般應用程式不需要此功能。" + "接收系統內部狀態" + "允許應用程式取得系統內部狀態。惡意程式可利用此功能,取得他們應該不需要的私人、安全資料。" + "發行低階服務" + "允許應用程式發行自有低階系統服務。惡意程式可利用此功能綁架系統或偷取、竄改資料內容。" + "監視控制所有應用程式啟動狀態。" + "允許應用程式監控管理系統啟動活動。惡意程式可能因此癱瘓整個系統。此權限只在開發時需要,一般手機使用不需要此權限。" + "傳送程式已移除廣播" + "允許應用程式在程式被移除時,發送廣播通知。惡意程式可利用此功能,關閉其他正在執行的程式。" + "傳送已接收 SMS 廣播" + "允許應用程式收到 SMS 簡訊時,廣播收訊通知。惡意程式可利用此功能,偽造 SMS 簡訊。" + "送出「WAP PUSH 已接收」廣播" + "允許應用程式收到 WAP PUSH 簡訊時,廣播收訊通知。惡意程式可利用此功能,偽造 MMS 簡訊回條或秘密更換網頁內容。" + "執行程序限制數" + "允許應用程式控制可使用的最大執行緒。一般應用程式不需要此功能。" + "關閉所有背景程式" + "允許應用程式控制哪些活動在被移到背景執行時,儘速結束。一般應用程式不需要此功能。" + "自動安裝系統更新" + "允許應用程式接收系統更新擱置通知,並觸發安裝程序。惡意程式可使用未授權更新竄改系統,或干擾更新程序。" + "編輯電池狀態" + "允許修改電池狀態。一般應用程式不會使用此功能。" + "顯示未授權視窗" + "允許內部系統使用介面建立視窗。一般應用程式不會使用此功能。" + "顯示系統警告" + "允許應用程式顯示系統警告視窗。惡意程式可使用此功能接管手機螢幕。" + "編輯全域動畫速度" + "允許應用程式變更全域動畫速度 (更快或更慢)。" + "管理應用程式 token" + "允許應用程式略過一般 Z-ordering,建立與管理自己的 token。一般應用程式不需要此功能。" + "按下按鍵以及控制各按鈕" + "允許應用程式發送輸入事件 (按鍵等) 給其他應用程式。惡意程式可使用此功能接管手機。" + "錄製輸入的內容與動作" + "允許應用程式在使用者操作其他程式時 (例如:輸入密碼),仍可監看輸入的按鍵。一般應用程式應不需要此功能。" + "連結至輸入法" + "允許擁有人連結至輸入法的最頂層介面。一般應用程式不需使用此選項。" + "變更螢幕顯示方向" + "允許應用程式隨時變更螢幕顯示方向。一般應用程式不需要此功能。" + "傳送 Linux 訊號到應用程式" + "允許應用程式要求將支援的訊號傳送到所有持續的程序。" + "設定應用程式持續執行" + "允許應用程式持續執行,避免系統將它應用到其他程式。" + "刪除應用程式" + "允許應用程式刪除 Android 程式。惡意程式可利用此功能刪除重要應用程式。" + "刪除其他應用程式資料" + "允許應用程式清除使用者資料。" + "刪除其他應用程式快取" + "允許應用程式刪除快取檔案。" + "估算應用程式占用的儲存空間" + "允許應用程式取得程式碼、資料與快取大小" + "直接安裝應用程式" + "允許應用程式安裝新的 Android 程式或更新。惡意程式可利用此功能新增具有高權限的程式。" + "刪除所有應用程式快取資料。" + "允許應用程式刪除快取目錄裡的檔案,釋放儲存空間。此操作通常受到系統程序嚴格限制。" + "讀取系統記錄檔" + "允許應用程式讀取系統記錄檔。此項操作可讓應用程式了解目前手機操作狀態,但內容應不含任何個人或隱私資訊。" + "讀寫 diag 擁有的資源" + "允許應用程式讀寫 diag 群組的資源;例如:/dev 裡的檔案。這可能會影響系統穩定性與安全性。此功能僅供製造商或技術人員用於硬體規格偵測。" + "啟用或停用應用程式元件" + "允許應用程式變更是否啟用其他元件或應用程式。惡意程式可利用此功能,停用重要的手機功能。請在取得許可的狀態下小心使用,此功能可能導致應用程式元件無法使用、不一致或不穩定。" + "設定喜好的應用程式" + "允許應用程式修改您偏好使用的應用程式。惡意程式可能依此秘密竄改執行的程式,偽造已存在的程式以收集私人資料。" + "編輯全域系統設定" + "允許應用程式修改系統設定。惡意程式可使用此功能中斷系統設定。" + "編輯安全系統設定" + "允許應用程式修改系統的安全設定資料。一般應用程式不會使用此功能。" + "修改 Google 服務地圖" + "允許應用程式修改 Google 服務地圖。一般應用程式不會使用此功能。" + "開機時自動啟用" + "允許應用程式在開機後盡快啟動。此項設定會讓開機時間拉長,並允許應用程式持續執行,因此拖慢手機速度。" + "傳送附屬廣播" + "允許應用程式在廣播結束後,持續送出附屬廣播。惡意程式可利用此功能,佔據過多記憶體,讓手機變慢或不穩定。" + "讀取聯絡人資料" + "允許應用程式讀取手機上所有聯絡人 (地址)。惡意程式可利用此功能將您的資料傳送給其他人。" + "輸入聯絡人資料" + "允許應用程式更改聯絡資訊 (地址)。惡意程式可利用此功能,清除或修改聯絡資料。" + "輸入擁有者資料" + "允許應用程式更改手機擁有者資料。惡意程式可利用此功能,清除或修改擁有者資料。" + "讀取擁有者資料" + "允許應用程式讀取手機擁有者資料。惡意程式可利用此功能讀取擁有者資料。" + "讀取行事曆資料" + "允許應用程式讀取手機上所有行事曆行程。惡意程式可利用此功能將您的行事曆行程傳送給其他人。" + "寫入行事曆資料" + "允許應用程式更改行事曆行程。惡意程式可利用此功能,清除或修改行事曆資料。" + "模擬位置來源以供測試" + "建立模擬位置來源以供測試。惡意程式可利用此功能覆寫 GPS 或網路服務商回傳的位置及/或狀態。" + "存取額外位置提供者命令" + "存取額外位置提供者命令。惡意程式可利用此功能干擾 GPS 或其他位置來源。" + "良好的 (GPS) 位置" + "存取正確位置來源,例如:手機 GPS。惡意程式可使用此功能知道您的位置,並且可能額外消耗電力。" + "大略位置 (以網路為基準)" + "接收粗略的位置來源 (例如:行動網路資料庫),計算出目前大概位置。惡意程式可使用此功能得知您的所在地。" + "存取 SurfaceFlinger" + "允許應用程式使用 SurfaceFlinger 低階功能。" + "讀取框架緩衝" + "允許應用程式讀取框架緩衝的內容。" + "變更音訊設定" + "允許應用程式編輯全域音訊設定,例如音量與路由。" + "錄製音訊" + "允許應用程式存取音訊錄製路徑。" + "照相" + "允許應用程式使用相機照相。此功能可讓應用程式隨時透過相機拍攝照片。" + "永久停用電話" + "允許應用程式永久停用手機。此項操作非常危險。" + "強制重開機" + "允許應用程式強制重開機。" + "掛載/卸載檔案系統" + "允許應用程式掛載/卸載抽取式儲存設備的檔案系統。" + "控制震動器" + "允許應用程式控制震動器。" + "控制閃光燈" + "允許應用程式控制閃光燈。" + "測試硬體" + "允許應用程式控制各種週邊設備,以供測試用。" + "直接撥打電話號碼" + "允許應用程式自行撥打電話。惡意程式可能會撥打其他電話,造成額外支出。但請注意此選項不允許應用程式撥打緊急電話號碼。" + "直接撥打任何電話號碼" + "允許應用程式自行撥打任何電話號碼,包括緊急電話號碼。惡意程式可利用此功能濫用緊急服務,撥打不需要或違法的電話。" + "控制位置更新通知" + "允許啟用/停用無線通訊位置更新通知。一般應用程式不會使用此功能。" + "存取登機選項" + "允許讀寫登機服務上傳的資料。一般應用程式不會使用此功能。" + "修改手機狀態" + "允許應用程式控制電話功能。擁有此權限的程式可自行切換網路、開關無線通訊功能。" + "讀取手機狀態" + "允許應用程式存取裝置的電話功能。通話時,有此權限的應用程式可設定手機是否通話、撥出的號碼等等。" + "防止手機進入待命狀態" + "允許應用程式阻止手機進入待命。" + "開啟或關閉電源" + "允許應用程式開啟或關閉電話。" + "在出廠測試模式下執行" + "執行低階製造商測試,允許完全存取手機硬體。此功能只能在手機是製造商測試模式下才可執行。" + "設定桌布" + "允許應用程式設定系統桌布。" + "設定桌布大小提示" + "允許應用程式設定系統桌布大小提示。" + "將系統回復出廠預設值" + "允許應用程式將手機完全重設至出廠設定,清除所有資料、設定與已安裝程式。" + "設定時區" + "允許應用程式變更時區。" + "發現已知帳戶。" + "允許應用程式取得手機上的帳戶清單。" + "檢視網路狀態" + "允許應用程式檢視網路狀態。" + "完整網際網路存取" + "允許應用程式建立網路設定。" + "輸入存取點名稱設定" + "允許應用程式修改 APN 設定,例如:Proxy 及 APN 的連接埠。" + "變更網路連線" + "允許應用程式變更網路連線狀態。" + "檢視 Wi-Fi 狀態" + "允許應用程式檢視 Wi-Fi 狀態資訊。" + "變更 Wi-Fi 狀態" + "允許應用程式與 Wi-Fi 存取點連線或斷線,並可變更 Wi-Fi 網路設定。" + "藍牙管理" + "允許應用程式設定本機藍牙電話,以及偵測與配對其他遠端裝置。" + "建立藍牙連線" + "允許應用程式檢視本地藍牙電話設定,並與其他配對裝置連線。" + "停用按鍵鎖定" + "允許應用程式停用按鍵鎖定以及其他相關的密碼安全性。合理的範例是:收到來電時解開按鍵鎖定,通話結束後重新啟動按鍵鎖定。" + "讀取同步處理設定" + "允許應用程式讀取同步處理設定,例如:是否同步處理 [通訊錄]。" + "編輯同步處理設定" + "允許應用程式修改同步處理設定,例如:是否要同步處理 [通訊錄]。" + "讀取同步處理狀態" + "允許應用程式讀取同步處理狀態;例如:同步處理記錄。" + "讀取訂閱資訊提供" + "允許應用程式取得目前已同步處理的資訊提供。" + "寫入訂閱資訊提供" + "允許應用程式修改已同步處理的資訊提供。惡意程式可使用此功能變更已同步處理的資訊提供。" + + "首頁" + "行動" + "工作" + "辦公傳真" + "家用傳真" + "呼叫器" + "其他" + "自訂" + + + "首頁" + "工作" + "其他" + "自訂" + + + "首頁" + "工作" + "其他" + "自訂" + + + "首頁" + "工作" + "其他" + "自訂" + + + "工作" + "其他" + "自訂" + + + "AIM" + "Windows Live" + "Yahoo" + "Skype" + "QQ" + "Google Talk" + "ICQ" + "Jabber" + + "輸入 PIN 碼" + "PIN 碼錯誤!" + "若要解鎖,按下 [選單]、[0]。" + "緊急電話號碼" + "(沒有服務)" + "螢幕已鎖定。" + "按下 [選單] 解鎖或撥打緊急電話。" + "按下 [選單] 解鎖。" + "畫出解鎖圖形" + "緊急電話" + "正確!" + "抱歉,請再試一次" + "充電中 (%d%%)" + "請連接充電器。" + "沒有 SIM 卡。" + "手機未插入 SIM 卡。" + "請插入 SIM 卡。" + "網路已鎖定" + "SIM 的 PUK 已鎖定。" + "請聯絡客服中心。" + "SIM 卡已鎖定。" + "解鎖 SIM 卡中..." + "畫出解鎖圖形已錯誤 %d 次。"\n\n" 請在 %d 秒後再嘗試。" + "畫出解鎖圖形已錯誤 %d 次。再錯誤 %d 次後,系統會要求使用 Google 登入來解鎖。"\n\n" 請在 %d 秒後再試一次。" + "%d 秒後再試一次。" + "忘記解鎖圖形?" + "解鎖圖形出錯次數過多!" + "若要解鎖,"\n"請以您的 Google 帳戶登入" + "使用者名稱 (電子郵件)" + "密碼" + "登入" + "使用者名稱或密碼錯誤。" + "h:mm AA" + "%-l:%M%P" + "%-l:%M%p" + + + + + "清除通知" + "沒有通知" + "進行中" + "通知" + + + "充電中" + "請連接充電器" + "電池電量即將不足:" + "電池電量不到 %d%%。" + "出廠測試失敗" + "FACTORY_TEST 動作只支援安裝在 /system/app 裡的程式。" + "找不到提供 FACTORY_TEST 的程式。" + "重新開機" + "確認" + "是否記憶此密碼?" + "現在不要" + "記住" + "從不" + "您沒有開啟此頁的權限。" + "已複製到剪貼簿的文字。" + "更多" + "[選單]+" + "空白鍵" + "輸入" + "刪除" + "搜尋" + "今天" + "昨天" + "明天" + "1 個月以前" + "1 個月前" + + "1 秒以前" + "%d 秒以前" + + + "1 分鐘以前" + "%d 分鐘以前" + + + "1 小時以前" + "%d 小時以前" + + + "昨天" + "%d 天以前" + + + "1 秒內" + "在 %d 秒內" + + + "1 分鐘內" + "在 %d 分鐘內" + + + "1 小時內" + "%d 小時內" + + + "明天" + "%d 天內" + + + + + + + + + + + + + + + + + + "%s" + "%s" + "%s" + "天" + "天" + "小時" + "小時" + "分鐘" + "分鐘" + "秒" + "秒" + "週" + "週" + "年" + "年" + "星期日" + "星期一" + "星期二" + "星期三" + "星期四" + "星期五" + "星期六" + "每天 (週一至週五)" + "每天" + "每週 %s" + "每月" + "每年" + "無法播放影片" + "抱歉,無法撥放此影片。" + "確定" + "上午" + "下午" + "%m/%d/%Y" + "%1$s%2$s%3$s%4$s%5$s%6$s" + "%1$s%2$s%4$s%5$s" + "%2$s%3$s%5$s%6$s" + "%2$s%5$s" + "%1$s%2$s" + "%1$s%2$s%3$s" + "%2$s%3$s" + "%1$s%3$s" + + + + + "%1$s%2$s" + "MMMM ddyyyy" + "dd MMMMyyyy" + "MMM ddyyyy" + "dd MMMyyyy" + "h:mm a" + "H:mm" + "中午" + "中午" + "午夜" + "午夜" + + + + + "%B %-d%Y" + + + "%H:%M:%S" + "%H:%M:%S %B %-d%Y" + "%2$s %3$s%7$s %8$s" + "%1$s%2$s %3$s%6$s%7$s %8$s" + "%2$s %3$s%7$s %8$s%9$s" + "%1$s%2$s %3$s%6$s%7$s %8$s%9$s" + "%2$s %3$s%5$s%7$s %8$s%10$s" + "%1$s%2$s %3$s%5$s%6$s%7$s %8$s%10$s" + "%2$s %3$s%4$s%5$s%7$s %8$s%9$s%10$s" + "%1$s%2$s %3$s%4$s%5$s%6$s%7$s %8$s%9$s%10$s" + "%2$s/%3$s%7$s/%8$s" + "%1$s%2$s/%3$s%6$s%7$s/%8$s" + "%2$s/%3$s/%4$s%7$s/%8$s/%9$s" + "%1$s%2$s/%3$s/%4$s%6$s%7$s/%8$s/%9$s" + "%2$s/%3$s%5$s%7$s/%8$s%10$s" + "%1$s%2$s/%3$s%5$s%6$s%7$s/%8$s%10$s" + "%2$s/%3$s/%4$s%5$s%7$s/%8$s/%9$s%10$s" + "%1$s%2$s/%3$s/%4$s%5$s%6$s%7$s/%8$s/%9$s%10$s" + "%2$s %3$s%8$s" + "%1$s%2$s %3$s%6$s%7$s %8$s" + "%2$s %3$s%8$s%9$s" + "%1$s%2$s %3$s%4$s%6$s%7$s %8$s%9$s" + "%2$s %3$s%5$s%7$s %8$s%10$s" + "%1$s%2$s %3$s%5$s%6$s%7$s %8$s%10$s" + "%2$s %3$s%4$s%5$s%7$s %8$s%9$s%10$s" + "%1$s%2$s %3$s%4$s%5$s%6$s%7$s %8$s%9$s%10$s" + "%b %-d%Y" + + + + + + + "星期日" + "星期一" + "星期二" + "星期三" + "星期四" + "星期五" + "星期六" + "週日" + "週一" + "週二" + "週三" + "週四" + "週五" + "週六" + "週日" + "週一" + "週二" + "週三" + "週四" + "週五" + "週六" + "週日" + "一" + "週二" + "三" + "週四" + "五" + "週六" + "日" + "週一" + "二" + "週三" + "四" + "五" + "六" + "1 月" + "2 月" + "3 月" + "4 月" + "5 月" + "6 月" + "7 月" + "8 月" + "9 月" + "10 月" + "11 月" + "12 月" + "1 月" + "2 月" + "3 月" + "4 月" + "5 月" + "6 月" + "7 月" + "8 月" + "9 月" + "10 月" + "11 月" + "12 月" + "1" + "2" + "3" + "4" + "5" + "6" + "7" + "8" + "9" + "10" + "11" + "12" + "%1$02d:%2$02d" + "%1$d:%2$02d:%3$02d" + "全部選取" + "選取文字" + "停止選取文字" + "剪下" + "全部剪下" + "複製" + "全部複製" + "貼上" + "複製網址" + "輸入法" + "編輯文字" + "儲存空間太少" + "手機儲存空間即將不足。" + "確定" + "取消" + "確定" + "取消" + "開啟" + "關閉" + "選取...完成動作" + "以此為本操作預設值。" + "清除首頁設定 (應用程式) 管理應用程式的預設值。" + "選取一項操作" + "沒有應用程式可進行此操作。" + "抱歉!" + "應用程式 %1$s (程序:%2$s) 未正常終止。請再試一次。" + "%1$s 未正常終止。請再試一次。" + "抱歉!" + "%1$s (應用程式:%2$s) 無回應。" + "%1$s (程序:%2$s) 無回應。" + "應用程式 %1$s (程序:%2$s) 無回應。" + "程序 %1$s 沒有回應。" + "強制關閉" + "等待" + "除錯" + "選取文字動作" + "鈴聲音量" + "媒體音量" + "透過藍牙播放" + "來電音量" + "透過藍牙播放" + "鬧鐘音量" + "通知音量" + "音量" + "預設鈴聲" + "預設鈴聲 (%1$s)" + "靜音" + "鈴聲" + "未知的鈴聲" + + "已偵測到 Wi-Fi 網路" + "已偵測到 Wi-Fi 網路" + + + "開啟可用 Wi-Fi 網路" + "開啟可用 Wi-Fi 網路" + + "插入字元" + "未知的應用程式" + "傳送 SMS 簡訊" + "即將傳送大量 SMS 簡訊。選取 [確定] 繼續或 [取消] 停止傳送。" + "確定" + "取消" + "設定" + "預設值" + "無須許可" + " 隱藏" + "顯示全部" + "載入中..." + "USB 已連接" + "已透過 USB 連接手機與電腦。若要從電腦或 SD 卡複製檔案,請選取 [掛載]。" + "掛載" + "不要掛載" + "把 SD 卡當成 USB 儲存裝置時發生問題。" + "USB 已連接" + "選取此項將檔案複製到電腦,或從電腦複製。" + "選取輸入法" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "candidates""u>" + diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index ee0db1d5ffdbc..1704179563757 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -227,12 +227,12 @@ - - - - + + + + + + @@ -2219,11 +2226,15 @@ + + + started. The default value is true. If fillEnabled is not set to true, fillBefore + is assumed to be true. --> + over. The default value is false. If fillEnabled is not set to true and the animation + is not set on a View, fillAfter is assumed to be true. --> @@ -2858,6 +2869,9 @@ + + + diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index ef678e711c3b6..cb364e6ddedeb 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -984,6 +984,8 @@ + +