diff options
author | Mathias Agopian <mathias@google.com> | 2009-05-22 01:27:01 -0700 |
---|---|---|
committer | Mathias Agopian <mathias@google.com> | 2009-05-22 02:16:08 -0700 |
commit | 947f4f4d384ea26eb2145cc070a3eed42c59534a (patch) | |
tree | edc5fb1e6e808a2b809720f44b6236ebe93b577b /core | |
parent | 6158b1bf0364da1582468a98ec09d004ba99deec (diff) | |
parent | 0690519fcde1ccb189081aa79df61436f65686c2 (diff) | |
download | frameworks_base-947f4f4d384ea26eb2145cc070a3eed42c59534a.zip frameworks_base-947f4f4d384ea26eb2145cc070a3eed42c59534a.tar.gz frameworks_base-947f4f4d384ea26eb2145cc070a3eed42c59534a.tar.bz2 |
merge master to master_gl
Diffstat (limited to 'core')
213 files changed, 14805 insertions, 3050 deletions
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index 541f413..16f0a30 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -998,6 +998,20 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM return true; } + case STOP_APP_SWITCHES_TRANSACTION: { + data.enforceInterface(IActivityManager.descriptor); + stopAppSwitches(); + reply.writeNoException(); + return true; + } + + case RESUME_APP_SWITCHES_TRANSACTION: { + data.enforceInterface(IActivityManager.descriptor); + resumeAppSwitches(); + reply.writeNoException(); + return true; + } + case PEEK_SERVICE_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); Intent service = Intent.CREATOR.createFromParcel(data); @@ -2182,5 +2196,25 @@ class ActivityManagerProxy implements IActivityManager return res; } + public void stopAppSwitches() throws RemoteException { + Parcel data = Parcel.obtain(); + Parcel reply = Parcel.obtain(); + data.writeInterfaceToken(IActivityManager.descriptor); + mRemote.transact(STOP_APP_SWITCHES_TRANSACTION, data, reply, 0); + reply.readException(); + reply.recycle(); + data.recycle(); + } + + public void resumeAppSwitches() throws RemoteException { + Parcel data = Parcel.obtain(); + Parcel reply = Parcel.obtain(); + data.writeInterfaceToken(IActivityManager.descriptor); + mRemote.transact(RESUME_APP_SWITCHES_TRANSACTION, data, reply, 0); + reply.readException(); + reply.recycle(); + data.recycle(); + } + private IBinder mRemote; } diff --git a/core/java/android/app/ApplicationErrorReport.java b/core/java/android/app/ApplicationErrorReport.java new file mode 100644 index 0000000..72cbff4 --- /dev/null +++ b/core/java/android/app/ApplicationErrorReport.java @@ -0,0 +1,295 @@ +/* + * Copyright (C) 2008 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.app; + +import android.os.Parcel; +import android.os.Parcelable; +import android.util.Log; +import android.util.Printer; + +/** + * Describes an application error. + * + * A report has a type, which is one of + * <ul> + * <li> {@link #TYPE_CRASH} application crash. Information about the crash + * is stored in {@link #crashInfo}. + * <li> {@link #TYPE_ANR} application not responding. Information about the + * ANR is stored in {@link #anrInfo}. + * <li> {@link #TYPE_NONE} uninitialized instance of {@link ApplicationErrorReport}. + * </ul> + * + * @hide + */ + +public class ApplicationErrorReport implements Parcelable { + /** + * Uninitialized error report. + */ + public static final int TYPE_NONE = 0; + + /** + * An error report about an application crash. + */ + public static final int TYPE_CRASH = 1; + + /** + * An error report about an application that's not responding. + */ + public static final int TYPE_ANR = 2; + + /** + * Type of this report. Can be one of {@link #TYPE_NONE}, + * {@link #TYPE_CRASH} or {@link #TYPE_ANR}. + */ + public int type; + + /** + * Package name of the application. + */ + public String packageName; + + /** + * Package name of the application which installed the application this + * report pertains to. + * This identifies which Market the application came from. + */ + public String installerPackageName; + + /** + * Process name of the application. + */ + public String processName; + + /** + * Time at which the error occurred. + */ + public long time; + + /** + * If this report is of type {@link #TYPE_CRASH}, contains an instance + * of CrashInfo describing the crash; otherwise null. + */ + public CrashInfo crashInfo; + + /** + * If this report is of type {@link #TYPE_ANR}, contains an instance + * of AnrInfo describing the ANR; otherwise null. + */ + public AnrInfo anrInfo; + + /** + * Create an uninitialized instance of {@link ApplicationErrorReport}. + */ + public ApplicationErrorReport() { + } + + /** + * Create an instance of {@link ApplicationErrorReport} initialized from + * a parcel. + */ + ApplicationErrorReport(Parcel in) { + type = in.readInt(); + packageName = in.readString(); + installerPackageName = in.readString(); + processName = in.readString(); + time = in.readLong(); + + switch (type) { + case TYPE_CRASH: + crashInfo = new CrashInfo(in); + break; + case TYPE_ANR: + anrInfo = new AnrInfo(in); + break; + } + } + + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(type); + dest.writeString(packageName); + dest.writeString(installerPackageName); + dest.writeString(processName); + dest.writeLong(time); + + switch (type) { + case TYPE_CRASH: + crashInfo.writeToParcel(dest, flags); + break; + case TYPE_ANR: + anrInfo.writeToParcel(dest, flags); + break; + } + } + + /** + * Describes an application crash. + */ + public static class CrashInfo { + /** + * Class name of the exception that caused the crash. + */ + public String exceptionClassName; + + /** + * File which the exception was thrown from. + */ + public String throwFileName; + + /** + * Class which the exception was thrown from. + */ + public String throwClassName; + + /** + * Method which the exception was thrown from. + */ + public String throwMethodName; + + /** + * Stack trace. + */ + public String stackTrace; + + /** + * Create an uninitialized instance of CrashInfo. + */ + public CrashInfo() { + } + + /** + * Create an instance of CrashInfo initialized from a Parcel. + */ + public CrashInfo(Parcel in) { + exceptionClassName = in.readString(); + throwFileName = in.readString(); + throwClassName = in.readString(); + throwMethodName = in.readString(); + stackTrace = in.readString(); + } + + /** + * Save a CrashInfo instance to a parcel. + */ + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(exceptionClassName); + dest.writeString(throwFileName); + dest.writeString(throwClassName); + dest.writeString(throwMethodName); + dest.writeString(stackTrace); + } + + /** + * Dump a CrashInfo instance to a Printer. + */ + public void dump(Printer pw, String prefix) { + pw.println(prefix + "exceptionClassName: " + exceptionClassName); + pw.println(prefix + "throwFileName: " + throwFileName); + pw.println(prefix + "throwClassName: " + throwClassName); + pw.println(prefix + "throwMethodName: " + throwMethodName); + pw.println(prefix + "stackTrace: " + stackTrace); + } + } + + /** + * Describes an application not responding error. + */ + public static class AnrInfo { + /** + * Activity name. + */ + public String activity; + + /** + * Description of the operation that timed out. + */ + public String cause; + + /** + * Additional info, including CPU stats. + */ + public String info; + + /** + * Create an uninitialized instance of AnrInfo. + */ + public AnrInfo() { + } + + /** + * Create an instance of AnrInfo initialized from a Parcel. + */ + public AnrInfo(Parcel in) { + activity = in.readString(); + cause = in.readString(); + info = in.readString(); + } + + /** + * Save an AnrInfo instance to a parcel. + */ + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(activity); + dest.writeString(cause); + dest.writeString(info); + } + + /** + * Dump an AnrInfo instance to a Printer. + */ + public void dump(Printer pw, String prefix) { + pw.println(prefix + "activity: " + activity); + pw.println(prefix + "cause: " + cause); + pw.println(prefix + "info: " + info); + } + } + + public static final Parcelable.Creator<ApplicationErrorReport> CREATOR + = new Parcelable.Creator<ApplicationErrorReport>() { + public ApplicationErrorReport createFromParcel(Parcel source) { + return new ApplicationErrorReport(source); + } + + public ApplicationErrorReport[] newArray(int size) { + return new ApplicationErrorReport[size]; + } + }; + + public int describeContents() { + return 0; + } + + /** + * Dump the report to a Printer. + */ + public void dump(Printer pw, String prefix) { + pw.println(prefix + "type: " + type); + pw.println(prefix + "packageName: " + packageName); + pw.println(prefix + "installerPackageName: " + installerPackageName); + pw.println(prefix + "processName: " + processName); + pw.println(prefix + "time: " + time); + + switch (type) { + case TYPE_CRASH: + crashInfo.dump(pw, prefix); + break; + case TYPE_ANR: + anrInfo.dump(pw, prefix); + break; + } + } +} diff --git a/core/java/android/app/DatePickerDialog.java b/core/java/android/app/DatePickerDialog.java index 863cbcc..78bbb4f 100644 --- a/core/java/android/app/DatePickerDialog.java +++ b/core/java/android/app/DatePickerDialog.java @@ -46,7 +46,6 @@ public class DatePickerDialog extends AlertDialog implements OnClickListener, private final DatePicker mDatePicker; private final OnDateSetListener mCallBack; private final Calendar mCalendar; - private final java.text.DateFormat mDateFormat; private final java.text.DateFormat mTitleDateFormat; private final String[] mWeekDays; @@ -108,7 +107,6 @@ public class DatePickerDialog extends AlertDialog implements OnClickListener, DateFormatSymbols symbols = new DateFormatSymbols(); mWeekDays = symbols.getShortWeekdays(); - mDateFormat = DateFormat.getMediumDateFormat(context); mTitleDateFormat = java.text.DateFormat. getDateInstance(java.text.DateFormat.FULL); mCalendar = Calendar.getInstance(); diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index 56b29c1..d15a154 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -44,9 +44,30 @@ import java.util.List; * {@hide} */ public interface IActivityManager extends IInterface { + /** + * Returned by startActivity() if the start request was canceled because + * app switches are temporarily canceled to ensure the user's last request + * (such as pressing home) is performed. + */ + public static final int START_SWITCHES_CANCELED = 4; + /** + * Returned by startActivity() if an activity wasn't really started, but + * the given Intent was given to the existing top activity. + */ public static final int START_DELIVERED_TO_TOP = 3; + /** + * Returned by startActivity() if an activity wasn't really started, but + * a task was simply brought to the foreground. + */ public static final int START_TASK_TO_FRONT = 2; + /** + * Returned by startActivity() if the caller asked that the Intent not + * be executed if it is the recipient, and that is indeed the case. + */ public static final int START_RETURN_INTENT_TO_CALLER = 1; + /** + * Activity was started successfully as normal. + */ public static final int START_SUCCESS = 0; public static final int START_INTENT_NOT_RESOLVED = -1; public static final int START_CLASS_NOT_FOUND = -2; @@ -225,6 +246,9 @@ public interface IActivityManager extends IInterface { public boolean shutdown(int timeout) throws RemoteException; + public void stopAppSwitches() throws RemoteException; + public void resumeAppSwitches() throws RemoteException; + /* * Private non-Binder interfaces */ @@ -371,4 +395,6 @@ public interface IActivityManager extends IInterface { int PEEK_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+84; int PROFILE_CONTROL_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+85; int SHUTDOWN_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+86; + int STOP_APP_SWITCHES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+87; + int RESUME_APP_SWITCHES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+88; } diff --git a/core/java/android/app/SearchDialog.java b/core/java/android/app/SearchDialog.java index 343380c..aaaf7bf 100644 --- a/core/java/android/app/SearchDialog.java +++ b/core/java/android/app/SearchDialog.java @@ -31,7 +31,13 @@ import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.Configuration; import android.content.res.Resources; import android.database.Cursor; +import android.graphics.drawable.AnimationDrawable; import android.graphics.drawable.Drawable; +import android.location.Criteria; +import android.location.Location; +import android.location.LocationListener; +import android.location.LocationManager; +import android.location.LocationProvider; import android.net.Uri; import android.os.Bundle; import android.os.SystemClock; @@ -103,6 +109,7 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS private Button mGoButton; private ImageButton mVoiceButton; private View mSearchPlate; + private AnimationDrawable mWorkingSpinner; // interaction with searchable application private SearchableInfo mSearchable; @@ -143,6 +150,15 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS private final WeakHashMap<String, Drawable> mOutsideDrawablesCache = new WeakHashMap<String, Drawable>(); + // Objects we keep around for requesting location updates when the dialog is started + // (and canceling them when the dialog is stopped). We don't actually make use of the + // updates ourselves here, so the LocationListener is just a dummy which doesn't do + // anything. We only do this here so that other suggest providers which wish to provide + // location-based suggestions are more likely to get a good fresh location. + private LocationManager mLocationManager; + private LocationProvider mLocationProvider; + private LocationListener mDummyLocationListener; + /** * Constructor - fires it up and makes it look like the search UI. * @@ -182,6 +198,8 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS mGoButton = (Button) findViewById(com.android.internal.R.id.search_go_btn); mVoiceButton = (ImageButton) findViewById(com.android.internal.R.id.search_voice_btn); mSearchPlate = findViewById(com.android.internal.R.id.search_plate); + mWorkingSpinner = (AnimationDrawable) getContext().getResources(). + getDrawable(com.android.internal.R.drawable.search_spinner); // attach listeners mSearchAutoComplete.addTextChangedListener(mTextWatcher); @@ -217,6 +235,37 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH); mVoiceAppSearchIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); + + mLocationManager = + (LocationManager) getContext().getSystemService(Context.LOCATION_SERVICE); + + if (mLocationManager != null) { + Criteria criteria = new Criteria(); + criteria.setAccuracy(Criteria.ACCURACY_COARSE); + + String providerName = mLocationManager.getBestProvider(criteria, true); + + if (providerName != null) { + mLocationProvider = mLocationManager.getProvider(providerName); + } + + // Just a dumb listener that doesn't do anything - requesting location updates here + // is only intended to give location-based suggestion providers the best chance + // of getting a good fresh location. + mDummyLocationListener = new LocationListener() { + public void onLocationChanged(Location location) { + } + + public void onProviderDisabled(String provider) { + } + + public void onProviderEnabled(String provider) { + } + + public void onStatusChanged(String provider, int status, Bundle extras) { + } + }; + } } /** @@ -239,7 +288,6 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS return doShow(initialQuery, selectInitialQuery, componentName, appSearchData, globalSearch); } - /** * Called in response to a press of the hard search button in * {@link #onKeyDown(int, KeyEvent)}, this method toggles between in-app @@ -360,6 +408,8 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS // receive broadcasts getContext().registerReceiver(mBroadcastReceiver, mCloseDialogsFilter); getContext().registerReceiver(mBroadcastReceiver, mPackageFilter); + + startLocationUpdates(); } /** @@ -372,6 +422,8 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS public void onStop() { super.onStop(); + stopLocationUpdates(); + // TODO: Removing the listeners means that they never get called, since // Dialog.dismissDialog() calls onStop() before sendDismissMessage(). setOnCancelListener(null); @@ -396,6 +448,43 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS } /** + * Asks the LocationManager for location updates so that it goes and gets a fresh location + * if needed. + */ + private void startLocationUpdates() { + if (mLocationManager != null && mLocationProvider != null) { + mLocationManager.requestLocationUpdates(mLocationProvider.getName(), + 0, 0, mDummyLocationListener, getContext().getMainLooper()); + } + + } + + /** + * Makes sure to stop listening for location updates to save battery. + */ + private void stopLocationUpdates() { + mLocationManager.removeUpdates(mDummyLocationListener); + } + + /** + * Sets the search dialog to the 'working' state, which shows a working spinner in the + * right hand size of the text field. + * + * @param working true to show spinner, false to hide spinner + */ + public void setWorking(boolean working) { + if (working) { + mSearchAutoComplete.setCompoundDrawablesWithIntrinsicBounds( + null, null, mWorkingSpinner, null); + mWorkingSpinner.start(); + } else { + mSearchAutoComplete.setCompoundDrawablesWithIntrinsicBounds( + null, null, null, null); + mWorkingSpinner.stop(); + } + } + + /** * Closes and gets rid of the suggestions adapter. */ private void closeSuggestionsAdapter() { @@ -563,8 +652,8 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS // attach the suggestions adapter, if suggestions are available // The existence of a suggestions authority is the proxy for "suggestions available here" if (mSearchable.getSuggestAuthority() != null) { - mSuggestionsAdapter = new SuggestionsAdapter(getContext(), mSearchable, - mOutsideDrawablesCache); + mSuggestionsAdapter = new SuggestionsAdapter(getContext(), this, mSearchable, + mOutsideDrawablesCache, mGlobalSearchMode); mSearchAutoComplete.setAdapter(mSuggestionsAdapter); } } diff --git a/core/java/android/app/SuggestionsAdapter.java b/core/java/android/app/SuggestionsAdapter.java index 6a02fc9..2fe9a8d 100644 --- a/core/java/android/app/SuggestionsAdapter.java +++ b/core/java/android/app/SuggestionsAdapter.java @@ -25,6 +25,7 @@ import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; +import android.os.Bundle; import android.server.search.SearchableInfo; import android.text.Html; import android.text.TextUtils; @@ -45,12 +46,18 @@ import java.util.WeakHashMap; * @hide */ class SuggestionsAdapter extends ResourceCursorAdapter { + // The value used to query a cursor whether it is still expecting more input, + // so we can correctly display (or not display) the 'working' spinner in the search dialog. + public static final String IS_WORKING = "isWorking"; + private static final boolean DBG = false; private static final String LOG_TAG = "SuggestionsAdapter"; + private SearchDialog mSearchDialog; private SearchableInfo mSearchable; private Context mProviderContext; private WeakHashMap<String, Drawable> mOutsideDrawablesCache; + private boolean mGlobalSearchMode; // Cached column indexes, updated when the cursor changes. private int mFormatCol; @@ -61,12 +68,13 @@ class SuggestionsAdapter extends ResourceCursorAdapter { private int mIconBitmap1Col; private int mIconBitmap2Col; - public SuggestionsAdapter(Context context, SearchableInfo searchable, - WeakHashMap<String, Drawable> outsideDrawablesCache) { + public SuggestionsAdapter(Context context, SearchDialog searchDialog, SearchableInfo searchable, + WeakHashMap<String, Drawable> outsideDrawablesCache, boolean globalSearchMode) { super(context, com.android.internal.R.layout.search_dropdown_item_icons_2line, null, // no initial cursor true); // auto-requery + mSearchDialog = searchDialog; mSearchable = searchable; // set up provider resources (gives us icons, etc.) @@ -74,6 +82,7 @@ class SuggestionsAdapter extends ResourceCursorAdapter { mProviderContext = mSearchable.getProviderContext(mContext, activityContext); mOutsideDrawablesCache = outsideDrawablesCache; + mGlobalSearchMode = globalSearchMode; } /** @@ -118,6 +127,28 @@ class SuggestionsAdapter extends ResourceCursorAdapter { mIconBitmap1Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_1_BITMAP); mIconBitmap2Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_2_BITMAP); } + updateWorking(); + } + + @Override + public void notifyDataSetChanged() { + super.notifyDataSetChanged(); + updateWorking(); + } + + /** + * Updates the search dialog according to the current working status of the cursor. + */ + private void updateWorking() { + if (!mGlobalSearchMode || mCursor == null) return; + + Bundle request = new Bundle(); + request.putString(SearchManager.EXTRA_DATA_KEY, IS_WORKING); + Bundle response = mCursor.respond(request); + if (response.containsKey(IS_WORKING)) { + boolean isWorking = response.getBoolean(IS_WORKING); + mSearchDialog.setWorking(isWorking); + } } /** diff --git a/core/java/android/backup/BackupDataOutput.java b/core/java/android/backup/BackupDataOutput.java index 555494e..25ae15b 100644 --- a/core/java/android/backup/BackupDataOutput.java +++ b/core/java/android/backup/BackupDataOutput.java @@ -22,24 +22,30 @@ import java.io.FileDescriptor; /** @hide */ public class BackupDataOutput { - /* package */ FileDescriptor fd; + int mBackupWriter; + private Context mContext; public static final int OP_UPDATE = 1; public static final int OP_DELETE = 2; public BackupDataOutput(Context context, FileDescriptor fd) { - this.fd = fd; + mContext = context; + if (fd == null) throw new NullPointerException(); + mBackupWriter = ctor(fd); + if (mBackupWriter == 0) { + throw new RuntimeException("Native initialization failed with fd=" + fd); + } } - public void close() { - // do we close the fd? + protected void finalize() throws Throwable { + try { + dtor(mBackupWriter); + } finally { + super.finalize(); + } } - public native void flush(); - public native void write(byte[] buffer); - public native void write(int oneByte); - public native void write(byte[] buffer, int offset, int count); - - public native void writeOperation(int op); - public native void writeKey(String key); + + private native static int ctor(FileDescriptor fd); + private native static void dtor(int mBackupWriter); } diff --git a/core/java/android/backup/FileBackupHelper.java b/core/java/android/backup/FileBackupHelper.java index 05159dc..ec16eb1 100644 --- a/core/java/android/backup/FileBackupHelper.java +++ b/core/java/android/backup/FileBackupHelper.java @@ -53,15 +53,12 @@ public class FileBackupHelper { } // oldStateFd can be null FileDescriptor oldStateFd = oldState != null ? oldState.getFileDescriptor() : null; - if (data.fd == null) { - throw new NullPointerException(); - } FileDescriptor newStateFd = newState.getFileDescriptor(); if (newStateFd == null) { throw new NullPointerException(); } - int err = performBackup_native(basePath, oldStateFd, data.fd, newStateFd, files); + int err = performBackup_native(basePath, oldStateFd, data.mBackupWriter, newStateFd, files); if (err != 0) { throw new RuntimeException("Backup failed"); // TODO: more here @@ -69,5 +66,5 @@ public class FileBackupHelper { } native private static int performBackup_native(String basePath, FileDescriptor oldState, - FileDescriptor data, FileDescriptor newState, String[] files); + int data, FileDescriptor newState, String[] files); } diff --git a/core/java/android/bluetooth/Database.java b/core/java/android/bluetooth/Database.java deleted file mode 100644 index fef641a..0000000 --- a/core/java/android/bluetooth/Database.java +++ /dev/null @@ -1,200 +0,0 @@ -/* - * Copyright (C) 2007 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.bluetooth; - -import android.bluetooth.RfcommSocket; - -import android.util.Log; - -import java.io.*; -import java.util.*; - -/** - * The Android Bluetooth API is not finalized, and *will* change. Use at your - * own risk. - * - * A low-level API to the Service Discovery Protocol (SDP) Database. - * - * Allows service records to be added to the local SDP database. Once added, - * these services will be advertised to remote devices when they make SDP - * queries on this device. - * - * Currently this API is a thin wrapper to the bluez SDP Database API. See: - * http://wiki.bluez.org/wiki/Database - * http://wiki.bluez.org/wiki/HOWTO/ManagingServiceRecords - * @hide - */ -public final class Database { - private static Database mInstance; - - private static final String sLogName = "android.bluetooth.Database"; - - /** - * Class load time initialization - */ - static { - classInitNative(); - } - private native static void classInitNative(); - - /** - * Private to enforce singleton property - */ - private Database() { - initializeNativeDataNative(); - } - private native void initializeNativeDataNative(); - - protected void finalize() throws Throwable { - try { - cleanupNativeDataNative(); - } finally { - super.finalize(); - } - } - private native void cleanupNativeDataNative(); - - /** - * Singelton accessor - * @return The singleton instance of Database - */ - public static synchronized Database getInstance() { - if (mInstance == null) { - mInstance = new Database(); - } - return mInstance; - } - - /** - * Advertise a service with an RfcommSocket. - * - * This adds the service the SDP Database with the following attributes - * set: Service Name, Protocol Descriptor List, Service Class ID List - * TODO: Construct a byte[] record directly, rather than via XML. - * @param socket The rfcomm socket to advertise (by channel). - * @param serviceName A short name for this service - * @param uuid - * Unique identifier for this service, by which clients - * can search for your service - * @return Handle to the new service record - */ - public int advertiseRfcommService(RfcommSocket socket, - String serviceName, - UUID uuid) throws IOException { - String xmlRecord = - "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" + - "<record>\n" + - " <attribute id=\"0x0001\">\n" + // ServiceClassIDList - " <sequence>\n" + - " <uuid value=\"" - + uuid.toString() + // UUID for this service - "\"/>\n" + - " </sequence>\n" + - " </attribute>\n" + - " <attribute id=\"0x0004\">\n" + // ProtocolDescriptorList - " <sequence>\n" + - " <sequence>\n" + - " <uuid value=\"0x0100\"/>\n" + // L2CAP - " </sequence>\n" + - " <sequence>\n" + - " <uuid value=\"0x0003\"/>\n" + // RFCOMM - " <uint8 value=\"" + - socket.getPort() + // RFCOMM port - "\" name=\"channel\"/>\n" + - " </sequence>\n" + - " </sequence>\n" + - " </attribute>\n" + - " <attribute id=\"0x0100\">\n" + // ServiceName - " <text value=\"" + serviceName + "\"/>\n" + - " </attribute>\n" + - "</record>\n"; - Log.i(sLogName, xmlRecord); - return addServiceRecordFromXml(xmlRecord); - } - - - /** - * Add a new service record. - * @param record The byte[] record - * @return A handle to the new record - */ - public synchronized int addServiceRecord(byte[] record) throws IOException { - int handle = addServiceRecordNative(record); - Log.i(sLogName, "Added SDP record: " + Integer.toHexString(handle)); - return handle; - } - private native int addServiceRecordNative(byte[] record) - throws IOException; - - /** - * Add a new service record, using XML. - * @param record The record as an XML string - * @return A handle to the new record - */ - public synchronized int addServiceRecordFromXml(String record) throws IOException { - int handle = addServiceRecordFromXmlNative(record); - Log.i(sLogName, "Added SDP record: " + Integer.toHexString(handle)); - return handle; - } - private native int addServiceRecordFromXmlNative(String record) - throws IOException; - - /** - * Update an exisiting service record. - * @param handle Handle to exisiting record - * @param record The updated byte[] record - */ - public synchronized void updateServiceRecord(int handle, byte[] record) { - try { - updateServiceRecordNative(handle, record); - } catch (IOException e) { - Log.e(getClass().toString(), e.getMessage()); - } - } - private native void updateServiceRecordNative(int handle, byte[] record) - throws IOException; - - /** - * Update an exisiting record, using XML. - * @param handle Handle to exisiting record - * @param record The record as an XML string. - */ - public synchronized void updateServiceRecordFromXml(int handle, String record) { - try { - updateServiceRecordFromXmlNative(handle, record); - } catch (IOException e) { - Log.e(getClass().toString(), e.getMessage()); - } - } - private native void updateServiceRecordFromXmlNative(int handle, String record) - throws IOException; - - /** - * Remove a service record. - * It is only possible to remove service records that were added by the - * current connection. - * @param handle Handle to exisiting record to be removed - */ - public synchronized void removeServiceRecord(int handle) { - try { - removeServiceRecordNative(handle); - } catch (IOException e) { - Log.e(getClass().toString(), e.getMessage()); - } - } - private native void removeServiceRecordNative(int handle) throws IOException; -} diff --git a/core/java/android/content/AbstractSyncableContentProvider.java b/core/java/android/content/AbstractSyncableContentProvider.java index 1452985..05781f4 100644 --- a/core/java/android/content/AbstractSyncableContentProvider.java +++ b/core/java/android/content/AbstractSyncableContentProvider.java @@ -17,6 +17,8 @@ import java.util.Collections; import java.util.Map; import java.util.Vector; import java.util.ArrayList; +import java.util.Set; +import java.util.HashSet; import com.google.android.collect.Maps; @@ -55,6 +57,9 @@ public abstract class AbstractSyncableContentProvider extends SyncableContentPro return mIsTemporary; } + private final ThreadLocal<Boolean> mApplyingBatch = new ThreadLocal<Boolean>(); + private final ThreadLocal<Set<Uri>> mPendingBatchNotifications = new ThreadLocal<Set<Uri>>(); + /** * Indicates whether or not this ContentProvider contains a full * set of data or just diffs. This knowledge comes in handy when @@ -243,26 +248,37 @@ public abstract class AbstractSyncableContentProvider extends SyncableContentPro public final int update(final Uri url, final ContentValues values, final String selection, final String[] selectionArgs) { mDb = mOpenHelper.getWritableDatabase(); - mDb.beginTransaction(); + final boolean notApplyingBatch = !applyingBatch(); + if (notApplyingBatch) { + mDb.beginTransaction(); + } try { if (isTemporary() && mSyncState.matches(url)) { int numRows = mSyncState.asContentProvider().update( url, values, selection, selectionArgs); - mDb.setTransactionSuccessful(); + if (notApplyingBatch) { + mDb.setTransactionSuccessful(); + } return numRows; } int result = updateInternal(url, values, selection, selectionArgs); - mDb.setTransactionSuccessful(); - + if (notApplyingBatch) { + mDb.setTransactionSuccessful(); + } if (!isTemporary() && result > 0) { - getContext().getContentResolver().notifyChange(url, null /* observer */, - changeRequiresLocalSync(url)); + if (notApplyingBatch) { + getContext().getContentResolver().notifyChange(url, null /* observer */, + changeRequiresLocalSync(url)); + } else { + mPendingBatchNotifications.get().add(url); + } } - return result; } finally { - mDb.endTransaction(); + if (notApplyingBatch) { + mDb.endTransaction(); + } } } @@ -270,44 +286,74 @@ public abstract class AbstractSyncableContentProvider extends SyncableContentPro public final int delete(final Uri url, final String selection, final String[] selectionArgs) { mDb = mOpenHelper.getWritableDatabase(); - mDb.beginTransaction(); + final boolean notApplyingBatch = !applyingBatch(); + if (notApplyingBatch) { + mDb.beginTransaction(); + } try { if (isTemporary() && mSyncState.matches(url)) { int numRows = mSyncState.asContentProvider().delete(url, selection, selectionArgs); - mDb.setTransactionSuccessful(); + if (notApplyingBatch) { + mDb.setTransactionSuccessful(); + } return numRows; } int result = deleteInternal(url, selection, selectionArgs); - mDb.setTransactionSuccessful(); + if (notApplyingBatch) { + mDb.setTransactionSuccessful(); + } if (!isTemporary() && result > 0) { - getContext().getContentResolver().notifyChange(url, null /* observer */, - changeRequiresLocalSync(url)); + if (notApplyingBatch) { + getContext().getContentResolver().notifyChange(url, null /* observer */, + changeRequiresLocalSync(url)); + } else { + mPendingBatchNotifications.get().add(url); + } } return result; } finally { - mDb.endTransaction(); + if (notApplyingBatch) { + mDb.endTransaction(); + } } } + private boolean applyingBatch() { + return mApplyingBatch.get() != null && mApplyingBatch.get(); + } + @Override public final Uri insert(final Uri url, final ContentValues values) { mDb = mOpenHelper.getWritableDatabase(); - mDb.beginTransaction(); + final boolean notApplyingBatch = !applyingBatch(); + if (notApplyingBatch) { + mDb.beginTransaction(); + } try { if (isTemporary() && mSyncState.matches(url)) { Uri result = mSyncState.asContentProvider().insert(url, values); - mDb.setTransactionSuccessful(); + if (notApplyingBatch) { + mDb.setTransactionSuccessful(); + } return result; } Uri result = insertInternal(url, values); - mDb.setTransactionSuccessful(); + if (notApplyingBatch) { + mDb.setTransactionSuccessful(); + } if (!isTemporary() && result != null) { - getContext().getContentResolver().notifyChange(url, null /* observer */, - changeRequiresLocalSync(url)); + if (notApplyingBatch) { + getContext().getContentResolver().notifyChange(url, null /* observer */, + changeRequiresLocalSync(url)); + } else { + mPendingBatchNotifications.get().add(url); + } } return result; } finally { - mDb.endTransaction(); + if (notApplyingBatch) { + mDb.endTransaction(); + } } } @@ -343,6 +389,92 @@ public abstract class AbstractSyncableContentProvider extends SyncableContentPro } /** + * <p> + * Start batch transaction. {@link #endTransaction} MUST be called after + * calling this method. Those methods should be used like this: + * </p> + * + * <pre class="prettyprint"> + * boolean successful = false; + * beginBatch() + * try { + * // Do something related to mDb + * successful = true; + * return ret; + * } finally { + * endBatch(successful); + * } + * </pre> + * + * @hide This method should be used only when {@link #applyBatch} is not enough and must be + * used with {@link #endBatch}. + * e.g. If returned value has to be used during one transaction, this method might be useful. + */ + public final void beginBatch() { + // initialize if this is the first time this thread has applied a batch + if (mApplyingBatch.get() == null) { + mApplyingBatch.set(false); + mPendingBatchNotifications.set(new HashSet<Uri>()); + } + + if (applyingBatch()) { + throw new IllegalStateException( + "applyBatch is not reentrant but mApplyingBatch is already set"); + } + SQLiteDatabase db = getDatabase(); + db.beginTransaction(); + boolean successful = false; + try { + mApplyingBatch.set(true); + successful = true; + } finally { + if (!successful) { + // Something unexpected happened. We must call endTransaction() at least. + db.endTransaction(); + } + } + } + + /** + * <p> + * Finish batch transaction. If "successful" is true, try to call + * mDb.setTransactionSuccessful() before calling mDb.endTransaction(). + * This method MUST be used with {@link #beginBatch()}. + * </p> + * + * @hide This method must be used with {@link #beginTransaction} + */ + public final void endBatch(boolean successful) { + try { + if (successful) { + // setTransactionSuccessful() must be called just once during opening the + // transaction. + mDb.setTransactionSuccessful(); + } + } finally { + mApplyingBatch.set(false); + getDatabase().endTransaction(); + for (Uri url : mPendingBatchNotifications.get()) { + getContext().getContentResolver().notifyChange(url, null /* observer */, + changeRequiresLocalSync(url)); + } + } + } + + public ContentProviderResult[] applyBatch(ContentProviderOperation[] operations) + throws OperationApplicationException { + boolean successful = false; + beginBatch(); + try { + ContentProviderResult[] results = super.applyBatch(operations); + successful = true; + return results; + } finally { + endBatch(successful); + } + } + + /** * 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 diff --git a/core/java/android/content/ContentProvider.java b/core/java/android/content/ContentProvider.java index 3a8de6e..c204dda 100644 --- a/core/java/android/content/ContentProvider.java +++ b/core/java/android/content/ContentProvider.java @@ -629,4 +629,26 @@ public abstract class ContentProvider implements ComponentCallbacks { ContentProvider.this.onCreate(); } } -} + + /** + * Applies each of the {@link ContentProviderOperation} objects and returns an array + * of their results. Passes through OperationApplicationException, which may be thrown + * by the call to {@link ContentProviderOperation#apply}. + * If all the applications succeed then a {@link ContentProviderResult} array with the + * same number of elements as the operations will be returned. It is implementation-specific + * how many, if any, operations will have been successfully applied if a call to + * apply results in a {@link OperationApplicationException}. + * @param operations the operations to apply + * @return the results of the applications + * @throws OperationApplicationException thrown if an application fails. + * See {@link ContentProviderOperation#apply} for more information. + */ + public ContentProviderResult[] applyBatch(ContentProviderOperation[] operations) + throws OperationApplicationException { + ContentProviderResult[] results = new ContentProviderResult[operations.length]; + for (int i = 0; i < operations.length; i++) { + results[i] = operations[i].apply(this, results, i); + } + return results; + } +}
\ No newline at end of file diff --git a/core/java/android/content/ContentProviderOperation.java b/core/java/android/content/ContentProviderOperation.java new file mode 100644 index 0000000..148cc35 --- /dev/null +++ b/core/java/android/content/ContentProviderOperation.java @@ -0,0 +1,358 @@ +/* + * 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.content; + +import android.net.Uri; +import android.database.Cursor; + +import java.util.Map; + +public class ContentProviderOperation { + private final static int TYPE_INSERT = 1; + private final static int TYPE_UPDATE = 2; + private final static int TYPE_DELETE = 3; + private final static int TYPE_COUNT = 4; + + private final int mType; + private final Uri mUri; + private final String mSelection; + private final String[] mSelectionArgs; + private final ContentValues mValues; + private final Integer mExpectedCount; + private final ContentValues mValuesBackReferences; + private final Map<Integer, Integer> mSelectionArgsBackReferences; + + private static final String[] COUNT_COLUMNS = new String[]{"count(*)"}; + + /** + * Creates a {@link ContentProviderOperation} by copying the contents of a + * {@link Builder}. + */ + private ContentProviderOperation(Builder builder) { + mType = builder.mType; + mUri = builder.mUri; + mValues = builder.mValues; + mSelection = builder.mSelection; + mSelectionArgs = builder.mSelectionArgs; + mExpectedCount = builder.mExpectedCount; + mSelectionArgsBackReferences = builder.mSelectionArgsBackReferences; + mValuesBackReferences = builder.mValuesBackReferences; + } + + /** + * Create a {@link Builder} suitable for building an insert {@link ContentProviderOperation}. + * @param uri The {@link Uri} that is the target of the insert. + * @return a {@link Builder} + */ + public static Builder newInsert(Uri uri) { + return new Builder(TYPE_INSERT, uri); + } + + /** + * Create a {@link Builder} suitable for building an update {@link ContentProviderOperation}. + * @param uri The {@link Uri} that is the target of the update. + * @return a {@link Builder} + */ + public static Builder newUpdate(Uri uri) { + return new Builder(TYPE_UPDATE, uri); + } + + /** + * Create a {@link Builder} suitable for building a delete {@link ContentProviderOperation}. + * @param uri The {@link Uri} that is the target of the delete. + * @return a {@link Builder} + */ + public static Builder newDelete(Uri uri) { + return new Builder(TYPE_DELETE, uri); + } + + /** + * Create a {@link Builder} suitable for building a count query. When used in conjunction + * with {@link Builder#withExpectedCount(int)} this is useful for checking that the + * uri/selection has the expected number of rows. + * {@link ContentProviderOperation}. + * @param uri The {@link Uri} to query. + * @return a {@link Builder} + */ + public static Builder newCountQuery(Uri uri) { + return new Builder(TYPE_COUNT, uri); + } + + /** + * Applies this operation using the given provider. The backRefs array is used to resolve any + * back references that were requested using + * {@link Builder#withValueBackReferences(ContentValues)} and + * {@link Builder#withSelectionBackReferences(java.util.Map)}. + * @param provider the {@link ContentProvider} on which this batch is applied + * @param backRefs a {@link ContentProviderResult} array that will be consulted + * to resolve any requested back references. + * @param numBackRefs the number of valid results on the backRefs array. + * @return a {@link ContentProviderResult} that contains either the {@link Uri} of the inserted + * row if this was an insert otherwise the number of rows affected. + * @throws OperationApplicationException thrown if either the insert fails or + * if the number of rows affected didn't match the expected count + */ + public ContentProviderResult apply(ContentProvider provider, ContentProviderResult[] backRefs, + int numBackRefs) throws OperationApplicationException { + ContentValues values = resolveValueBackReferences(backRefs, numBackRefs); + String[] selectionArgs = + resolveSelectionArgsBackReferences(backRefs, numBackRefs); + + if (mType == TYPE_INSERT) { + Uri newUri = provider.insert(mUri, values); + if (newUri == null) { + throw new OperationApplicationException("insert failed"); + } + return new ContentProviderResult(newUri); + } + + int numRows; + if (mType == TYPE_DELETE) { + numRows = provider.delete(mUri, mSelection, selectionArgs); + } else if (mType == TYPE_UPDATE) { + numRows = provider.update(mUri, values, mSelection, selectionArgs); + } else if (mType == TYPE_COUNT) { + Cursor cursor = provider.query(mUri, COUNT_COLUMNS, mSelection, selectionArgs, null); + try { + if (!cursor.moveToNext()) { + throw new RuntimeException("since we are doing a count query we should always " + + "be able to move to the first row"); + } + if (cursor.getCount() != 1) { + throw new RuntimeException("since we are doing a count query there should " + + "always be exacly row, found " + cursor.getCount()); + } + numRows = cursor.getInt(0); + } finally { + cursor.close(); + } + } else { + throw new IllegalStateException("bad type, " + mType); + } + + if (mExpectedCount != null && mExpectedCount != numRows) { + throw new OperationApplicationException("wrong number of rows: " + numRows); + } + + return new ContentProviderResult(numRows); + } + + /** + * The ContentValues back references are represented as a ContentValues object where the + * key refers to a column and the value is an index of the back reference whose + * valued should be associated with the column. + * @param backRefs an array of previous results + * @param numBackRefs the number of valid previous results in backRefs + * @return the ContentValues that should be used in this operation application after + * expansion of back references. This can be called if either mValues or mValuesBackReferences + * is null + * @VisibleForTesting this is intended to be a private method but it is exposed for + * unit testing purposes + */ + public ContentValues resolveValueBackReferences( + ContentProviderResult[] backRefs, int numBackRefs) { + if (mValuesBackReferences == null) { + return mValues; + } + final ContentValues values; + if (mValues == null) { + values = new ContentValues(); + } else { + values = new ContentValues(mValues); + } + for (Map.Entry<String, Object> entry : mValuesBackReferences.valueSet()) { + String key = entry.getKey(); + Integer backRefIndex = mValuesBackReferences.getAsInteger(key); + if (backRefIndex == null) { + throw new IllegalArgumentException("values backref " + key + " is not an integer"); + } + values.put(key, backRefToValue(backRefs, numBackRefs, backRefIndex)); + } + return values; + } + + /** + * The Selection Arguments back references are represented as a Map of Integer->Integer where + * the key is an index into the selection argument array (see {@link Builder#withSelection}) + * and the value is the index of the previous result that should be used for that selection + * argument array slot. + * @param backRefs an array of previous results + * @param numBackRefs the number of valid previous results in backRefs + * @return the ContentValues that should be used in this operation application after + * expansion of back references. This can be called if either mValues or mValuesBackReferences + * is null + * @VisibleForTesting this is intended to be a private method but it is exposed for + * unit testing purposes + */ + public String[] resolveSelectionArgsBackReferences( + ContentProviderResult[] backRefs, int numBackRefs) { + if (mSelectionArgsBackReferences == null) { + return mSelectionArgs; + } + String[] newArgs = new String[mSelectionArgs.length]; + System.arraycopy(mSelectionArgs, 0, newArgs, 0, mSelectionArgs.length); + for (Map.Entry<Integer, Integer> selectionArgBackRef + : mSelectionArgsBackReferences.entrySet()) { + final Integer selectionArgIndex = selectionArgBackRef.getKey(); + final int backRefIndex = selectionArgBackRef.getValue(); + newArgs[selectionArgIndex] = backRefToValue(backRefs, numBackRefs, backRefIndex); + } + return newArgs; + } + + /** + * Return the string representation of the requested back reference. + * @param backRefs an array of results + * @param numBackRefs the number of items in the backRefs array that are valid + * @param backRefIndex which backRef to be used + * @throws ArrayIndexOutOfBoundsException thrown if the backRefIndex is larger than + * the numBackRefs + * @return the string representation of the requested back reference. + */ + private static String backRefToValue(ContentProviderResult[] backRefs, int numBackRefs, + Integer backRefIndex) { + if (backRefIndex > numBackRefs) { + throw new ArrayIndexOutOfBoundsException("asked for back ref " + backRefIndex + + " but there are only " + numBackRefs + " back refs"); + } + ContentProviderResult backRef = backRefs[backRefIndex]; + String backRefValue; + if (backRef.uri != null) { + backRefValue = backRef.uri.getLastPathSegment(); + } else { + backRefValue = String.valueOf(backRef.count); + } + return backRefValue; + } + + /** + * Used to add parameters to a {@link ContentProviderOperation}. The {@link Builder} is + * first created by calling {@link ContentProviderOperation#newInsert(android.net.Uri)}, + * {@link ContentProviderOperation#newUpdate(android.net.Uri)}, + * {@link ContentProviderOperation#newDelete(android.net.Uri)} or + * {@link ContentProviderOperation#newCountQuery(android.net.Uri)}. The withXXX methods + * can then be used to add parameters to the builder. See the specific methods to find for + * which {@link Builder} type each is allowed. Call {@link #build} to create the + * {@link ContentProviderOperation} once all the parameters have been supplied. + */ + public static class Builder { + private final int mType; + private final Uri mUri; + private String mSelection; + private String[] mSelectionArgs; + private ContentValues mValues; + private Integer mExpectedCount; + private ContentValues mValuesBackReferences; + private Map<Integer, Integer> mSelectionArgsBackReferences; + + /** Create a {@link Builder} of a given type. The uri must not be null. */ + private Builder(int type, Uri uri) { + if (uri == null) { + throw new IllegalArgumentException("uri must not be null"); + } + mType = type; + mUri = uri; + } + + /** Create a ContentroviderOperation from this {@link Builder}. */ + public ContentProviderOperation build() { + return new ContentProviderOperation(this); + } + + /** + * Add a {@link ContentValues} of back references. The key is the name of the column + * and the value is an integer that is the index of the previous result whose + * value should be used for the column. The value is added as a {@link String}. + * A column value from the back references takes precedence over a value specified in + * {@link #withValues}. + * This can only be used with builders of type insert or update. + * @return this builder, to allow for chaining. + */ + public Builder withValueBackReferences(ContentValues backReferences) { + if (mType != TYPE_INSERT && mType != TYPE_UPDATE) { + throw new IllegalArgumentException( + "only inserts and updates can have value back-references"); + } + mValuesBackReferences = backReferences; + return this; + } + + /** + * Add a {@link Map} of back references. The integer key is the index of the selection arg + * to set and the integer value is the index of the previous result whose + * value should be used for the arg. If any value at that index of the selection arg + * that was specified by {@likn withSelection} will be overwritten. + * This can only be used with builders of type update, delete, or count query. + * @return this builder, to allow for chaining. + */ + public Builder withSelectionBackReferences(Map<Integer, Integer> backReferences) { + if (mType != TYPE_COUNT && mType != TYPE_UPDATE && mType != TYPE_DELETE) { + throw new IllegalArgumentException( + "only deletes, updates and counts can have selection back-references"); + } + mSelectionArgsBackReferences = backReferences; + return this; + } + + /** + * The ContentValues to use. This may be null. These values may be overwritten by + * the corresponding value specified by {@link #withValueBackReferences(ContentValues)}. + * This can only be used with builders of type insert or update. + * @return this builder, to allow for chaining. + */ + public Builder withValues(ContentValues values) { + if (mType != TYPE_INSERT && mType != TYPE_UPDATE) { + throw new IllegalArgumentException("only inserts and updates can have values"); + } + mValues = values; + return this; + } + + /** + * The selection and arguments to use. An occurrence of '?' in the selection will be + * replaced with the corresponding occurence of the selection argument. Any of the + * selection arguments may be overwritten by a selection argument back reference as + * specified by {@link #withSelectionBackReferences}. + * This can only be used with builders of type update, delete, or count query. + * @return this builder, to allow for chaining. + */ + public Builder withSelection(String selection, String[] selectionArgs) { + if (mType != TYPE_DELETE && mType != TYPE_UPDATE && mType != TYPE_COUNT) { + throw new IllegalArgumentException( + "only deletes, updates and counts can have selections"); + } + mSelection = selection; + mSelectionArgs = selectionArgs; + return this; + } + + /** + * If set then if the number of rows affected by this operation do not match + * this count {@link OperationApplicationException} will be throw. + * This can only be used with builders of type update, delete, or count query. + * @return this builder, to allow for chaining. + */ + public Builder withExpectedCount(int count) { + if (mType != TYPE_DELETE && mType != TYPE_UPDATE && mType != TYPE_COUNT) { + throw new IllegalArgumentException( + "only deletes, updates and counts can have expected counts"); + } + mExpectedCount = count; + return this; + } + } +} diff --git a/core/java/android/content/ContentProviderResult.java b/core/java/android/content/ContentProviderResult.java new file mode 100644 index 0000000..2e34e40 --- /dev/null +++ b/core/java/android/content/ContentProviderResult.java @@ -0,0 +1,39 @@ +/* + * 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.content; + +import android.net.Uri; + +/** + * Contains the result of the application of a {@link ContentProviderOperation}. It is guaranteed + * to have exactly one of {@link #uri} or {@link #count} set. + */ +public class ContentProviderResult { + public final Uri uri; + public final Integer count; + + public ContentProviderResult(Uri uri) { + if (uri == null) throw new IllegalArgumentException("uri must not be null"); + this.uri = uri; + this.count = null; + } + + public ContentProviderResult(int count) { + this.count = count; + this.uri = null; + } +}
\ No newline at end of file diff --git a/core/java/android/content/OperationApplicationException.java b/core/java/android/content/OperationApplicationException.java new file mode 100644 index 0000000..d4101bf --- /dev/null +++ b/core/java/android/content/OperationApplicationException.java @@ -0,0 +1,36 @@ +/* + * 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.content; + +/** + * Thrown when an application of a {@link ContentProviderOperation} fails due the specified + * constraints. + */ +public class OperationApplicationException extends Exception { + public OperationApplicationException() { + super(); + } + public OperationApplicationException(String message) { + super(message); + } + public OperationApplicationException(String message, Throwable cause) { + super(message, cause); + } + public OperationApplicationException(Throwable cause) { + super(cause); + } +} diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index 88ac04c..ad022e7 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -123,13 +123,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { * Value for {@link #flags}: this is set of the application has set * its android:targetSdkVersion to something >= the current SDK version. */ - public static final int FLAG_TARGETS_SDK = 1<<8; - - /** - * Value for {@link #flags}: this is set of the application has set - * its android:targetSdkVersion to something >= the current SDK version. - */ - public static final int FLAG_TEST_ONLY = 1<<9; + public static final int FLAG_TEST_ONLY = 1<<8; /** * Flags associated with the application. Any combination of @@ -137,7 +131,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { * {@link #FLAG_PERSISTENT}, {@link #FLAG_FACTORY_TEST}, and * {@link #FLAG_ALLOW_TASK_REPARENTING} * {@link #FLAG_ALLOW_CLEAR_USER_DATA}, {@link #FLAG_UPDATED_SYSTEM_APP}, - * {@link #FLAG_TARGETS_SDK}. + * {@link #FLAG_TEST_ONLY}. */ public int flags = 0; @@ -182,6 +176,16 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { public int[] supportsDensities; /** + * The minimum SDK version this application targets. It may run on earilier + * versions, but it knows how to work with any new behavior added at this + * version. Will be {@link android.os.Build.VERSION_CODES#CUR_DEVELOPMENT} + * if this is a development build and the app is targeting that. You should + * compare that this number is >= the SDK version number at which your + * behavior was introduced. + */ + public int targetSdkVersion; + + /** * When false, indicates that all components within this application are * considered disabled, regardless of their individually set enabled status. */ @@ -200,6 +204,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { pw.println(prefix + "publicSourceDir=" + publicSourceDir); pw.println(prefix + "sharedLibraryFiles=" + sharedLibraryFiles); pw.println(prefix + "dataDir=" + dataDir); + pw.println(prefix + "targetSdkVersion=" + targetSdkVersion); pw.println(prefix + "enabled=" + enabled); pw.println(prefix + "manageSpaceActivityName="+manageSpaceActivityName); pw.println(prefix + "description=0x"+Integer.toHexString(descriptionRes)); @@ -246,6 +251,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { sharedLibraryFiles = orig.sharedLibraryFiles; dataDir = orig.dataDir; uid = orig.uid; + targetSdkVersion = orig.targetSdkVersion; enabled = orig.enabled; manageSpaceActivityName = orig.manageSpaceActivityName; descriptionRes = orig.descriptionRes; @@ -276,6 +282,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { dest.writeStringArray(sharedLibraryFiles); dest.writeString(dataDir); dest.writeInt(uid); + dest.writeInt(targetSdkVersion); dest.writeInt(enabled ? 1 : 0); dest.writeString(manageSpaceActivityName); dest.writeInt(descriptionRes); @@ -305,6 +312,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { sharedLibraryFiles = source.readStringArray(); dataDir = source.readString(); uid = source.readInt(); + targetSdkVersion = source.readInt(); enabled = source.readInt() != 0; manageSpaceActivityName = source.readString(); descriptionRes = source.readInt(); diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 88907c1..78462f1 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -55,6 +55,30 @@ import java.util.jar.JarFile; * {@hide} */ public class PackageParser { + /** @hide */ + public static class NewPermissionInfo { + public final String name; + public final int sdkVersion; + public final int fileVersion; + + public NewPermissionInfo(String name, int sdkVersion, int fileVersion) { + this.name = name; + this.sdkVersion = sdkVersion; + this.fileVersion = fileVersion; + } + } + + /** + * List of new permissions that have been added since 1.0. + * NOTE: These must be declared in SDK version order, with permissions + * added to older SDKs appearing before those added to newer SDKs. + * @hide + */ + public static final PackageParser.NewPermissionInfo NEW_PERMISSIONS[] = new PackageParser.NewPermissionInfo[] { + new PackageParser.NewPermissionInfo(android.Manifest.permission.WRITE_SDCARD, + android.os.Build.VERSION_CODES.DONUT, + 0) + }; private String mArchiveSourcePath; private String[] mSeparateProcesses; @@ -616,7 +640,6 @@ public class PackageParser { final Package pkg = new Package(pkgName); boolean foundApp = false; - boolean targetsSdk = false; TypedArray sa = res.obtainAttributes(attrs, com.android.internal.R.styleable.AndroidManifest); @@ -774,11 +797,10 @@ public class PackageParser { return null; } // If the code matches, it definitely targets this SDK. - targetsSdk = true; - } else if (targetVers >= mSdkVersion) { - // If they have explicitly targeted our current version - // or something after it, then note this. - targetsSdk = true; + pkg.applicationInfo.targetSdkVersion + = android.os.Build.VERSION_CODES.CUR_DEVELOPMENT; + } else { + pkg.applicationInfo.targetSdkVersion = targetVers; } if (minVers > mSdkVersion) { @@ -824,8 +846,18 @@ public class PackageParser { mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_EMPTY; } - if (targetsSdk) { - pkg.applicationInfo.flags |= ApplicationInfo.FLAG_TARGETS_SDK; + final int NP = PackageParser.NEW_PERMISSIONS.length; + for (int ip=0; ip<NP; ip++) { + final PackageParser.NewPermissionInfo npi + = PackageParser.NEW_PERMISSIONS[ip]; + if (pkg.applicationInfo.targetSdkVersion >= npi.sdkVersion) { + break; + } + if (!pkg.requestedPermissions.contains(npi.name)) { + Log.i(TAG, "Impliciting adding " + npi.name + " to old pkg " + + pkg.packageName); + pkg.requestedPermissions.add(npi.name); + } } if (pkg.usesLibraries.size() > 0) { diff --git a/core/java/android/gesture/Gesture.java b/core/java/android/gesture/Gesture.java new file mode 100755 index 0000000..14530a1 --- /dev/null +++ b/core/java/android/gesture/Gesture.java @@ -0,0 +1,298 @@ +/* + * Copyright (C) 2008-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.gesture; + +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.RectF; +import android.os.Parcel; +import android.os.Parcelable; +import android.util.Log; + +import java.io.IOException; +import java.io.DataOutputStream; +import java.io.DataInputStream; +import java.io.ByteArrayOutputStream; +import java.io.ByteArrayInputStream; +import java.util.ArrayList; + +/** + * A gesture can have a single or multiple strokes + */ + +public class Gesture implements Parcelable { + private static final long GESTURE_ID_BASE = System.currentTimeMillis(); + + private static final int BITMAP_RENDERING_WIDTH = 2; + + private static final boolean BITMAP_RENDERING_ANTIALIAS = true; + private static final boolean BITMAP_RENDERING_DITHER = true; + + private static int sGestureCount = 0; + + private RectF mBoundingBox; + + // the same as its instance ID + private long mGestureID; + + private final ArrayList<GestureStroke> mStrokes = new ArrayList<GestureStroke>(); + + public Gesture() { + mGestureID = GESTURE_ID_BASE + sGestureCount++; + } + + /** + * @return all the strokes of the gesture + */ + public ArrayList<GestureStroke> getStrokes() { + return mStrokes; + } + + /** + * @return the number of strokes included by this gesture + */ + public int getStrokesCount() { + return mStrokes.size(); + } + + /** + * Add a stroke to the gesture + * + * @param stroke + */ + public void addStroke(GestureStroke stroke) { + mStrokes.add(stroke); + + if (mBoundingBox == null) { + mBoundingBox = new RectF(stroke.boundingBox); + } else { + mBoundingBox.union(stroke.boundingBox); + } + } + + /** + * Get the total length of the gesture. When there are multiple strokes in + * the gesture, this returns the sum of the lengths of all the strokes + * + * @return the length of the gesture + */ + public float getLength() { + int len = 0; + final ArrayList<GestureStroke> strokes = mStrokes; + final int count = strokes.size(); + + for (int i = 0; i < count; i++) { + len += strokes.get(i).length; + } + + return len; + } + + /** + * @return the bounding box of the gesture + */ + public RectF getBoundingBox() { + return mBoundingBox; + } + + /** + * Set the id of the gesture + * + * @param id + */ + void setID(long id) { + mGestureID = id; + } + + /** + * @return the id of the gesture + */ + public long getID() { + return mGestureID; + } + + /** + * draw the gesture + * + * @param canvas + */ + void draw(Canvas canvas, Paint paint) { + final ArrayList<GestureStroke> strokes = mStrokes; + final int count = strokes.size(); + + for (int i = 0; i < count; i++) { + strokes.get(i).draw(canvas, paint); + } + } + + /** + * Create a bitmap of the gesture with a transparent background + * + * @param width width of the target bitmap + * @param height height of the target bitmap + * @param edge the edge + * @param numSample + * @param color + * @return the bitmap + */ + public Bitmap toBitmap(int width, int height, int edge, int numSample, int color) { + final Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + final Canvas canvas = new Canvas(bitmap); + + canvas.translate(edge, edge); + + final Paint paint = new Paint(); + paint.setAntiAlias(BITMAP_RENDERING_ANTIALIAS); + paint.setDither(BITMAP_RENDERING_DITHER); + paint.setColor(color); + paint.setStyle(Paint.Style.STROKE); + paint.setStrokeJoin(Paint.Join.ROUND); + paint.setStrokeCap(Paint.Cap.ROUND); + paint.setStrokeWidth(BITMAP_RENDERING_WIDTH); + + final ArrayList<GestureStroke> strokes = mStrokes; + final int count = strokes.size(); + + for (int i = 0; i < count; i++) { + Path path = strokes.get(i).toPath(width - 2 * edge, height - 2 * edge, numSample); + canvas.drawPath(path, paint); + } + + return bitmap; + } + + /** + * Create a bitmap of the gesture with a transparent background + * + * @param width + * @param height + * @param edge + * @param color + * @return the bitmap + */ + public Bitmap toBitmap(int width, int height, int edge, int color) { + final Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + final Canvas canvas = new Canvas(bitmap); + + canvas.translate(edge, edge); + + final Paint paint = new Paint(); + paint.setAntiAlias(BITMAP_RENDERING_ANTIALIAS); + paint.setDither(BITMAP_RENDERING_DITHER); + paint.setColor(color); + paint.setStyle(Paint.Style.STROKE); + paint.setStrokeJoin(Paint.Join.ROUND); + paint.setStrokeCap(Paint.Cap.ROUND); + paint.setStrokeWidth(BITMAP_RENDERING_WIDTH); + + final ArrayList<GestureStroke> strokes = mStrokes; + final int count = strokes.size(); + + for (int i = 0; i < count; i++) { + strokes.get(i).draw(canvas, paint); + } + + return bitmap; + } + + void serialize(DataOutputStream out) throws IOException { + final ArrayList<GestureStroke> strokes = mStrokes; + final int count = strokes.size(); + + // Write gesture ID + out.writeLong(mGestureID); + // Write number of strokes + out.writeInt(count); + + for (int i = 0; i < count; i++) { + strokes.get(i).serialize(out); + } + } + + static Gesture deserialize(DataInputStream in) throws IOException { + final Gesture gesture = new Gesture(); + + // Gesture ID + gesture.mGestureID = in.readLong(); + // Number of strokes + final int count = in.readInt(); + + for (int i = 0; i < count; i++) { + gesture.addStroke(GestureStroke.deserialize(in)); + } + + return gesture; + } + + public static final Parcelable.Creator<Gesture> CREATOR = new Parcelable.Creator<Gesture>() { + public Gesture createFromParcel(Parcel in) { + Gesture gesture = null; + final long gestureID = in.readLong(); + + final DataInputStream inStream = new DataInputStream( + new ByteArrayInputStream(in.createByteArray())); + + try { + gesture = deserialize(inStream); + } catch (IOException e) { + Log.e(GestureConstants.LOG_TAG, "Error reading Gesture from parcel:", e); + } finally { + GestureUtilities.closeStream(inStream); + } + + if (gesture != null) { + gesture.mGestureID = gestureID; + } + + return gesture; + } + + public Gesture[] newArray(int size) { + return new Gesture[size]; + } + }; + + public void writeToParcel(Parcel out, int flags) { + out.writeLong(mGestureID); + + boolean result = false; + final ByteArrayOutputStream byteStream = + new ByteArrayOutputStream(GestureConstants.IO_BUFFER_SIZE); + final DataOutputStream outStream = new DataOutputStream(byteStream); + + try { + serialize(outStream); + result = true; + } catch (IOException e) { + Log.e(GestureConstants.LOG_TAG, "Error writing Gesture to parcel:", e); + } finally { + GestureUtilities.closeStream(outStream); + GestureUtilities.closeStream(byteStream); + } + + if (result) { + out.writeByteArray(byteStream.toByteArray()); + } + } + + public int describeContents() { + return 0; + } +} + diff --git a/core/java/android/gesture/GestureConstants.java b/core/java/android/gesture/GestureConstants.java new file mode 100644 index 0000000..230db0c --- /dev/null +++ b/core/java/android/gesture/GestureConstants.java @@ -0,0 +1,26 @@ +/* + * 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.gesture; + +interface GestureConstants { + static final int STROKE_STRING_BUFFER_SIZE = 1024; + static final int STROKE_POINT_BUFFER_SIZE = 100; // number of points + + static final int IO_BUFFER_SIZE = 32 * 1024; // 32K + + static final String LOG_TAG = "Gestures"; +} diff --git a/core/java/android/gesture/GestureLibrary.java b/core/java/android/gesture/GestureLibrary.java new file mode 100644 index 0000000..1cf192e --- /dev/null +++ b/core/java/android/gesture/GestureLibrary.java @@ -0,0 +1,346 @@ +/* + * Copyright (C) 2008-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.gesture; + +import android.util.Log; +import android.os.SystemClock; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.DataOutputStream; +import java.io.DataInputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Set; +import java.util.Map; + +import static android.gesture.GestureConstants.LOG_TAG; + +/** + * GestureLibrary maintains gesture examples and makes predictions on a new + * gesture + */ +// +// File format for GestureLibrary: +// +// Nb. bytes Java type Description +// ----------------------------------- +// Header +// 2 bytes short File format version number +// 4 bytes int Number of entries +// Entry +// X bytes UTF String Entry name +// 4 bytes int Number of gestures +// Gesture +// 8 bytes long Gesture ID +// 4 bytes int Number of strokes +// Stroke +// 4 bytes int Number of points +// Point +// 4 bytes float X coordinate of the point +// 4 bytes float Y coordinate of the point +// 8 bytes long Time stamp +// +public class GestureLibrary { + public static final int SEQUENCE_INVARIANT = 1; + // when SEQUENCE_SENSITIVE is used, only single stroke gestures are currently allowed + public static final int SEQUENCE_SENSITIVE = 2; + + // ORIENTATION_SENSITIVE and ORIENTATION_INVARIANT are only for SEQUENCE_SENSITIVE gestures + public static final int ORIENTATION_INVARIANT = 1; + public static final int ORIENTATION_SENSITIVE = 2; + + private static final short FILE_FORMAT_VERSION = 1; + + private static final boolean PROFILE_LOADING_SAVING = false; + + private int mSequenceType = SEQUENCE_SENSITIVE; + private int mOrientationStyle = ORIENTATION_SENSITIVE; + + private final String mGestureFileName; + + private final HashMap<String, ArrayList<Gesture>> mNamedGestures = + new HashMap<String, ArrayList<Gesture>>(); + + private Learner mClassifier; + + private boolean mChanged = false; + + /** + * @param path where gesture data is stored + */ + public GestureLibrary(String path) { + mGestureFileName = path; + mClassifier = new InstanceLearner(); + } + + /** + * Specify how the gesture library will handle orientation. + * Use ORIENTATION_INVARIANT or ORIENTATION_SENSITIVE + * + * @param style + */ + public void setOrientationStyle(int style) { + mOrientationStyle = style; + } + + public int getOrientationStyle() { + return mOrientationStyle; + } + + /** + * @param type SEQUENCE_INVARIANT or SEQUENCE_SENSITIVE + */ + public void setSequenceType(int type) { + mSequenceType = type; + } + + /** + * @return SEQUENCE_INVARIANT or SEQUENCE_SENSITIVE + */ + public int getSequenceType() { + return mSequenceType; + } + + /** + * Get all the gesture entry names in the library + * + * @return a set of strings + */ + public Set<String> getGestureEntries() { + return mNamedGestures.keySet(); + } + + /** + * Recognize a gesture + * + * @param gesture the query + * @return a list of predictions of possible entries for a given gesture + */ + public ArrayList<Prediction> recognize(Gesture gesture) { + Instance instance = Instance.createInstance(mSequenceType, gesture, null); + return mClassifier.classify(mSequenceType, instance.vector); + } + + /** + * Add a gesture for the entry + * + * @param entryName entry name + * @param gesture + */ + public void addGesture(String entryName, Gesture gesture) { + if (entryName == null || entryName.length() == 0) { + return; + } + ArrayList<Gesture> gestures = mNamedGestures.get(entryName); + if (gestures == null) { + gestures = new ArrayList<Gesture>(); + mNamedGestures.put(entryName, gestures); + } + gestures.add(gesture); + mClassifier.addInstance(Instance.createInstance(mSequenceType, gesture, entryName)); + mChanged = true; + } + + /** + * Remove a gesture from the library. If there are no more gestures for the + * given entry, the gesture entry will be removed. + * + * @param entryName entry name + * @param gesture + */ + public void removeGesture(String entryName, Gesture gesture) { + ArrayList<Gesture> gestures = mNamedGestures.get(entryName); + if (gestures == null) { + return; + } + + gestures.remove(gesture); + + // if there are no more samples, remove the entry automatically + if (gestures.isEmpty()) { + mNamedGestures.remove(entryName); + } + + mClassifier.removeInstance(gesture.getID()); + + mChanged = true; + } + + /** + * Remove a entry of gestures + * + * @param entryName the entry name + */ + public void removeEntry(String entryName) { + mNamedGestures.remove(entryName); + mClassifier.removeInstances(entryName); + mChanged = true; + } + + /** + * Get all the gestures of an entry + * + * @param entryName + * @return the list of gestures that is under this name + */ + public ArrayList<Gesture> getGestures(String entryName) { + ArrayList<Gesture> gestures = mNamedGestures.get(entryName); + if (gestures != null) { + return new ArrayList<Gesture>(gestures); + } else { + return null; + } + } + + /** + * Save the gesture library + */ + public boolean save() { + if (!mChanged) { + return true; + } + + boolean result = false; + DataOutputStream out = null; + + try { + File file = new File(mGestureFileName); + if (!file.getParentFile().exists()) { + if (!file.getParentFile().mkdirs()) { + return false; + } + } + + long start; + if (PROFILE_LOADING_SAVING) { + start = SystemClock.elapsedRealtime(); + } + + final HashMap<String, ArrayList<Gesture>> maps = mNamedGestures; + + out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file), + GestureConstants.IO_BUFFER_SIZE)); + // Write version number + out.writeShort(FILE_FORMAT_VERSION); + // Write number of entries + out.writeInt(maps.size()); + + for (Map.Entry<String, ArrayList<Gesture>> entry : maps.entrySet()) { + final String key = entry.getKey(); + final ArrayList<Gesture> examples = entry.getValue(); + final int count = examples.size(); + + // Write entry name + out.writeUTF(key); + // Write number of examples for this entry + out.writeInt(count); + + for (int i = 0; i < count; i++) { + examples.get(i).serialize(out); + } + } + + out.flush(); + + if (PROFILE_LOADING_SAVING) { + long end = SystemClock.elapsedRealtime(); + Log.d(LOG_TAG, "Saving gestures library = " + (end - start) + " ms"); + } + + mChanged = false; + result = true; + } catch (IOException ex) { + Log.d(LOG_TAG, "Failed to save gestures:", ex); + } finally { + GestureUtilities.closeStream(out); + } + + return result; + } + + /** + * Load the gesture library + */ + public boolean load() { + boolean result = false; + + final File file = new File(mGestureFileName); + if (file.exists()) { + DataInputStream in = null; + try { + in = new DataInputStream(new BufferedInputStream( + new FileInputStream(mGestureFileName), GestureConstants.IO_BUFFER_SIZE)); + + long start; + if (PROFILE_LOADING_SAVING) { + start = SystemClock.elapsedRealtime(); + } + + // Read file format version number + final short versionNumber = in.readShort(); + switch (versionNumber) { + case 1: + readFormatV1(in); + break; + } + + if (PROFILE_LOADING_SAVING) { + long end = SystemClock.elapsedRealtime(); + Log.d(LOG_TAG, "Loading gestures library = " + (end - start) + " ms"); + } + + result = true; + } catch (IOException ex) { + Log.d(LOG_TAG, "Failed to load gestures:", ex); + } finally { + GestureUtilities.closeStream(in); + } + } + + return result; + } + + private void readFormatV1(DataInputStream in) throws IOException { + final Learner classifier = mClassifier; + final HashMap<String, ArrayList<Gesture>> namedGestures = mNamedGestures; + namedGestures.clear(); + + // Number of entries in the library + final int entriesCount = in.readInt(); + + for (int i = 0; i < entriesCount; i++) { + // Entry name + final String name = in.readUTF(); + // Number of gestures + final int gestureCount = in.readInt(); + + final ArrayList<Gesture> gestures = new ArrayList<Gesture>(gestureCount); + for (int j = 0; j < gestureCount; j++) { + final Gesture gesture = Gesture.deserialize(in); + gestures.add(gesture); + classifier.addInstance(Instance.createInstance(mSequenceType, gesture, name)); + } + + namedGestures.put(name, gestures); + } + } +} diff --git a/core/java/android/gesture/GestureOverlayView.java b/core/java/android/gesture/GestureOverlayView.java new file mode 100755 index 0000000..bffd12e --- /dev/null +++ b/core/java/android/gesture/GestureOverlayView.java @@ -0,0 +1,419 @@ +/* + * Copyright (C) 2008-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.gesture; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BlurMaskFilter; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.Rect; +import android.graphics.Color; +import android.os.Handler; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; + +import java.util.ArrayList; + +/** + * A (transparent) overlay for gesture input that can be placed on top of other + * widgets. The view can also be opaque. + */ + +public class GestureOverlayView extends View { + static final float TOUCH_TOLERANCE = 3; + + // TODO: Move all these values into XML attributes + private static final int TRANSPARENT_BACKGROUND = 0x00000000; + + // TODO: SHOULD BE A TOTAL DURATION + private static final float FADING_ALPHA_CHANGE = 0.15f; + private static final long FADING_OFFSET = 300; + private static final long FADING_REFRESHING_RATE = 16; + + private static final int GESTURE_STROKE_WIDTH = 12; + private static final boolean GESTURE_RENDERING_ANTIALIAS = true; + + private static final boolean DITHER_FLAG = true; + + public static final int DEFAULT_GESTURE_COLOR = 0xFFFFFF00; + public static final int DEFAULT_UNCERTAIN_GESTURE_COLOR = Color.argb(60, 255, 255, 0); + + private static final int REFRESH_RANGE = 10; + + private static final BlurMaskFilter BLUR_MASK_FILTER = + new BlurMaskFilter(1, BlurMaskFilter.Blur.NORMAL); + + private Paint mGesturePaint; + + private final Paint mBitmapPaint = new Paint(Paint.DITHER_FLAG); + private Bitmap mBitmap; // with transparent background + private Canvas mBitmapCanvas; + + private int mCertainGestureColor = DEFAULT_GESTURE_COLOR; + private int mUncertainGestureColor = DEFAULT_UNCERTAIN_GESTURE_COLOR; + + // for rendering immediate ink feedback + private Rect mInvalidRect = new Rect(); + + private Path mPath; + + private float mX; + private float mY; + + private float mCurveEndX; + private float mCurveEndY; + + // current gesture + private Gesture mCurrentGesture = null; + + // TODO: Make this a list of WeakReferences + private final ArrayList<OnGestureListener> mOnGestureListeners = new ArrayList<OnGestureListener>(); + private ArrayList<GesturePoint> mPointBuffer = null; + + // fading out effect + private boolean mIsFadingOut = false; + private float mFadingAlpha = 1; + + private Handler mHandler = new Handler(); + + private final Runnable mFadingOut = new Runnable() { + public void run() { + if (mIsFadingOut) { + mFadingAlpha -= FADING_ALPHA_CHANGE; + if (mFadingAlpha <= 0) { + mIsFadingOut = false; + mPath = null; + mCurrentGesture = null; + mBitmap.eraseColor(TRANSPARENT_BACKGROUND); + } else { + mHandler.postDelayed(this, FADING_REFRESHING_RATE); + } + invalidate(); + } + } + }; + + public GestureOverlayView(Context context) { + super(context); + init(); + } + + public GestureOverlayView(Context context, AttributeSet attrs) { + super(context, attrs); + init(); + } + + public ArrayList<GesturePoint> getCurrentStroke() { + return mPointBuffer; + } + + public Gesture getCurrentGesture() { + return mCurrentGesture; + } + + /** + * Set Gesture color + * + * @param color + */ + public void setGestureDrawingColor(int color) { + mGesturePaint.setColor(color); + if (mCurrentGesture != null) { + mBitmap.eraseColor(TRANSPARENT_BACKGROUND); + mCurrentGesture.draw(mBitmapCanvas, mGesturePaint); + } + } + + public void setGestureColor(int color) { + mCertainGestureColor = color; + } + + public void setUncertainGestureColor(int color) { + mUncertainGestureColor = color; + } + + public int getUncertainGestureColor() { + return mUncertainGestureColor; + } + + public int getGestureColor() { + return mCertainGestureColor; + } + + /** + * Set the gesture to be shown in the view + * + * @param gesture + */ + public void setCurrentGesture(Gesture gesture) { + if (mCurrentGesture != null) { + clear(false); + } + + mCurrentGesture = gesture; + + if (gesture != null) { + if (mBitmapCanvas != null) { + gesture.draw(mBitmapCanvas, mGesturePaint); + invalidate(); + } + } + } + + private void init() { + mGesturePaint = new Paint(); + + final Paint gesturePaint = mGesturePaint; + gesturePaint.setAntiAlias(GESTURE_RENDERING_ANTIALIAS); + gesturePaint.setColor(DEFAULT_GESTURE_COLOR); + gesturePaint.setStyle(Paint.Style.STROKE); + gesturePaint.setStrokeJoin(Paint.Join.ROUND); + gesturePaint.setStrokeCap(Paint.Cap.ROUND); + gesturePaint.setStrokeWidth(GESTURE_STROKE_WIDTH); + gesturePaint.setDither(DITHER_FLAG); + + mPath = null; + } + + @Override + protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) { + super.onSizeChanged(width, height, oldWidth, oldHeight); + + if (width <= 0 || height <= 0) { + return; + } + + int targetWidth = width > oldWidth ? width : oldWidth; + int targetHeight = height > oldHeight ? height : oldHeight; + + if (mBitmap != null) mBitmap.recycle(); + + mBitmap = Bitmap.createBitmap(targetWidth, targetHeight, Bitmap.Config.ARGB_8888); + if (mBitmapCanvas != null) { + mBitmapCanvas.setBitmap(mBitmap); + } else { + mBitmapCanvas = new Canvas(mBitmap); + } + mBitmapCanvas.drawColor(TRANSPARENT_BACKGROUND); + + if (mCurrentGesture != null) { + mCurrentGesture.draw(mBitmapCanvas, mGesturePaint); + } + } + + public void addOnGestureListener(OnGestureListener listener) { + mOnGestureListeners.add(listener); + } + + public void removeOnGestureListener(OnGestureListener listener) { + mOnGestureListeners.remove(listener); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + // draw double buffer + if (mIsFadingOut) { + mBitmapPaint.setAlpha((int) (255 * mFadingAlpha)); + canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); + } else { + mBitmapPaint.setAlpha(255); + canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); + } + + // draw the current stroke + if (mPath != null) { + canvas.drawPath(mPath, mGesturePaint); + } + } + + /** + * Clear up the overlay + * + * @param fadeOut whether the gesture on the overlay should fade out + * gradually or disappear immediately + */ + public void clear(boolean fadeOut) { + if (fadeOut) { + mFadingAlpha = 1; + mIsFadingOut = true; + mHandler.removeCallbacks(mFadingOut); + mHandler.postDelayed(mFadingOut, FADING_OFFSET); + } else { + mPath = null; + mCurrentGesture = null; + if (mBitmap != null) { + mBitmap.eraseColor(TRANSPARENT_BACKGROUND); + invalidate(); + } + } + } + + public void cancelFadingOut() { + mIsFadingOut = false; + mHandler.removeCallbacks(mFadingOut); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (!isEnabled()) { + return true; + } + + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + Rect rect = touchStart(event); + invalidate(rect); + break; + case MotionEvent.ACTION_MOVE: + rect = touchMove(event); + if (rect != null) { + invalidate(rect); + } + break; + case MotionEvent.ACTION_UP: + touchUp(event); + invalidate(); + break; + } + + return true; + } + + private Rect touchStart(MotionEvent event) { + // pass the event to handlers + final ArrayList<OnGestureListener> listeners = mOnGestureListeners; + final int count = listeners.size(); + for (int i = 0; i < count; i++) { + OnGestureListener listener = listeners.get(i); + listener.onGestureStarted(this, event); + } + + // if there is fading out going on, stop it. + if (mIsFadingOut) { + mIsFadingOut = false; + mHandler.removeCallbacks(mFadingOut); + mBitmap.eraseColor(TRANSPARENT_BACKGROUND); + mCurrentGesture = null; + } + + float x = event.getX(); + float y = event.getY(); + + mX = x; + mY = y; + + if (mCurrentGesture == null) { + mCurrentGesture = new Gesture(); + } + + mPointBuffer = new ArrayList<GesturePoint>(); + mPointBuffer.add(new GesturePoint(x, y, event.getEventTime())); + + mPath = new Path(); + mPath.moveTo(x, y); + + mInvalidRect.set((int) x - REFRESH_RANGE, (int) y - REFRESH_RANGE, + (int) x + REFRESH_RANGE, (int) y + REFRESH_RANGE); + + mCurveEndX = x; + mCurveEndY = y; + + return mInvalidRect; + } + + private Rect touchMove(MotionEvent event) { + Rect areaToRefresh = null; + + float x = event.getX(); + float y = event.getY(); + + float dx = Math.abs(x - mX); + float dy = Math.abs(y - mY); + + if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { + + // start with the curve end + mInvalidRect.set((int) mCurveEndX - REFRESH_RANGE, (int) mCurveEndY - REFRESH_RANGE, + (int) mCurveEndX + REFRESH_RANGE, (int) mCurveEndY + REFRESH_RANGE); + + mCurveEndX = (x + mX) / 2; + mCurveEndY = (y + mY) / 2; + mPath.quadTo(mX, mY, mCurveEndX, mCurveEndY); + + // union with the control point of the new curve + mInvalidRect.union((int) mX - REFRESH_RANGE, (int) mY - REFRESH_RANGE, + (int) mX + REFRESH_RANGE, (int) mY + REFRESH_RANGE); + + // union with the end point of the new curve + mInvalidRect.union((int) mCurveEndX - REFRESH_RANGE, (int) mCurveEndY - REFRESH_RANGE, + (int) mCurveEndX + REFRESH_RANGE, (int) mCurveEndY + REFRESH_RANGE); + + areaToRefresh = mInvalidRect; + + mX = x; + mY = y; + } + + + mPointBuffer.add(new GesturePoint(x, y, event.getEventTime())); + + // pass the event to handlers + final ArrayList<OnGestureListener> listeners = mOnGestureListeners; + final int count = listeners.size(); + for (int i = 0; i < count; i++) { + listeners.get(i).onGesture(this, event); + } + + return areaToRefresh; + } + + private void touchUp(MotionEvent event) { + // add the stroke to the current gesture + mCurrentGesture.addStroke(new GestureStroke(mPointBuffer)); + + // add the stroke to the double buffer + mGesturePaint.setMaskFilter(BLUR_MASK_FILTER); + mBitmapCanvas.drawPath(mPath, mGesturePaint); + mGesturePaint.setMaskFilter(null); + + // pass the event to handlers + final ArrayList<OnGestureListener> listeners = mOnGestureListeners; + final int count = listeners.size(); + for (int i = 0; i < count; i++) { + listeners.get(i).onGestureEnded(this, event); + } + + mPath = null; + mPointBuffer = null; + } + + /** + * An interface for processing gesture events + */ + public static interface OnGestureListener { + public void onGestureStarted(GestureOverlayView overlay, MotionEvent event); + + public void onGesture(GestureOverlayView overlay, MotionEvent event); + + public void onGestureEnded(GestureOverlayView overlay, MotionEvent event); + } +} diff --git a/core/java/android/gesture/GesturePoint.java b/core/java/android/gesture/GesturePoint.java new file mode 100644 index 0000000..3698011 --- /dev/null +++ b/core/java/android/gesture/GesturePoint.java @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2008-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.gesture; + +import java.io.DataInputStream; +import java.io.IOException; + +/** + * A timed point of a gesture stroke + */ + +public class GesturePoint { + public final float x; + public final float y; + + public final long timestamp; + + public GesturePoint(float x, float y, long t) { + this.x = x; + this.y = y; + timestamp = t; + } + + static GesturePoint deserialize(DataInputStream in) throws IOException { + // Read X and Y + final float x = in.readFloat(); + final float y = in.readFloat(); + // Read timestamp + final long timeStamp = in.readLong(); + return new GesturePoint(x, y, timeStamp); + } +} diff --git a/core/java/android/gesture/GestureStroke.java b/core/java/android/gesture/GestureStroke.java new file mode 100644 index 0000000..5160a76 --- /dev/null +++ b/core/java/android/gesture/GestureStroke.java @@ -0,0 +1,215 @@ +/* + * Copyright (C) 2008-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.gesture; + +import android.graphics.Canvas; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.RectF; + +import java.io.IOException; +import java.io.DataOutputStream; +import java.io.DataInputStream; +import java.util.ArrayList; + +/** + * A gesture stroke started on a touch down and ended on a touch up. + */ +public class GestureStroke { + public final RectF boundingBox; + + public final float length; + public final float[] points; + + private final long[] timestamps; + private Path mCachedPath; + + /** + * Construct a gesture stroke from a list of gesture points + * + * @param points + */ + public GestureStroke(ArrayList<GesturePoint> points) { + final int count = points.size(); + final float[] tmpPoints = new float[count * 2]; + final long[] times = new long[count]; + + RectF bx = null; + float len = 0; + int index = 0; + + for (int i = 0; i < count; i++) { + final GesturePoint p = points.get(i); + tmpPoints[i * 2] = p.x; + tmpPoints[i * 2 + 1] = p.y; + times[index] = p.timestamp; + + if (bx == null) { + bx = new RectF(); + bx.top = p.y; + bx.left = p.x; + bx.right = p.x; + bx.bottom = p.y; + len = 0; + } else { + len += Math.sqrt(Math.pow(p.x - tmpPoints[(i - 1) * 2], 2) + + Math.pow(p.y - tmpPoints[(i -1 ) * 2 + 1], 2)); + bx.union(p.x, p.y); + } + index++; + } + + timestamps = times; + this.points = tmpPoints; + boundingBox = bx; + length = len; + } + + /** + * Draw the gesture with a given canvas and paint + * + * @param canvas + */ + void draw(Canvas canvas, Paint paint) { + if (mCachedPath == null) { + final float[] localPoints = points; + final int count = localPoints.length; + + Path path = null; + + float mX = 0; + float mY = 0; + + for (int i = 0; i < count; i += 2) { + float x = localPoints[i]; + float y = localPoints[i + 1]; + if (path == null) { + path = new Path(); + path.moveTo(x, y); + mX = x; + mY = y; + } else { + float dx = Math.abs(x - mX); + float dy = Math.abs(y - mY); + if (dx >= 3 || dy >= 3) { + path.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2); + mX = x; + mY = y; + } + } + } + + mCachedPath = path; + } + + canvas.drawPath(mCachedPath, paint); + } + + /** + * Convert the stroke to a Path based on the number of points + * + * @param width the width of the bounding box of the target path + * @param height the height of the bounding box of the target path + * @param numSample the number of points needed + * + * @return the path + */ + public Path toPath(float width, float height, int numSample) { + final float[] pts = GestureUtilities.temporalSampling(this, numSample); + final RectF rect = boundingBox; + + final Matrix matrix = new Matrix(); + matrix.setTranslate(-rect.left, -rect.top); + matrix.postScale(width / rect.width(), height / rect.height()); + matrix.mapPoints(pts); + + float mX = 0; + float mY = 0; + + Path path = null; + + final int count = pts.length; + + for (int i = 0; i < count; i += 2) { + float x = pts[i]; + float y = pts[i + 1]; + if (path == null) { + path = new Path(); + path.moveTo(x, y); + mX = x; + mY = y; + } else { + float dx = Math.abs(x - mX); + float dy = Math.abs(y - mY); + if (dx >= GestureOverlayView.TOUCH_TOLERANCE || + dy >= GestureOverlayView.TOUCH_TOLERANCE) { + path.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2); + mX = x; + mY = y; + } + } + } + + return path; + } + + void serialize(DataOutputStream out) throws IOException { + final float[] pts = points; + final long[] times = timestamps; + final int count = points.length; + + // Write number of points + out.writeInt(count / 2); + + for (int i = 0; i < count; i += 2) { + // Write X + out.writeFloat(pts[i]); + // Write Y + out.writeFloat(pts[i + 1]); + // Write timestamp + out.writeLong(times[i / 2]); + } + } + + static GestureStroke deserialize(DataInputStream in) throws IOException { + // Number of points + final int count = in.readInt(); + + final ArrayList<GesturePoint> points = new ArrayList<GesturePoint>(count); + for (int i = 0; i < count; i++) { + points.add(GesturePoint.deserialize(in)); + } + + return new GestureStroke(points); + } + + /** + * Invalidate the cached path that is used to render the stroke + */ + public void clearPath() { + if (mCachedPath != null) mCachedPath.rewind(); + } + + /** + * Compute an oriented bounding box of the stroke + * @return OrientedBoundingBox + */ + public OrientedBoundingBox computeOrientedBoundingBox() { + return GestureUtilities.computeOrientedBoundingBox(points); + } +} diff --git a/core/java/android/gesture/GestureUtilities.java b/core/java/android/gesture/GestureUtilities.java new file mode 100755 index 0000000..e47856c --- /dev/null +++ b/core/java/android/gesture/GestureUtilities.java @@ -0,0 +1,444 @@ +/* + * Copyright (C) 2008-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.gesture; + +import android.graphics.RectF; +import android.graphics.Matrix; +import android.util.Log; + +import java.util.ArrayList; +import java.util.Arrays; +import java.io.Closeable; +import java.io.IOException; + +import static android.gesture.GestureConstants.*; + +final class GestureUtilities { + private static final int TEMPORAL_SAMPLING_RATE = 16; + + private GestureUtilities() { + } + + /** + * Closes the specified stream. + * + * @param stream The stream to close. + */ + static void closeStream(Closeable stream) { + if (stream != null) { + try { + stream.close(); + } catch (IOException e) { + Log.e(LOG_TAG, "Could not close stream", e); + } + } + } + + static float[] spatialSampling(Gesture gesture, int sampleMatrixDimension) { + final float targetPatchSize = sampleMatrixDimension - 1; // edge inclusive + float[] sample = new float[sampleMatrixDimension * sampleMatrixDimension]; + Arrays.fill(sample, 0); + + RectF rect = gesture.getBoundingBox(); + float sx = targetPatchSize / rect.width(); + float sy = targetPatchSize / rect.height(); + float scale = sx < sy ? sx : sy; + + Matrix trans = new Matrix(); + trans.setScale(scale, scale); + trans.preTranslate(-rect.centerX(), -rect.centerY()); + trans.postTranslate(targetPatchSize / 2, targetPatchSize / 2); + + final ArrayList<GestureStroke> strokes = gesture.getStrokes(); + final int count = strokes.size(); + + int size; + float xpos; + float ypos; + + for (int index = 0; index < count; index++) { + final GestureStroke stroke = strokes.get(index); + size = stroke.points.length; + + final float[] pts = new float[size]; + + trans.mapPoints(pts, 0, stroke.points, 0, size / 2); + float segmentEndX = -1; + float segmentEndY = -1; + + for (int i = 0; i < size; i += 2) { + + float segmentStartX = pts[i] < 0 ? 0 : pts[i]; + float segmentStartY = pts[i + 1] < 0 ? 0 : pts[i + 1]; + + if (segmentStartX > targetPatchSize) { + segmentStartX = targetPatchSize; + } + + if (segmentStartY > targetPatchSize) { + segmentStartY = targetPatchSize; + } + + plot(segmentStartX, segmentStartY, sample, sampleMatrixDimension); + + if (segmentEndX != -1) { + // evaluate horizontally + if (segmentEndX > segmentStartX) { + xpos = (float) Math.ceil(segmentStartX); + float slope = (segmentEndY - segmentStartY) / (segmentEndX - segmentStartX); + while (xpos < segmentEndX) { + ypos = slope * (xpos - segmentStartX) + segmentStartY; + plot(xpos, ypos, sample, sampleMatrixDimension); + xpos++; + } + } else if (segmentEndX < segmentStartX){ + xpos = (float) Math.ceil(segmentEndX); + float slope = (segmentEndY - segmentStartY) / (segmentEndX - segmentStartX); + while (xpos < segmentStartX) { + ypos = slope * (xpos - segmentStartX) + segmentStartY; + plot(xpos, ypos, sample, sampleMatrixDimension); + xpos++; + } + } + + // evaluating vertically + if (segmentEndY > segmentStartY) { + ypos = (float) Math.ceil(segmentStartY); + float invertSlope = (segmentEndX - segmentStartX) / (segmentEndY - segmentStartY); + while (ypos < segmentEndY) { + xpos = invertSlope * (ypos - segmentStartY) + segmentStartX; + plot(xpos, ypos, sample, sampleMatrixDimension); + ypos++; + } + } else if (segmentEndY < segmentStartY) { + ypos = (float) Math.ceil(segmentEndY); + float invertSlope = (segmentEndX - segmentStartX) / (segmentEndY - segmentStartY); + while (ypos < segmentStartY) { + xpos = invertSlope * (ypos - segmentStartY) + segmentStartX; + plot(xpos, ypos, sample, sampleMatrixDimension); + ypos++; + } + } + } + + segmentEndX = segmentStartX; + segmentEndY = segmentStartY; + } + } + + + return sample; + } + + private static void plot(float x, float y, float[] sample, int sampleSize) { + x = x < 0 ? 0 : x; + y = y < 0 ? 0 : y; + int xFloor = (int) Math.floor(x); + int xCeiling = (int) Math.ceil(x); + int yFloor = (int) Math.floor(y); + int yCeiling = (int) Math.ceil(y); + + // if it's an integer + if (x == xFloor && y == yFloor) { + int index = yCeiling * sampleSize + xCeiling; + if (sample[index] < 1){ + sample[index] = 1; + } + } else { + double topLeft = Math.sqrt(Math.pow(xFloor - x, 2) + Math.pow(yFloor - y, 2)); + double topRight = Math.sqrt(Math.pow(xCeiling - x, 2) + Math.pow(yFloor - y, 2)); + double btmLeft = Math.sqrt(Math.pow(xFloor - x, 2) + Math.pow(yCeiling - y, 2)); + double btmRight = Math.sqrt(Math.pow(xCeiling - x, 2) + Math.pow(yCeiling - y, 2)); + double sum = topLeft + topRight + btmLeft + btmRight; + + double value = topLeft / sum; + int index = yFloor * sampleSize + xFloor; + if (value > sample[index]){ + sample[index] = (float) value; + } + + value = topRight / sum; + index = yFloor * sampleSize + xCeiling; + if (value > sample[index]){ + sample[index] = (float) value; + } + + value = btmLeft / sum; + index = yCeiling * sampleSize + xFloor; + if (value > sample[index]){ + sample[index] = (float) value; + } + + value = btmRight / sum; + index = yCeiling * sampleSize + xCeiling; + if (value > sample[index]){ + sample[index] = (float) value; + } + } + } + + /** + * Featurize a stroke into a vector of a given number of elements + * + * @param stroke + * @param sampleSize + * @return a float array + */ + static float[] temporalSampling(GestureStroke stroke, int sampleSize) { + final float increment = stroke.length / (sampleSize - 1); + int vectorLength = sampleSize * 2; + float[] vector = new float[vectorLength]; + float distanceSoFar = 0; + float[] pts = stroke.points; + float lstPointX = pts[0]; + float lstPointY = pts[1]; + int index = 0; + float currentPointX = Float.MIN_VALUE; + float currentPointY = Float.MIN_VALUE; + vector[index] = lstPointX; + index++; + vector[index] = lstPointY; + index++; + int i = 0; + int count = pts.length / 2; + while (i < count) { + if (currentPointX == Float.MIN_VALUE) { + i++; + if (i >= count) { + break; + } + currentPointX = pts[i * 2]; + currentPointY = pts[i * 2 + 1]; + } + float deltaX = currentPointX - lstPointX; + float deltaY = currentPointY - lstPointY; + float distance = (float) Math.sqrt(deltaX * deltaX + deltaY * deltaY); + if (distanceSoFar + distance >= increment) { + float ratio = (increment - distanceSoFar) / distance; + float nx = lstPointX + ratio * deltaX; + float ny = lstPointY + ratio * deltaY; + vector[index] = nx; + index++; + vector[index] = ny; + index++; + lstPointX = nx; + lstPointY = ny; + distanceSoFar = 0; + } else { + lstPointX = currentPointX; + lstPointY = currentPointY; + currentPointX = Float.MIN_VALUE; + currentPointY = Float.MIN_VALUE; + distanceSoFar += distance; + } + } + + for (i = index; i < vectorLength; i += 2) { + vector[i] = lstPointX; + vector[i + 1] = lstPointY; + } + return vector; + } + + /** + * Calculate the centroid + * + * @param points + * @return the centroid + */ + static float[] computeCentroid(float[] points) { + float centerX = 0; + float centerY = 0; + int count = points.length; + for (int i = 0; i < count; i++) { + centerX += points[i]; + i++; + centerY += points[i]; + } + float[] center = new float[2]; + center[0] = 2 * centerX / count; + center[1] = 2 * centerY / count; + + return center; + } + + /** + * calculate the variance-covariance matrix, treat each point as a sample + * + * @param points + * @return the covariance matrix + */ + private static double[][] computeCoVariance(float[] points) { + double[][] array = new double[2][2]; + array[0][0] = 0; + array[0][1] = 0; + array[1][0] = 0; + array[1][1] = 0; + int count = points.length; + for (int i = 0; i < count; i++) { + float x = points[i]; + i++; + float y = points[i]; + array[0][0] += x * x; + array[0][1] += x * y; + array[1][0] = array[0][1]; + array[1][1] += y * y; + } + array[0][0] /= (count / 2); + array[0][1] /= (count / 2); + array[1][0] /= (count / 2); + array[1][1] /= (count / 2); + + return array; + } + + static float computeTotalLength(float[] points) { + float sum = 0; + int count = points.length - 4; + for (int i = 0; i < count; i += 2) { + float dx = points[i + 2] - points[i]; + float dy = points[i + 3] - points[i + 1]; + sum += Math.sqrt(dx * dx + dy * dy); + } + return sum; + } + + static double computeStraightness(float[] points) { + float totalLen = computeTotalLength(points); + float dx = points[2] - points[0]; + float dy = points[3] - points[1]; + return Math.sqrt(dx * dx + dy * dy) / totalLen; + } + + static double computeStraightness(float[] points, float totalLen) { + float dx = points[2] - points[0]; + float dy = points[3] - points[1]; + return Math.sqrt(dx * dx + dy * dy) / totalLen; + } + + /** + * Calculate the squared Euclidean distance between two vectors + * + * @param vector1 + * @param vector2 + * @return the distance + */ + static double squaredEuclideanDistance(float[] vector1, float[] vector2) { + double squaredDistance = 0; + int size = vector1.length; + for (int i = 0; i < size; i++) { + float difference = vector1[i] - vector2[i]; + squaredDistance += difference * difference; + } + return squaredDistance / size; + } + + /** + * Calculate the cosine distance between two instances + * + * @param vector1 + * @param vector2 + * @return the distance between 0 and Math.PI + */ + static double cosineDistance(float[] vector1, float[] vector2) { + float sum = 0; + int len = vector1.length; + for (int i = 0; i < len; i++) { + sum += vector1[i] * vector2[i]; + } + return Math.acos(sum); + } + + static OrientedBoundingBox computeOrientedBoundingBox(ArrayList<GesturePoint> pts) { + GestureStroke stroke = new GestureStroke(pts); + float[] points = temporalSampling(stroke, TEMPORAL_SAMPLING_RATE); + return computeOrientedBoundingBox(points); + } + + static OrientedBoundingBox computeOrientedBoundingBox(float[] points) { + float[] meanVector = computeCentroid(points); + return computeOrientedBoundingBox(points, meanVector); + } + + static OrientedBoundingBox computeOrientedBoundingBox(float[] points, float[] centroid) { + Matrix tr = new Matrix(); + tr.setTranslate(-centroid[0], -centroid[1]); + tr.mapPoints(points); + + double[][] array = computeCoVariance(points); + double[] targetVector = computeOrientation(array); + + float angle; + if (targetVector[0] == 0 && targetVector[1] == 0) { + angle = -90; + } else { // -PI<alpha<PI + angle = (float) Math.atan2(targetVector[1], targetVector[0]); + angle = (float) (180 * angle / Math.PI); + android.graphics.Matrix trans = new android.graphics.Matrix(); + trans.setRotate(-angle); + trans.mapPoints(points); + } + + float minx = Float.MAX_VALUE; + float miny = Float.MAX_VALUE; + float maxx = Float.MIN_VALUE; + float maxy = Float.MIN_VALUE; + int count = points.length; + for (int i = 0; i < count; i++) { + if (points[i] < minx) { + minx = points[i]; + } + if (points[i] > maxx) { + maxx = points[i]; + } + i++; + if (points[i] < miny) { + miny = points[i]; + } + if (points[i] > maxy) { + maxy = points[i]; + } + } + + return new OrientedBoundingBox(angle, centroid[0], centroid[1], maxx - minx, maxy - miny); + } + + private static double[] computeOrientation(double[][] covarianceMatrix) { + double[] targetVector = new double[2]; + if (covarianceMatrix[0][1] == 0 || covarianceMatrix[1][0] == 0) { + targetVector[0] = 1; + targetVector[1] = 0; + } + + double a = -covarianceMatrix[0][0] - covarianceMatrix[1][1]; + double b = covarianceMatrix[0][0] * covarianceMatrix[1][1] - covarianceMatrix[0][1] + * covarianceMatrix[1][0]; + double value = a / 2; + double rightside = Math.sqrt(Math.pow(value, 2) - b); + double lambda1 = -value + rightside; + double lambda2 = -value - rightside; + if (lambda1 == lambda2) { + targetVector[0] = 0; + targetVector[1] = 0; + } else { + double lambda = lambda1 > lambda2 ? lambda1 : lambda2; + targetVector[0] = 1; + targetVector[1] = (lambda - covarianceMatrix[0][0]) / covarianceMatrix[0][1]; + } + return targetVector; + } +} diff --git a/core/java/android/gesture/Instance.java b/core/java/android/gesture/Instance.java new file mode 100755 index 0000000..7922fab --- /dev/null +++ b/core/java/android/gesture/Instance.java @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2008-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.gesture; + +import android.graphics.Matrix; + +/** + * An instance represents a sample if the label is available or a query if the + * label is null. + */ +class Instance { + private static final int SEQUENCE_SAMPLE_SIZE = 16; + + private static final int PATCH_SAMPLE_SIZE = 16; + + private final static float[] ORIENTATIONS = { + 0, 45, 90, 135, 180, -0, -45, -90, -135, -180 + }; + + // the feature vector + final float[] vector; + + // the label can be null + final String label; + + // the id of the instance + final long id; + + private Instance(long id, float[] sample, String sampleName) { + this.id = id; + vector = sample; + label = sampleName; + } + + private void normalize() { + float[] sample = vector; + float sum = 0; + + int size = sample.length; + for (int i = 0; i < size; i++) { + sum += sample[i] * sample[i]; + } + + float magnitude = (float) Math.sqrt(sum); + for (int i = 0; i < size; i++) { + sample[i] /= magnitude; + } + } + + /** + * create a learning instance for a single stroke gesture + * + * @param gesture + * @param label + * @return the instance + */ + static Instance createInstance(int samplingType, Gesture gesture, String label) { + float[] pts; + Instance instance; + if (samplingType == GestureLibrary.SEQUENCE_SENSITIVE) { + pts = temporalSampler(samplingType, gesture); + instance = new Instance(gesture.getID(), pts, label); + instance.normalize(); + } else { + pts = spatialSampler(gesture); + instance = new Instance(gesture.getID(), pts, label); + } + return instance; + } + + private static float[] spatialSampler(Gesture gesture) { + return GestureUtilities.spatialSampling(gesture, PATCH_SAMPLE_SIZE); + } + + private static float[] temporalSampler(int samplingType, Gesture gesture) { + float[] pts = GestureUtilities.temporalSampling(gesture.getStrokes().get(0), + SEQUENCE_SAMPLE_SIZE); + float[] center = GestureUtilities.computeCentroid(pts); + float orientation = (float) Math.atan2(pts[1] - center[1], pts[0] - center[0]); + orientation *= 180 / Math.PI; + + float adjustment = -orientation; + if (samplingType == GestureLibrary.ORIENTATION_SENSITIVE) { + int count = ORIENTATIONS.length; + for (int i = 0; i < count; i++) { + float delta = ORIENTATIONS[i] - orientation; + if (Math.abs(delta) < Math.abs(adjustment)) { + adjustment = delta; + } + } + } + + Matrix m = new Matrix(); + m.setTranslate(-center[0], -center[1]); + m.postRotate(adjustment); + m.mapPoints(pts); + + return pts; + } + +} diff --git a/core/java/android/gesture/InstanceLearner.java b/core/java/android/gesture/InstanceLearner.java new file mode 100644 index 0000000..1739cdc --- /dev/null +++ b/core/java/android/gesture/InstanceLearner.java @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2008-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.gesture; + +import android.util.Config; +import android.util.Log; +import static android.gesture.GestureConstants.*; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Iterator; +import java.util.TreeMap; + +/** + * An implementation of an instance-based learner + */ + +class InstanceLearner extends Learner { + @Override + ArrayList<Prediction> classify(int gestureType, float[] vector) { + ArrayList<Prediction> predictions = new ArrayList<Prediction>(); + ArrayList<Instance> instances = getInstances(); + int count = instances.size(); + TreeMap<String, Double> label2score = new TreeMap<String, Double>(); + for (int i = 0; i < count; i++) { + Instance sample = instances.get(i); + if (sample.vector.length != vector.length) { + continue; + } + double distance; + if (gestureType == GestureLibrary.SEQUENCE_SENSITIVE) { + distance = GestureUtilities.cosineDistance(sample.vector, vector); + } else { + distance = GestureUtilities.squaredEuclideanDistance(sample.vector, vector); + } + double weight; + if (distance == 0) { + weight = Double.MAX_VALUE; + } else { + weight = 1 / distance; + } + Double score = label2score.get(sample.label); + if (score == null || weight > score) { + label2score.put(sample.label, weight); + } + } + + double sum = 0; + for (String name : label2score.keySet()) { + double score = label2score.get(name); + sum += score; + predictions.add(new Prediction(name, score)); + } + + // normalize + for (Prediction prediction : predictions) { + prediction.score /= sum; + } + + Collections.sort(predictions, new Comparator<Prediction>() { + public int compare(Prediction object1, Prediction object2) { + double score1 = object1.score; + double score2 = object2.score; + if (score1 > score2) { + return -1; + } else if (score1 < score2) { + return 1; + } else { + return 0; + } + } + }); + + return predictions; + } +} diff --git a/core/java/android/gesture/Learner.java b/core/java/android/gesture/Learner.java new file mode 100755 index 0000000..feacde5 --- /dev/null +++ b/core/java/android/gesture/Learner.java @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2008-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.gesture; + +import java.util.ArrayList; + +/** + * The abstract class of a gesture learner + */ +abstract class Learner { + private final ArrayList<Instance> mInstances = new ArrayList<Instance>(); + + /** + * Add an instance to the learner + * + * @param instance + */ + void addInstance(Instance instance) { + mInstances.add(instance); + } + + /** + * Retrieve all the instances + * + * @return instances + */ + ArrayList<Instance> getInstances() { + return mInstances; + } + + /** + * Remove an instance based on its id + * + * @param id + */ + void removeInstance(long id) { + ArrayList<Instance> instances = mInstances; + int count = instances.size(); + for (int i = 0; i < count; i++) { + Instance instance = instances.get(i); + if (id == instance.id) { + instances.remove(instance); + return; + } + } + } + + /** + * Remove all the instances of a category + * + * @param name the category name + */ + void removeInstances(String name) { + final ArrayList<Instance> toDelete = new ArrayList<Instance>(); + final ArrayList<Instance> instances = mInstances; + final int count = instances.size(); + + for (int i = 0; i < count; i++) { + final Instance instance = instances.get(i); + // the label can be null, as specified in Instance + if ((instance.label == null && name == null) || instance.label.equals(name)) { + toDelete.add(instance); + } + } + instances.removeAll(toDelete); + } + + abstract ArrayList<Prediction> classify(int gestureType, float[] vector); +} diff --git a/core/java/android/gesture/LetterRecognizer.java b/core/java/android/gesture/LetterRecognizer.java new file mode 100644 index 0000000..4476746 --- /dev/null +++ b/core/java/android/gesture/LetterRecognizer.java @@ -0,0 +1,273 @@ +/* + * 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.gesture; + +import android.content.Context; +import android.content.res.Resources; +import android.util.Log; + +import java.io.BufferedInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; + +import static android.gesture.GestureConstants.LOG_TAG; + +public class LetterRecognizer { + public final static int RECOGNIZER_LATIN_LOWERCASE = 0; + static final String GESTURE_FILE_NAME = "letters.gestures"; + + private final static int ADJUST_RANGE = 3; + + private SigmoidUnit[] mHiddenLayer; + private SigmoidUnit[] mOutputLayer; + + private final String[] mClasses; + + private final int mPatchSize; + + private GestureLibrary mGestureLibrary; + + private static class SigmoidUnit { + final float[] mWeights; + + private boolean mComputed; + private float mResult; + + SigmoidUnit(float[] weights) { + mWeights = weights; + } + + private float compute(float[] inputs) { + if (!mComputed) { + float sum = 0; + + final int count = inputs.length; + final float[] weights = mWeights; + + for (int i = 0; i < count; i++) { + sum += inputs[i] * weights[i]; + } + sum += weights[weights.length - 1]; + + mResult = 1.0f / (float) (1 + Math.exp(-sum)); + mComputed = true; + } + return mResult; + } + } + + public static LetterRecognizer getLetterRecognizer(Context context, int type) { + switch (type) { + case RECOGNIZER_LATIN_LOWERCASE: { + return createFromResource(context, com.android.internal.R.raw.latin_lowercase); + } + } + return null; + } + + private LetterRecognizer(int numOfInput, int numOfHidden, String[] classes) { + mPatchSize = (int) Math.sqrt(numOfInput); + mHiddenLayer = new SigmoidUnit[numOfHidden]; + mClasses = classes; + mOutputLayer = new SigmoidUnit[classes.length]; + } + + public ArrayList<Prediction> recognize(Gesture gesture) { + float[] query = GestureUtilities.spatialSampling(gesture, mPatchSize); + ArrayList<Prediction> predictions = classify(query); + adjustPrediction(gesture, predictions); + return predictions; + } + + private ArrayList<Prediction> classify(float[] vector) { + final float[] intermediateOutput = compute(mHiddenLayer, vector); + final float[] output = compute(mOutputLayer, intermediateOutput); + final ArrayList<Prediction> predictions = new ArrayList<Prediction>(); + + double sum = 0; + + final String[] classes = mClasses; + final int count = classes.length; + + for (int i = 0; i < count; i++) { + double score = output[i]; + sum += score; + predictions.add(new Prediction(classes[i], score)); + } + + for (int i = 0; i < count; i++) { + predictions.get(i).score /= sum; + } + + Collections.sort(predictions, new Comparator<Prediction>() { + public int compare(Prediction object1, Prediction object2) { + double score1 = object1.score; + double score2 = object2.score; + if (score1 > score2) { + return -1; + } else if (score1 < score2) { + return 1; + } else { + return 0; + } + } + }); + return predictions; + } + + private float[] compute(SigmoidUnit[] layer, float[] input) { + final float[] output = new float[layer.length]; + final int count = layer.length; + + for (int i = 0; i < count; i++) { + output[i] = layer[i].compute(input); + } + + return output; + } + + private static LetterRecognizer createFromResource(Context context, int resourceID) { + final Resources resources = context.getResources(); + + DataInputStream in = null; + LetterRecognizer classifier = null; + + try { + in = new DataInputStream(new BufferedInputStream(resources.openRawResource(resourceID), + GestureConstants.IO_BUFFER_SIZE)); + + final int version = in.readShort(); + + switch (version) { + case 1: + classifier = readV1(in); + break; + } + + } catch (IOException e) { + Log.d(LOG_TAG, "Failed to load handwriting data:", e); + } finally { + GestureUtilities.closeStream(in); + } + + return classifier; + } + + private static LetterRecognizer readV1(DataInputStream in) throws IOException { + + final int iCount = in.readInt(); + final int hCount = in.readInt(); + final int oCount = in.readInt(); + + final String[] classes = new String[oCount]; + for (int i = 0; i < classes.length; i++) { + classes[i] = in.readUTF(); + } + + final LetterRecognizer classifier = new LetterRecognizer(iCount, hCount, classes); + final SigmoidUnit[] hiddenLayer = new SigmoidUnit[hCount]; + final SigmoidUnit[] outputLayer = new SigmoidUnit[oCount]; + + for (int i = 0; i < hCount; i++) { + final float[] weights = new float[iCount + 1]; + for (int j = 0; j <= iCount; j++) { + weights[j] = in.readFloat(); + } + hiddenLayer[i] = new SigmoidUnit(weights); + } + + for (int i = 0; i < oCount; i++) { + final float[] weights = new float[hCount + 1]; + for (int j = 0; j <= hCount; j++) { + weights[j] = in.readFloat(); + } + outputLayer[i] = new SigmoidUnit(weights); + } + + classifier.mHiddenLayer = hiddenLayer; + classifier.mOutputLayer = outputLayer; + + return classifier; + } + + /** + * TODO: Publish this API once we figure out where we should save the personzlied + * gestures, and how to do so across all apps + * + * @hide + */ + public boolean save() { + if (mGestureLibrary != null) { + return mGestureLibrary.save(); + } + return false; + } + + /** + * TODO: Publish this API once we figure out where we should save the personzlied + * gestures, and how to do so across all apps + * + * @hide + */ + public void setPersonalizationEnabled(boolean enabled) { + if (enabled) { + mGestureLibrary = new GestureLibrary(GESTURE_FILE_NAME); + mGestureLibrary.setSequenceType(GestureLibrary.SEQUENCE_INVARIANT); + mGestureLibrary.load(); + } else { + mGestureLibrary = null; + } + } + + /** + * TODO: Publish this API once we figure out where we should save the personzlied + * gestures, and how to do so across all apps + * + * @hide + */ + public void addExample(String letter, Gesture example) { + if (mGestureLibrary != null) { + mGestureLibrary.addGesture(letter, example); + } + } + + private void adjustPrediction(Gesture query, ArrayList<Prediction> predictions) { + if (mGestureLibrary != null) { + final ArrayList<Prediction> results = mGestureLibrary.recognize(query); + final HashMap<String, Prediction> topNList = new HashMap<String, Prediction>(); + + for (int j = 0; j < ADJUST_RANGE; j++) { + Prediction prediction = predictions.remove(0); + topNList.put(prediction.name, prediction); + } + + final int count = results.size(); + for (int j = count - 1; j >= 0 && !topNList.isEmpty(); j--) { + final Prediction item = results.get(j); + final Prediction original = topNList.get(item.name); + if (original != null) { + predictions.add(0, original); + topNList.remove(item.name); + } + } + } + } +} diff --git a/core/java/android/gesture/OrientedBoundingBox.java b/core/java/android/gesture/OrientedBoundingBox.java new file mode 100644 index 0000000..f1335ee --- /dev/null +++ b/core/java/android/gesture/OrientedBoundingBox.java @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2008-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.gesture; + +import android.graphics.Matrix; +import android.graphics.Path; + +/** + * An oriented bounding box + */ +public class OrientedBoundingBox { + public final float squareness; + + public final float width; + public final float height; + + public final float orientation; + + public final float centerX; + public final float centerY; + + OrientedBoundingBox(float angle, float cx, float cy, float w, float h) { + orientation = angle; + width = w; + height = h; + centerX = cx; + centerY = cy; + float ratio = w / h; + if (ratio > 1) { + squareness = 1 / ratio; + } else { + squareness = ratio; + } + } + + /** + * Currently used for debugging purpose only. + * + * @hide + */ + public Path toPath() { + Path path = new Path(); + float[] point = new float[2]; + point[0] = -width / 2; + point[1] = height / 2; + Matrix matrix = new Matrix(); + matrix.setRotate(orientation); + matrix.postTranslate(centerX, centerY); + matrix.mapPoints(point); + path.moveTo(point[0], point[1]); + + point[0] = -width / 2; + point[1] = -height / 2; + matrix.mapPoints(point); + path.lineTo(point[0], point[1]); + + point[0] = width / 2; + point[1] = -height / 2; + matrix.mapPoints(point); + path.lineTo(point[0], point[1]); + + point[0] = width / 2; + point[1] = height / 2; + matrix.mapPoints(point); + path.lineTo(point[0], point[1]); + + path.close(); + + return path; + } +} diff --git a/core/java/android/gesture/Prediction.java b/core/java/android/gesture/Prediction.java new file mode 100755 index 0000000..ce6ad57 --- /dev/null +++ b/core/java/android/gesture/Prediction.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2008-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.gesture; + +public class Prediction { + public final String name; + + public double score; + + Prediction(String label, double predictionScore) { + name = label; + score = predictionScore; + } + + @Override + public String toString() { + return name; + } +} diff --git a/core/java/android/gesture/TouchThroughGestureListener.java b/core/java/android/gesture/TouchThroughGestureListener.java new file mode 100644 index 0000000..7621ddf --- /dev/null +++ b/core/java/android/gesture/TouchThroughGestureListener.java @@ -0,0 +1,171 @@ +/* + * Copyright (C) 2008-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.gesture; + +import android.view.MotionEvent; +import android.view.View; + +import java.util.ArrayList; +import java.lang.ref.WeakReference; + +/** + * TouchThroughGesturing implements the interaction behavior that allows a user + * to gesture over a regular UI widget such as ListView and at the same time, + * still allows a user to perform basic interactions (clicking, scrolling and panning) + * with the underlying widget. + */ +public class TouchThroughGestureListener implements GestureOverlayView.OnGestureListener { + public static final int SINGLE_STROKE = 0; + public static final int MULTIPLE_STROKE = 1; + + // TODO: Add properties for all these + private static final float STROKE_LENGTH_THRESHOLD = 30; + private static final float SQUARENESS_THRESHOLD = 0.275f; + private static final float ANGLE_THRESHOLD = 40; + + private boolean mIsGesturing = false; + + private float mTotalLength; + + private float mX; + private float mY; + + private WeakReference<View> mModel; + + private int mGestureType = SINGLE_STROKE; + + // TODO: Use WeakReferences + private final ArrayList<OnGesturePerformedListener> mPerformedListeners = + new ArrayList<OnGesturePerformedListener>(); + + private boolean mStealEvents = false; + + public TouchThroughGestureListener(View model) { + this(model, false); + } + + public TouchThroughGestureListener(View model, boolean stealEvents) { + mModel = new WeakReference<View>(model); + mStealEvents = stealEvents; + } + + /** + * + * @param type SINGLE_STROKE or MULTIPLE_STROKE + */ + public void setGestureType(int type) { + mGestureType = type; + } + + public void onGestureStarted(GestureOverlayView overlay, MotionEvent event) { + if (mGestureType == MULTIPLE_STROKE) { + overlay.cancelFadingOut(); + } + + mX = event.getX(); + mY = event.getY(); + mTotalLength = 0; + mIsGesturing = false; + + if (mGestureType == SINGLE_STROKE || overlay.getCurrentGesture() == null + || overlay.getCurrentGesture().getStrokesCount() == 0) { + overlay.setGestureDrawingColor(overlay.getUncertainGestureColor()); + } + + dispatchEventToModel(event); + } + + private void dispatchEventToModel(MotionEvent event) { + View v = mModel.get(); + if (v != null) v.dispatchTouchEvent(event); + } + + public void onGesture(GestureOverlayView overlay, MotionEvent event) { + //noinspection PointlessBooleanExpression + if (!mStealEvents) { + dispatchEventToModel(event); + } + + if (mIsGesturing) { + return; + } + + final float x = event.getX(); + final float y = event.getY(); + final float dx = x - mX; + final float dy = y - mY; + + mTotalLength += (float) Math.sqrt(dx * dx + dy * dy); + mX = x; + mY = y; + + if (mTotalLength > STROKE_LENGTH_THRESHOLD) { + final OrientedBoundingBox box = + GestureUtilities.computeOrientedBoundingBox(overlay.getCurrentStroke()); + float angle = Math.abs(box.orientation); + if (angle > 90) { + angle = 180 - angle; + } + if (box.squareness > SQUARENESS_THRESHOLD || angle < ANGLE_THRESHOLD) { + mIsGesturing = true; + overlay.setGestureDrawingColor(overlay.getGestureColor()); + if (mStealEvents) { + event = MotionEvent.obtain(event.getDownTime(), System.currentTimeMillis(), + MotionEvent.ACTION_UP, x, y, event.getPressure(), event.getSize(), + event.getMetaState(), event.getXPrecision(), event.getYPrecision(), + event.getDeviceId(), event.getEdgeFlags()); + } + } + } + + if (mStealEvents) { + dispatchEventToModel(event); + } + } + + public void onGestureEnded(GestureOverlayView overlay, MotionEvent event) { + if (mIsGesturing) { + overlay.clear(true); + + final ArrayList<OnGesturePerformedListener> listeners = mPerformedListeners; + final int count = listeners.size(); + + for (int i = 0; i < count; i++) { + listeners.get(i).onGesturePerformed(overlay, overlay.getCurrentGesture()); + } + } else { + dispatchEventToModel(event); + overlay.clear(false); + } + } + + public void addOnGestureActionListener(OnGesturePerformedListener listener) { + mPerformedListeners.add(listener); + } + + public void removeOnGestureActionListener(OnGesturePerformedListener listener) { + mPerformedListeners.remove(listener); + } + + public boolean isGesturing() { + return mIsGesturing; + } + + public static interface OnGesturePerformedListener { + public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture); + } +} diff --git a/core/java/android/net/http/RequestQueue.java b/core/java/android/net/http/RequestQueue.java index 66d5722..54a1cce 100644 --- a/core/java/android/net/http/RequestQueue.java +++ b/core/java/android/net/http/RequestQueue.java @@ -52,10 +52,44 @@ public class RequestQueue implements RequestFeeder { private Context mContext; + private static class RequestSet { + private final LinkedList<Request> mHighPriority; + private final LinkedList<Request> mLowPriority; + + RequestSet() { + mHighPriority = new LinkedList<Request>(); + mLowPriority = new LinkedList<Request>(); + } + + void add(Request req, boolean head) { + LinkedList l = mLowPriority; + if (req.mHighPriority) { + l = mHighPriority; + } + if (head) { + l.addFirst(req); + } else { + l.add(req); + } + } + + Request removeFirst() { + if (!mHighPriority.isEmpty()) { + return mHighPriority.removeFirst(); + } else if (!mLowPriority.isEmpty()) { + return mLowPriority.removeFirst(); + } + return null; + } + + boolean isEmpty() { + return mHighPriority.isEmpty() && mLowPriority.isEmpty(); + } + }; /** * Requests, indexed by HttpHost (scheme, host, port) */ - private LinkedHashMap<HttpHost, LinkedList<Request>> mPending; + private LinkedHashMap<HttpHost, RequestSet> mPending; /* Support for notifying a client when queue is empty */ private boolean mClientWaiting = false; @@ -344,7 +378,7 @@ public class RequestQueue implements RequestFeeder { public RequestQueue(Context context, int connectionCount) { mContext = context; - mPending = new LinkedHashMap<HttpHost, LinkedList<Request>>(32); + mPending = new LinkedHashMap<HttpHost, RequestSet>(32); mActivePool = new ActivePool(connectionCount); mActivePool.startup(); @@ -480,7 +514,7 @@ public class RequestQueue implements RequestFeeder { req = new Request(method, httpHost, mProxyHost, uri.mPath, bodyProvider, bodyLength, eventHandler, headers, highPriority); - queueRequest(req, highPriority); + queueRequest(req, false); mActivePool.mTotalRequest++; @@ -520,19 +554,24 @@ public class RequestQueue implements RequestFeeder { HttpLog.v("dump()"); StringBuilder dump = new StringBuilder(); int count = 0; - Iterator<Map.Entry<HttpHost, LinkedList<Request>>> iter; + Iterator<Map.Entry<HttpHost, RequestSet>> iter; // mActivePool.log(dump); if (!mPending.isEmpty()) { iter = mPending.entrySet().iterator(); while (iter.hasNext()) { - Map.Entry<HttpHost, LinkedList<Request>> entry = iter.next(); + Map.Entry<HttpHost, RequestSet> entry = iter.next(); String hostName = entry.getKey().getHostName(); StringBuilder line = new StringBuilder("p" + count++ + " " + hostName + " "); - LinkedList<Request> reqList = entry.getValue(); - ListIterator reqIter = reqList.listIterator(0); + RequestSet reqList = entry.getValue(); + ListIterator reqIter = reqList.mHighPriority.listIterator(0); + while (iter.hasNext()) { + Request request = (Request)iter.next(); + line.append(request + " "); + } + reqIter = reqList.mLowPriority.listIterator(0); while (iter.hasNext()) { Request request = (Request)iter.next(); line.append(request + " "); @@ -564,7 +603,7 @@ public class RequestQueue implements RequestFeeder { Request ret = null; if (mNetworkConnected && mPending.containsKey(host)) { - LinkedList<Request> reqList = mPending.get(host); + RequestSet reqList = mPending.get(host); ret = reqList.removeFirst(); if (reqList.isEmpty()) { mPending.remove(host); @@ -597,18 +636,14 @@ public class RequestQueue implements RequestFeeder { protected synchronized void queueRequest(Request request, boolean head) { HttpHost host = request.mProxyHost == null ? request.mHost : request.mProxyHost; - LinkedList<Request> reqList; + RequestSet reqList; if (mPending.containsKey(host)) { reqList = mPending.get(host); } else { - reqList = new LinkedList<Request>(); + reqList = new RequestSet(); mPending.put(host, reqList); } - if (head) { - reqList.addFirst(request); - } else { - reqList.add(request); - } + reqList.add(request, head); } @@ -621,12 +656,12 @@ public class RequestQueue implements RequestFeeder { } /* helper */ - private Request removeFirst(LinkedHashMap<HttpHost, LinkedList<Request>> requestQueue) { + private Request removeFirst(LinkedHashMap<HttpHost, RequestSet> requestQueue) { Request ret = null; - Iterator<Map.Entry<HttpHost, LinkedList<Request>>> iter = requestQueue.entrySet().iterator(); + Iterator<Map.Entry<HttpHost, RequestSet>> iter = requestQueue.entrySet().iterator(); if (iter.hasNext()) { - Map.Entry<HttpHost, LinkedList<Request>> entry = iter.next(); - LinkedList<Request> reqList = entry.getValue(); + Map.Entry<HttpHost, RequestSet> entry = iter.next(); + RequestSet reqList = entry.getValue(); ret = reqList.removeFirst(); if (reqList.isEmpty()) { requestQueue.remove(entry.getKey()); diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java index 5487c54..101336b 100644 --- a/core/java/android/os/Build.java +++ b/core/java/android/os/Build.java @@ -38,6 +38,9 @@ public class Build { /** The name of the underlying board, like "goldfish". */ public static final String BOARD = getString("ro.product.board"); + /** The manufacturer of the product/hardware. */ + public static final String MANUFACTURER = getString("ro.product.manufacturer"); + /** The brand (e.g., carrier) the software is customized for, if any. */ public static final String BRAND = getString("ro.product.brand"); @@ -87,6 +90,12 @@ public class Build { */ public static class VERSION_CODES { /** + * Magic version number for a current development build, which has + * not yet turned into an official release. + */ + public static final int CUR_DEVELOPMENT = 10000; + + /** * October 2008: The original, first, version of Android. Yay! */ public static final int BASE = 1; @@ -98,6 +107,19 @@ public class Build { * May 2009: Android 1.5. */ public static final int CUPCAKE = 3; + /** + * Current work on "Donut" development branch. + * + * <p>Applications targeting this or a later release will get these + * new changes in behavior:</p> + * <ul> + * <li> They must explicitly request the + * {@link android.Manifest.permission#WRITE_SDCARD} permission to be + * able to modify the contents of the SD card. (Apps targeting + * earlier versions will always request the permission.) + * </ul> + */ + public static final int DONUT = CUR_DEVELOPMENT; } /** The type of build, like "user" or "eng". */ diff --git a/core/java/android/os/LatencyTimer.java b/core/java/android/os/LatencyTimer.java new file mode 100644 index 0000000..ed2f0f9e --- /dev/null +++ b/core/java/android/os/LatencyTimer.java @@ -0,0 +1,94 @@ +/* + * 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.os; + +import android.util.Log; + +import java.util.HashMap; + +/** + * A class to help with measuring latency in your code. + * + * Suggested usage: + * 1) Instanciate a LatencyTimer as a class field. + * private [static] LatencyTimer mLt = new LatencyTimer(100, 1000); + * 2) At various points in the code call sample with a string and the time delta to some fixed time. + * The string should be unique at each point of the code you are measuring. + * mLt.sample("before processing event", System.nanoTime() - event.getEventTimeNano()); + * processEvent(event); + * mLt.sample("after processing event ", System.nanoTime() - event.getEventTimeNano()); + * + * @hide + */ +public final class LatencyTimer +{ + final String TAG = "LatencyTimer"; + final int mSampleSize; + final int mScaleFactor; + volatile HashMap<String, long[]> store = new HashMap<String, long[]>(); + + /** + * Creates a LatencyTimer object + * @param sampleSize number of samples to collect before printing out the average + * @param scaleFactor divisor used to make each sample smaller to prevent overflow when + * (sampleSize * average sample value)/scaleFactor > Long.MAX_VALUE + */ + public LatencyTimer(int sampleSize, int scaleFactor) { + if (scaleFactor == 0) { + scaleFactor = 1; + } + mScaleFactor = scaleFactor; + mSampleSize = sampleSize; + } + + /** + * Add a sample delay for averaging. + * @param tag string used for printing out the result. This should be unique at each point of + * this called. + * @param delta time difference from an unique point of reference for a particular iteration + */ + public void sample(String tag, long delta) { + long[] array = getArray(tag); + + // array[mSampleSize] holds the number of used entries + final int index = (int) array[mSampleSize]++; + array[index] = delta; + if (array[mSampleSize] == mSampleSize) { + long totalDelta = 0; + for (long d : array) { + totalDelta += d/mScaleFactor; + } + array[mSampleSize] = 0; + Log.i(TAG, tag + " average = " + totalDelta / mSampleSize); + } + } + + private long[] getArray(String tag) { + long[] data = store.get(tag); + if (data == null) { + synchronized(store) { + data = store.get(tag); + if (data == null) { + data = new long[mSampleSize + 1]; + store.put(tag, data); + data[mSampleSize] = 0; + } + } + } + return data; + } +} diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java index 30acef9..333c7cb 100644 --- a/core/java/android/os/Process.java +++ b/core/java/android/os/Process.java @@ -604,6 +604,20 @@ public class Process { */ public static final native void setThreadGroup(int tid, int group) throws IllegalArgumentException, SecurityException; + /** + * Sets the scheduling group for a process and all child threads + * @hide + * @param pid The indentifier of the process to change. + * @param group The target group for this process. + * + * @throws IllegalArgumentException Throws IllegalArgumentException if + * <var>tid</var> does not exist. + * @throws SecurityException Throws SecurityException if your process does + * not have permission to modify the given thread, or to use the given + * priority. + */ + public static final native void setProcessGroup(int pid, int group) + throws IllegalArgumentException, SecurityException; /** * Set the priority of the calling thread, based on Linux priorities. See diff --git a/core/java/android/pim/EventRecurrence.java b/core/java/android/pim/EventRecurrence.java index edf69ee..3ea9b4a 100644 --- a/core/java/android/pim/EventRecurrence.java +++ b/core/java/android/pim/EventRecurrence.java @@ -408,13 +408,13 @@ public class EventRecurrence private String dayToString(Resources r, int day) { switch (day) { - case SU: return r.getString(com.android.internal.R.string.sunday); - case MO: return r.getString(com.android.internal.R.string.monday); - case TU: return r.getString(com.android.internal.R.string.tuesday); - case WE: return r.getString(com.android.internal.R.string.wednesday); - case TH: return r.getString(com.android.internal.R.string.thursday); - case FR: return r.getString(com.android.internal.R.string.friday); - case SA: return r.getString(com.android.internal.R.string.saturday); + case SU: return r.getString(com.android.internal.R.string.day_of_week_long_sunday); + case MO: return r.getString(com.android.internal.R.string.day_of_week_long_monday); + case TU: return r.getString(com.android.internal.R.string.day_of_week_long_tuesday); + case WE: return r.getString(com.android.internal.R.string.day_of_week_long_wednesday); + case TH: return r.getString(com.android.internal.R.string.day_of_week_long_thursday); + case FR: return r.getString(com.android.internal.R.string.day_of_week_long_friday); + case SA: return r.getString(com.android.internal.R.string.day_of_week_long_saturday); default: throw new IllegalArgumentException("bad day argument: " + day); } } diff --git a/core/java/android/provider/Checkin.java b/core/java/android/provider/Checkin.java index 3c23db0..f2c275e 100644 --- a/core/java/android/provider/Checkin.java +++ b/core/java/android/provider/Checkin.java @@ -137,6 +137,8 @@ public final class Checkin { CRASHES_TRUNCATED, ELAPSED_REALTIME_SEC, ELAPSED_UPTIME_SEC, + HTTP_REQUEST, + HTTP_REUSED, HTTP_STATUS, PHONE_GSM_REGISTERED, PHONE_GPRS_ATTEMPTED, @@ -351,6 +353,3 @@ public final class Checkin { } } } - - - diff --git a/core/java/android/provider/Contacts.java b/core/java/android/provider/Contacts.java index a6450f3..0829cfb 100644 --- a/core/java/android/provider/Contacts.java +++ b/core/java/android/provider/Contacts.java @@ -349,27 +349,33 @@ public class Contacts { } /** - * Adds a person to the My Contacts group. - * - * @param resolver the resolver to use - * @param personId the person to add to the group - * @return the URI of the group membership row - * @throws IllegalStateException if the My Contacts group can't be found + * @hide Used in vCard parser code. */ - public static Uri addToMyContactsGroup(ContentResolver resolver, long personId) { - long groupId = 0; + public static long tryGetMyContactsGroupId(ContentResolver resolver) { Cursor groupsCursor = resolver.query(Groups.CONTENT_URI, GROUPS_PROJECTION, Groups.SYSTEM_ID + "='" + Groups.GROUP_MY_CONTACTS + "'", null, null); if (groupsCursor != null) { try { if (groupsCursor.moveToFirst()) { - groupId = groupsCursor.getLong(0); + return groupsCursor.getLong(0); } } finally { groupsCursor.close(); } } + return 0; + } + /** + * Adds a person to the My Contacts group. + * + * @param resolver the resolver to use + * @param personId the person to add to the group + * @return the URI of the group membership row + * @throws IllegalStateException if the My Contacts group can't be found + */ + public static Uri addToMyContactsGroup(ContentResolver resolver, long personId) { + long groupId = tryGetMyContactsGroupId(resolver); if (groupId == 0) { throw new IllegalStateException("Failed to find the My Contacts group"); } @@ -884,6 +890,17 @@ public class Contacts { public static final int TYPE_OTHER = 3; /** + * @hide This is temporal. TYPE_MOBILE should be added to TYPE in the future. + */ + public static final int MOBILE_EMAIL_TYPE_INDEX = 2; + + /** + * @hide This is temporal. TYPE_MOBILE should be added to TYPE in the future. + * This is not "mobile" but "CELL" since vCard uses it for identifying mobile phone. + */ + public static final String MOBILE_EMAIL_TYPE_NAME = "_AUTO_CELL"; + + /** * The user defined label for the the contact method. * <P>Type: TEXT</P> */ diff --git a/core/java/android/provider/Im.java b/core/java/android/provider/Im.java index 898c321..c36f508 100644 --- a/core/java/android/provider/Im.java +++ b/core/java/android/provider/Im.java @@ -973,7 +973,7 @@ public class Im { /** * Gets the Uri to query messages by provider. * - * @param providerId the server provider id. + * @param providerId the service provider id. * @return the Uri */ public static final Uri getContentUriByProvider(long providerId) { @@ -983,21 +983,74 @@ public class Im { } /** - * Gets the Uri to query groupchat messages by thread id. + * Gets the Uri to query off the record messages by account. * - * @param threadId the thread id of the groupchat message. + * @param accountId the account id. * @return the Uri */ - public static final Uri getGroupChatContentUriByThreadId(long threadId) { - Uri.Builder builder = GROUP_CHAT_CONTENT_URI_MESSAGES_BY_THREAD_ID.buildUpon(); + public static final Uri getContentUriByAccount(long accountId) { + Uri.Builder builder = CONTENT_URI_BY_ACCOUNT.buildUpon(); + ContentUris.appendId(builder, accountId); + return builder.build(); + } + + /** + * Gets the Uri to query off the record messages by thread id. + * + * @param threadId the thread id of the message. + * @return the Uri + */ + public static final Uri getOtrMessagesContentUriByThreadId(long threadId) { + Uri.Builder builder = OTR_MESSAGES_CONTENT_URI_BY_THREAD_ID.buildUpon(); ContentUris.appendId(builder, threadId); return builder.build(); } /** + * @deprecated + * + * Gets the Uri to query off the record messages by account and contact. + * + * @param accountId the account id of the contact. + * @param username the user name of the contact. + * @return the Uri + */ + public static final Uri getOtrMessagesContentUriByContact(long accountId, String username) { + Uri.Builder builder = OTR_MESSAGES_CONTENT_URI_BY_ACCOUNT_AND_CONTACT.buildUpon(); + ContentUris.appendId(builder, accountId); + builder.appendPath(username); + return builder.build(); + } + + /** + * Gets the Uri to query off the record messages by provider. + * + * @param providerId the service provider id. + * @return the Uri + */ + public static final Uri getOtrMessagesContentUriByProvider(long providerId) { + Uri.Builder builder = OTR_MESSAGES_CONTENT_URI_BY_PROVIDER.buildUpon(); + ContentUris.appendId(builder, providerId); + return builder.build(); + } + + /** + * Gets the Uri to query off the record messages by account. + * + * @param accountId the account id. + * @return the Uri + */ + public static final Uri getOtrMessagesContentUriByAccount(long accountId) { + Uri.Builder builder = OTR_MESSAGES_CONTENT_URI_BY_ACCOUNT.buildUpon(); + ContentUris.appendId(builder, accountId); + return builder.build(); + } + + /** * The content:// style URL for this table */ - public static final Uri CONTENT_URI = Uri.parse("content://im/messages"); + public static final Uri CONTENT_URI = + Uri.parse("content://im/messages"); /** * The content:// style URL for messages by thread id @@ -1018,32 +1071,47 @@ public class Im { Uri.parse("content://im/messagesByProvider"); /** - * The content:// style URL for groupchat messages. + * The content:// style URL for messages by account */ - public static final Uri GROUP_CHAT_CONTENT_URI = Uri.parse("content://im/groupMessages"); + public static final Uri CONTENT_URI_BY_ACCOUNT = + Uri.parse("content://im/messagesByAccount"); /** - * The content:// style URL for groupchat messages by thread id + * The content:// style url for off the record messages */ - public static final Uri GROUP_CHAT_CONTENT_URI_MESSAGES_BY_THREAD_ID = - Uri.parse("content://im/groupMessagesByThreadId"); + public static final Uri OTR_MESSAGES_CONTENT_URI = + Uri.parse("content://im/otrMessages"); /** - * The MIME type of {@link #CONTENT_URI} providing a directory of groupchat messages. + * The content:// style url for off the record messages by thread id */ - public static final String GROUP_CHAT_CONTENT_TYPE = - "vnd.android.cursor.dir/im-groupMessages"; + public static final Uri OTR_MESSAGES_CONTENT_URI_BY_THREAD_ID = + Uri.parse("content://im/otrMessagesByThreadId"); /** - * The MIME type of a {@link #CONTENT_URI} subdirectory of a single groupchat message. + * The content:// style url for off the record messages by account and contact */ - public static final String GROUP_CHAT_CONTENT_ITEM_TYPE = - "vnd.android.cursor.item/im-groupMessages"; + public static final Uri OTR_MESSAGES_CONTENT_URI_BY_ACCOUNT_AND_CONTACT = + Uri.parse("content://im/otrMessagesByAcctAndContact"); + + /** + * The content:// style URL for off the record messages by provider + */ + public static final Uri OTR_MESSAGES_CONTENT_URI_BY_PROVIDER = + Uri.parse("content://im/otrMessagesByProvider"); + + /** + * The content:// style URL for off the record messages by account + */ + public static final Uri OTR_MESSAGES_CONTENT_URI_BY_ACCOUNT = + Uri.parse("content://im/otrMessagesByAccount"); + /** * The MIME type of {@link #CONTENT_URI} providing a directory of * people. */ - public static final String CONTENT_TYPE = "vnd.android.cursor.dir/im-messages"; + public static final String CONTENT_TYPE = + "vnd.android.cursor.dir/im-messages"; /** * The MIME type of a {@link #CONTENT_URI} subdirectory of a single diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 79b4e97..abe3274 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -148,7 +148,7 @@ public final class Settings { @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String ACTION_WIFI_SETTINGS = "android.settings.WIFI_SETTINGS"; - + /** * Activity Action: Show settings to allow configuration of a static IP * address for Wi-Fi. @@ -305,7 +305,7 @@ public final class Settings { @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String ACTION_QUICK_LAUNCH_SETTINGS = "android.settings.QUICK_LAUNCH_SETTINGS"; - + /** * Activity Action: Show settings to manage installed applications. * <p> @@ -319,7 +319,7 @@ public final class Settings { @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String ACTION_MANAGE_APPLICATIONS_SETTINGS = "android.settings.MANAGE_APPLICATIONS_SETTINGS"; - + /** * Activity Action: Show settings for system update functionality. * <p> @@ -329,7 +329,7 @@ public final class Settings { * Input: Nothing. * <p> * Output: Nothing. - * + * * @hide */ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) @@ -349,7 +349,7 @@ public final class Settings { @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String ACTION_SYNC_SETTINGS = "android.settings.SYNC_SETTINGS"; - + /** * Activity Action: Show settings for selecting the network operator. * <p> @@ -404,7 +404,7 @@ public final class Settings { @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String ACTION_MEMORY_CARD_SETTINGS = "android.settings.MEMORY_CARD_SETTINGS"; - + // End of Intent actions for Settings private static final String JID_RESOURCE_PREFIX = "android"; @@ -495,7 +495,7 @@ public final class Settings { public static final String SYS_PROP_SETTING_VERSION = "sys.settings_system_version"; private static volatile NameValueCache mNameValueCache = null; - + private static final HashSet<String> MOVED_TO_SECURE; static { MOVED_TO_SECURE = new HashSet<String>(30); @@ -901,12 +901,12 @@ public final class Settings { * plugged in. */ public static final int WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED = 1; - + /** * Value for {@link #WIFI_SLEEP_POLICY} to never go to sleep. */ public static final int WIFI_SLEEP_POLICY_NEVER = 2; - + /** * Whether to use static IP and other static network attributes. * <p> @@ -1115,12 +1115,12 @@ public final class Settings { * Note: This is a one-off setting that will be removed in the future * when there is profile support. For this reason, it is kept hidden * from the public APIs. - * + * * @hide */ - public static final String NOTIFICATIONS_USE_RING_VOLUME = + public static final String NOTIFICATIONS_USE_RING_VOLUME = "notifications_use_ring_volume"; - + /** * The mapping of stream type (integer) to its setting. */ @@ -1204,7 +1204,7 @@ public final class Settings { * feature converts two spaces to a "." and space. */ public static final String TEXT_AUTO_PUNCTUATE = "auto_punctuate"; - + /** * Setting to showing password characters in text editors. 1 = On, 0 = Off */ @@ -1286,13 +1286,13 @@ public final class Settings { * boolean (1 or 0). */ public static final String SOUND_EFFECTS_ENABLED = "sound_effects_enabled"; - + /** * Whether the haptic feedback (long presses, ...) are enabled. The value is * boolean (1 or 0). */ public static final String HAPTIC_FEEDBACK_ENABLED = "haptic_feedback_enabled"; - + // Settings moved to Settings.Secure /** @@ -1337,7 +1337,7 @@ public final class Settings { */ @Deprecated public static final String INSTALL_NON_MARKET_APPS = Secure.INSTALL_NON_MARKET_APPS; - + /** * @deprecated Use {@link android.provider.Settings.Secure#LOCATION_PROVIDERS_ALLOWED} * instead @@ -1350,7 +1350,7 @@ public final class Settings { */ @Deprecated public static final String LOGGING_ID = Secure.LOGGING_ID; - + /** * @deprecated Use {@link android.provider.Settings.Secure#NETWORK_PREFERENCE} instead */ @@ -1390,7 +1390,7 @@ public final class Settings { */ @Deprecated public static final String USB_MASS_STORAGE_ENABLED = Secure.USB_MASS_STORAGE_ENABLED; - + /** * @deprecated Use {@link android.provider.Settings.Secure#USE_GOOGLE_MAIL} instead */ @@ -1428,7 +1428,7 @@ public final class Settings { @Deprecated public static final String WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY = Secure.WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY; - + /** * @deprecated Use {@link android.provider.Settings.Secure#WIFI_NUM_OPEN_NETWORKS_KEPT} * instead @@ -1464,7 +1464,7 @@ public final class Settings { @Deprecated public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS = Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS; - + /** * @deprecated Use * {@link android.provider.Settings.Secure#WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED} instead @@ -1840,19 +1840,19 @@ public final class Settings { * Whether the device has been provisioned (0 = false, 1 = true) */ public static final String DEVICE_PROVISIONED = "device_provisioned"; - + /** * List of input methods that are currently enabled. This is a string * containing the IDs of all enabled input methods, each ID separated * by ':'. */ public static final String ENABLED_INPUT_METHODS = "enabled_input_methods"; - + /** * Host name and port for a user-selected proxy. */ public static final String HTTP_PROXY = "http_proxy"; - + /** * Whether the package installer should allow installation of apps downloaded from * sources other than the Android Market (vending machine). @@ -1861,12 +1861,12 @@ public final class Settings { * 0 = only allow installing from the Android Market */ public static final String INSTALL_NON_MARKET_APPS = "install_non_market_apps"; - + /** * Comma-separated list of location providers that activities may access. */ public static final String LOCATION_PROVIDERS_ALLOWED = "location_providers_allowed"; - + /** * The Logging ID (a unique 64-bit value) as a hex string. * Used as a pseudonymous identifier for logging. @@ -1888,19 +1888,19 @@ public final class Settings { * connectivity service should touch this. */ public static final String NETWORK_PREFERENCE = "network_preference"; - - /** + + /** */ public static final String PARENTAL_CONTROL_ENABLED = "parental_control_enabled"; - - /** + + /** */ public static final String PARENTAL_CONTROL_LAST_UPDATE = "parental_control_last_update"; - - /** + + /** */ public static final String PARENTAL_CONTROL_REDIRECT_URL = "parental_control_redirect_url"; - + /** * Settings classname to launch when Settings is clicked from All * Applications. Needed because of user testing between the old @@ -1908,18 +1908,18 @@ public final class Settings { */ // TODO: 881807 public static final String SETTINGS_CLASSNAME = "settings_classname"; - + /** * USB Mass Storage Enabled */ public static final String USB_MASS_STORAGE_ENABLED = "usb_mass_storage_enabled"; - + /** * If this setting is set (to anything), then all references * to Gmail on the device must change to Google Mail. */ public static final String USE_GOOGLE_MAIL = "use_google_mail"; - + /** * If accessibility is enabled. */ @@ -1942,64 +1942,64 @@ public final class Settings { */ public static final String WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON = "wifi_networks_available_notification_on"; - + /** * Delay (in seconds) before repeating the Wi-Fi networks available notification. * Connecting to a network will reset the timer. */ public static final String WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY = "wifi_networks_available_repeat_delay"; - + /** * The number of radio channels that are allowed in the local * 802.11 regulatory domain. * @hide */ public static final String WIFI_NUM_ALLOWED_CHANNELS = "wifi_num_allowed_channels"; - + /** * When the number of open networks exceeds this number, the * least-recently-used excess networks will be removed. */ public static final String WIFI_NUM_OPEN_NETWORKS_KEPT = "wifi_num_open_networks_kept"; - + /** * Whether the Wi-Fi should be on. Only the Wi-Fi service should touch this. */ public static final String WIFI_ON = "wifi_on"; - + /** * The acceptable packet loss percentage (range 0 - 100) before trying * another AP on the same network. */ public static final String WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE = "wifi_watchdog_acceptable_packet_loss_percentage"; - + /** * The number of access points required for a network in order for the * watchdog to monitor it. */ public static final String WIFI_WATCHDOG_AP_COUNT = "wifi_watchdog_ap_count"; - + /** * The delay between background checks. */ public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS = "wifi_watchdog_background_check_delay_ms"; - + /** * Whether the Wi-Fi watchdog is enabled for background checking even * after it thinks the user has connected to a good access point. */ public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED = "wifi_watchdog_background_check_enabled"; - + /** * The timeout for a background ping */ public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS = "wifi_watchdog_background_check_timeout_ms"; - + /** * The number of initial pings to perform that *may* be ignored if they * fail. Again, if these fail, they will *not* be used in packet loss @@ -2008,7 +2008,7 @@ public final class Settings { */ public static final String WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT = "wifi_watchdog_initial_ignored_ping_count"; - + /** * The maximum number of access points (per network) to attempt to test. * If this number is reached, the watchdog will no longer monitor the @@ -2016,7 +2016,7 @@ public final class Settings { * networks containing multiple APs whose DNS does not respond to pings. */ public static final String WIFI_WATCHDOG_MAX_AP_CHECKS = "wifi_watchdog_max_ap_checks"; - + /** * Whether the Wi-Fi watchdog is enabled. */ @@ -2031,24 +2031,24 @@ public final class Settings { * The number of pings to test if an access point is a good connection. */ public static final String WIFI_WATCHDOG_PING_COUNT = "wifi_watchdog_ping_count"; - + /** * The delay between pings. */ public static final String WIFI_WATCHDOG_PING_DELAY_MS = "wifi_watchdog_ping_delay_ms"; - + /** * The timeout per ping. */ public static final String WIFI_WATCHDOG_PING_TIMEOUT_MS = "wifi_watchdog_ping_timeout_ms"; - + /** * The maximum number of times we will retry a connection to an access * point for which we have failed in acquiring an IP address from DHCP. * A value of N means that we will make N+1 connection attempts in all. */ public static final String WIFI_MAX_DHCP_RETRY_COUNT = "wifi_max_dhcp_retry_count"; - + /** * Maximum amount of time in milliseconds to hold a wakelock while waiting for mobile * data connectivity to be established after a disconnect from Wi-Fi. @@ -2078,20 +2078,29 @@ public final class Settings { public static final String CDMA_SUBSCRIPTION_MODE = "subscription_mode"; /** - * represents current active phone class - * 1 = GSM-Phone, 0 = CDMA-Phone + * The preferred network mode 7 = Global + * 6 = EvDo only + * 5 = CDMA w/o EvDo + * 4 = CDMA / EvDo auto + * 3 = GSM / WCDMA auto + * 2 = WCDMA only + * 1 = GSM only + * 0 = GSM / WCDMA preferred * @hide */ - public static final String CURRENT_ACTIVE_PHONE = "current_active_phone"; + public static final String PREFERRED_NETWORK_MODE = + "preferred_network_mode"; /** - * The preferred network mode 7 = Global, CDMA default - * 4 = CDMA only - * 3 = GSM/UMTS only + * The preferred TTY mode 0 = TTy Off, CDMA default + * 1 = TTY Full + * 2 = TTY HCO + * 3 = TTY VCO * @hide */ - public static final String PREFERRED_NETWORK_MODE = - "preferred_network_mode"; + public static final String PREFERRED_TTY_MODE = + "preferred_tty_mode"; + /** * CDMA Cell Broadcast SMS @@ -2142,7 +2151,7 @@ public final class Settings { allowedProviders.startsWith(provider + ",") || allowedProviders.endsWith("," + provider)); } - return false; + return false; } /** @@ -2166,7 +2175,7 @@ public final class Settings { putString(cr, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, provider); } } - + /** * Gservices settings, containing the network names for Google's * various services. This table holds simple name/addr pairs. @@ -2187,6 +2196,13 @@ public final class Settings { public static final String CHANGED_ACTION = "com.google.gservices.intent.action.GSERVICES_CHANGED"; + /** + * Intent action to override Gservices for testing. (Requires WRITE_GSERVICES permission.) + */ + @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) + public static final String OVERRIDE_ACTION = + "com.google.gservices.intent.action.GSERVICES_OVERRIDE"; + private static volatile NameValueCache mNameValueCache = null; private static final Object mNameValueCacheLock = new Object(); @@ -2287,7 +2303,7 @@ public final class Settings { * Event tags from the kernel event log to upload during checkin. */ public static final String CHECKIN_EVENTS = "checkin_events"; - + /** * Event tags for list of services to upload during checkin. */ @@ -2982,7 +2998,7 @@ public final class Settings { public static final String BATTERY_DISCHARGE_DURATION_THRESHOLD = "battery_discharge_duration_threshold"; public static final String BATTERY_DISCHARGE_THRESHOLD = "battery_discharge_threshold"; - + /** * An email address that anr bugreports should be sent to. */ @@ -3126,7 +3142,7 @@ 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 @@ -3191,7 +3207,7 @@ public final class Settings { /** * 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} @@ -3206,24 +3222,24 @@ public final class Settings { 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 != null ? info.loadLabel(packageManager) : ""; @@ -3279,4 +3295,3 @@ public final class Settings { return "android-" + Long.toHexString(androidId); } } - diff --git a/core/java/android/server/search/SearchManagerService.java b/core/java/android/server/search/SearchManagerService.java index 03623d6..952372f 100644 --- a/core/java/android/server/search/SearchManagerService.java +++ b/core/java/android/server/search/SearchManagerService.java @@ -37,9 +37,6 @@ public class SearchManagerService extends ISearchManager.Stub // general debugging support private static final String TAG = "SearchManagerService"; private static final boolean DEBUG = false; - - // configuration choices - private static final boolean IMMEDIATE_SEARCHABLES_UPDATE = true; // class maintenance and general shared data private final Context mContext; @@ -70,9 +67,7 @@ public class SearchManagerService extends ISearchManager.Stub // After startup settles down, preload the searchables list, // which will reduce the delay when the search UI is invoked. - if (IMMEDIATE_SEARCHABLES_UPDATE) { - mHandler.post(mRunUpdateSearchable); - } + mHandler.post(mRunUpdateSearchable); } /** @@ -91,9 +86,7 @@ public class SearchManagerService extends ISearchManager.Stub action.equals(Intent.ACTION_PACKAGE_REMOVED) || action.equals(Intent.ACTION_PACKAGE_CHANGED)) { mSearchablesDirty = true; - if (IMMEDIATE_SEARCHABLES_UPDATE) { - mHandler.post(mRunUpdateSearchable); - } + mHandler.post(mRunUpdateSearchable); return; } } @@ -104,9 +97,7 @@ public class SearchManagerService extends ISearchManager.Stub */ private Runnable mRunUpdateSearchable = new Runnable() { public void run() { - if (mSearchablesDirty) { - updateSearchables(); - } + updateSearchablesIfDirty(); } }; @@ -120,6 +111,15 @@ public class SearchManagerService extends ISearchManager.Stub } /** + * Updates the list of searchables if needed. + */ + private void updateSearchablesIfDirty() { + if (mSearchablesDirty) { + updateSearchables(); + } + } + + /** * Returns the SearchableInfo for a given activity * * @param launchActivity The activity from which we're launching this search. @@ -131,11 +131,7 @@ public class SearchManagerService extends ISearchManager.Stub * or null if no searchable metadata was available. */ public SearchableInfo getSearchableInfo(ComponentName launchActivity, boolean globalSearch) { - // final check. however we should try to avoid this, because - // it slows down the entry into the UI. - if (mSearchablesDirty) { - updateSearchables(); - } + updateSearchablesIfDirty(); SearchableInfo si = null; if (globalSearch) { si = mSearchables.getDefaultSearchable(); @@ -150,6 +146,7 @@ public class SearchManagerService extends ISearchManager.Stub * Returns a list of the searchable activities that can be included in global search. */ public List<SearchableInfo> getSearchablesInGlobalSearch() { + updateSearchablesIfDirty(); return mSearchables.getSearchablesInGlobalSearchList(); } diff --git a/core/java/android/server/search/Searchables.java b/core/java/android/server/search/Searchables.java index 9586d56..62631d6 100644 --- a/core/java/android/server/search/Searchables.java +++ b/core/java/android/server/search/Searchables.java @@ -24,6 +24,7 @@ import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Bundle; +import android.util.Log; import java.util.ArrayList; import java.util.HashMap; @@ -34,6 +35,8 @@ import java.util.List; */ public class Searchables { + private static final String LOG_TAG = "Searchables"; + // static strings used for XML lookups, etc. // TODO how should these be documented for the developer, in a more structured way than // the current long wordy javadoc in SearchManager.java ? @@ -184,7 +187,6 @@ public class Searchables { * TODO: sort the list somehow? UI choice. */ public void buildSearchableList() { - // These will become the new values at the end of the method HashMap<ComponentName, SearchableInfo> newSearchablesMap = new HashMap<ComponentName, SearchableInfo>(); @@ -223,6 +225,11 @@ public class Searchables { ComponentName globalSearchActivity = globalSearchIntent.resolveActivity(pm); SearchableInfo newDefaultSearchable = newSearchablesMap.get(globalSearchActivity); + if (newDefaultSearchable == null) { + Log.w(LOG_TAG, "No searchable info found for new default searchable activity " + + globalSearchActivity); + } + // Store a consistent set of new values synchronized (this) { mSearchablesMap = newSearchablesMap; diff --git a/core/java/android/syncml/pim/PropertyNode.java b/core/java/android/syncml/pim/PropertyNode.java index cc52499..983ecb8 100644 --- a/core/java/android/syncml/pim/PropertyNode.java +++ b/core/java/android/syncml/pim/PropertyNode.java @@ -17,12 +17,16 @@ package android.syncml.pim; import android.content.ContentValues; -import android.util.Log; +import org.apache.commons.codec.binary.Base64; + +import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.Map.Entry; +import java.util.regex.Pattern; public class PropertyNode { @@ -52,7 +56,9 @@ public class PropertyNode { public Set<String> propGroupSet; public PropertyNode() { + propName = ""; propValue = ""; + propValue_vector = new ArrayList<String>(); paramMap = new ContentValues(); paramMap_TYPE = new HashSet<String>(); propGroupSet = new HashSet<String>(); @@ -62,13 +68,21 @@ public class PropertyNode { String propName, String propValue, List<String> propValue_vector, byte[] propValue_bytes, ContentValues paramMap, Set<String> paramMap_TYPE, Set<String> propGroupSet) { - this.propName = propName; + if (propName != null) { + this.propName = propName; + } else { + this.propName = ""; + } if (propValue != null) { this.propValue = propValue; } else { this.propValue = ""; } - this.propValue_vector = propValue_vector; + if (propValue_vector != null) { + this.propValue_vector = propValue_vector; + } else { + this.propValue_vector = new ArrayList<String>(); + } this.propValue_bytes = propValue_bytes; if (paramMap != null) { this.paramMap = paramMap; @@ -117,17 +131,9 @@ public class PropertyNode { // decoded by BASE64 or QUOTED-PRINTABLE. When the size of propValue_vector // is 1, the encoded value is stored in propValue, so we do not have to // check it. - if (propValue_vector != null) { - // Log.d("@@@", "===" + propValue_vector + ", " + node.propValue_vector); - return (propValue_vector.equals(node.propValue_vector) || - (propValue_vector.size() == 1)); - } else if (node.propValue_vector != null) { - // Log.d("@@@", "===" + propValue_vector + ", " + node.propValue_vector); - return (node.propValue_vector.equals(propValue_vector) || - (node.propValue_vector.size() == 1)); - } else { - return true; - } + return (propValue_vector.equals(node.propValue_vector) || + propValue_vector.size() == 1 || + node.propValue_vector.size() == 1); } } @@ -154,4 +160,164 @@ public class PropertyNode { builder.append(propValue); return builder.toString(); } + + /** + * Encode this object into a string which can be decoded. + */ + public String encode() { + // PropertyNode#toString() is for reading, not for parsing in the future. + // We construct appropriate String here. + StringBuilder builder = new StringBuilder(); + if (propName.length() > 0) { + builder.append("propName:["); + builder.append(propName); + builder.append("],"); + } + int size = propGroupSet.size(); + if (size > 0) { + Set<String> set = propGroupSet; + builder.append("propGroup:["); + int i = 0; + for (String group : set) { + // We do not need to double quote groups. + // group = 1*(ALPHA / DIGIT / "-") + builder.append(group); + if (i < size - 1) { + builder.append(","); + } + i++; + } + builder.append("],"); + } + + if (paramMap.size() > 0 || paramMap_TYPE.size() > 0) { + ContentValues values = paramMap; + builder.append("paramMap:["); + size = paramMap.size(); + int i = 0; + for (Entry<String, Object> entry : values.valueSet()) { + // Assuming param-key does not contain NON-ASCII nor symbols. + // + // According to vCard 3.0: + // param-name = iana-token / x-name + builder.append(entry.getKey()); + + // param-value may contain any value including NON-ASCIIs. + // We use the following replacing rule. + // \ -> \\ + // , -> \, + // In String#replaceAll(), "\\\\" means a single backslash. + builder.append("="); + builder.append(entry.getValue().toString() + .replaceAll("\\\\", "\\\\\\\\") + .replaceAll(",", "\\\\,")); + if (i < size -1) { + builder.append(","); + } + i++; + } + + Set<String> set = paramMap_TYPE; + size = paramMap_TYPE.size(); + if (i > 0 && size > 0) { + builder.append(","); + } + i = 0; + for (String type : set) { + builder.append("TYPE="); + builder.append(type + .replaceAll("\\\\", "\\\\\\\\") + .replaceAll(",", "\\\\,")); + if (i < size - 1) { + builder.append(","); + } + i++; + } + builder.append("],"); + } + + size = propValue_vector.size(); + if (size > 0) { + builder.append("propValue:["); + List<String> list = propValue_vector; + for (int i = 0; i < size; i++) { + builder.append(list.get(i) + .replaceAll("\\\\", "\\\\\\\\") + .replaceAll(",", "\\\\,")); + if (i < size -1) { + builder.append(","); + } + } + builder.append("],"); + } + + return builder.toString(); + } + + public static PropertyNode decode(String encodedString) { + PropertyNode propertyNode = new PropertyNode(); + String trimed = encodedString.trim(); + if (trimed.length() == 0) { + return propertyNode; + } + String[] elems = trimed.split("],"); + + for (String elem : elems) { + int index = elem.indexOf('['); + String name = elem.substring(0, index - 1); + Pattern pattern = Pattern.compile("(?<!\\\\),"); + String[] values = pattern.split(elem.substring(index + 1), -1); + if (name.equals("propName")) { + propertyNode.propName = values[0]; + } else if (name.equals("propGroupSet")) { + for (String value : values) { + propertyNode.propGroupSet.add(value); + } + } else if (name.equals("paramMap")) { + ContentValues paramMap = propertyNode.paramMap; + Set<String> paramMap_TYPE = propertyNode.paramMap_TYPE; + for (String value : values) { + String[] tmp = value.split("=", 2); + String mapKey = tmp[0]; + // \, -> , + // \\ -> \ + // In String#replaceAll(), "\\\\" means a single backslash. + String mapValue = + tmp[1].replaceAll("\\\\,", ",").replaceAll("\\\\\\\\", "\\\\"); + if (mapKey.equalsIgnoreCase("TYPE")) { + paramMap_TYPE.add(mapValue); + } else { + paramMap.put(mapKey, mapValue); + } + } + } else if (name.equals("propValue")) { + StringBuilder builder = new StringBuilder(); + List<String> list = propertyNode.propValue_vector; + int length = values.length; + for (int i = 0; i < length; i++) { + String normValue = values[i] + .replaceAll("\\\\,", ",") + .replaceAll("\\\\\\\\", "\\\\"); + list.add(normValue); + builder.append(normValue); + if (i < length - 1) { + builder.append(";"); + } + } + propertyNode.propValue = builder.toString(); + } + } + + // At this time, QUOTED-PRINTABLE is already decoded to Java String. + // We just need to decode BASE64 String to binary. + String encoding = propertyNode.paramMap.getAsString("ENCODING"); + if (encoding != null && + (encoding.equalsIgnoreCase("BASE64") || + encoding.equalsIgnoreCase("B"))) { + propertyNode.propValue_bytes = + Base64.decodeBase64(propertyNode.propValue_vector.get(0).getBytes()); + } + + return propertyNode; + } } diff --git a/core/java/android/syncml/pim/VBuilderCollection.java b/core/java/android/syncml/pim/VBuilderCollection.java new file mode 100644 index 0000000..f09c1c4 --- /dev/null +++ b/core/java/android/syncml/pim/VBuilderCollection.java @@ -0,0 +1,100 @@ +/* + * 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.syncml.pim; + +import java.util.Collection; +import java.util.List; + +public class VBuilderCollection implements VBuilder { + + private final Collection<VBuilder> mVBuilderCollection; + + public VBuilderCollection(Collection<VBuilder> vBuilderCollection) { + mVBuilderCollection = vBuilderCollection; + } + + public Collection<VBuilder> getVBuilderCollection() { + return mVBuilderCollection; + } + + public void start() { + for (VBuilder builder : mVBuilderCollection) { + builder.start(); + } + } + + public void end() { + for (VBuilder builder : mVBuilderCollection) { + builder.end(); + } + } + + public void startRecord(String type) { + for (VBuilder builder : mVBuilderCollection) { + builder.startRecord(type); + } + } + + public void endRecord() { + for (VBuilder builder : mVBuilderCollection) { + builder.endRecord(); + } + } + + public void startProperty() { + for (VBuilder builder : mVBuilderCollection) { + builder.startProperty(); + } + } + + + public void endProperty() { + for (VBuilder builder : mVBuilderCollection) { + builder.endProperty(); + } + } + + public void propertyGroup(String group) { + for (VBuilder builder : mVBuilderCollection) { + builder.propertyGroup(group); + } + } + + public void propertyName(String name) { + for (VBuilder builder : mVBuilderCollection) { + builder.propertyName(name); + } + } + + public void propertyParamType(String type) { + for (VBuilder builder : mVBuilderCollection) { + builder.propertyParamType(type); + } + } + + public void propertyParamValue(String value) { + for (VBuilder builder : mVBuilderCollection) { + builder.propertyParamValue(value); + } + } + + public void propertyValues(List<String> values) { + for (VBuilder builder : mVBuilderCollection) { + builder.propertyValues(values); + } + } +} diff --git a/core/java/android/syncml/pim/VDataBuilder.java b/core/java/android/syncml/pim/VDataBuilder.java index 8c67cf5..f6e5b65 100644 --- a/core/java/android/syncml/pim/VDataBuilder.java +++ b/core/java/android/syncml/pim/VDataBuilder.java @@ -17,8 +17,10 @@ package android.syncml.pim; import android.content.ContentValues; +import android.util.CharsetUtils; import android.util.Log; +import org.apache.commons.codec.DecoderException; import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.net.QuotedPrintableCodec; @@ -26,9 +28,7 @@ import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.util.ArrayList; -import java.util.Collection; import java.util.List; -import java.util.Vector; /** * Store the parse result to custom datastruct: VNode, PropertyNode @@ -38,7 +38,13 @@ import java.util.Vector; */ public class VDataBuilder implements VBuilder { static private String LOG_TAG = "VDATABuilder"; - + + /** + * If there's no other information available, this class uses this charset for encoding + * byte arrays. + */ + static public String DEFAULT_CHARSET = "UTF-8"; + /** type=VNode */ public List<VNode> vNodeList = new ArrayList<VNode>(); private int mNodeListPos = 0; @@ -47,34 +53,74 @@ public class VDataBuilder implements VBuilder { private String mCurrentParamType; /** - * Assumes that each String can be encoded into byte array using this encoding. + * The charset using which VParser parses the text. + */ + private String mSourceCharset; + + /** + * The charset with which byte array is encoded to String. */ - private String mCharset; + private String mTargetCharset; private boolean mStrictLineBreakParsing; public VDataBuilder() { - mCharset = "ISO-8859-1"; - mStrictLineBreakParsing = false; + this(VParser.DEFAULT_CHARSET, DEFAULT_CHARSET, false); } - public VDataBuilder(String encoding, boolean strictLineBreakParsing) { - mCharset = encoding; - mStrictLineBreakParsing = strictLineBreakParsing; + public VDataBuilder(String charset, boolean strictLineBreakParsing) { + this(null, charset, strictLineBreakParsing); } + /** + * @hide sourceCharset is temporal. + */ + public VDataBuilder(String sourceCharset, String targetCharset, + boolean strictLineBreakParsing) { + if (sourceCharset != null) { + mSourceCharset = sourceCharset; + } else { + mSourceCharset = VParser.DEFAULT_CHARSET; + } + if (targetCharset != null) { + mTargetCharset = targetCharset; + } else { + mTargetCharset = DEFAULT_CHARSET; + } + mStrictLineBreakParsing = strictLineBreakParsing; + } + public void start() { } public void end() { } + // Note: I guess that this code assumes the Record may nest like this: + // START:VPOS + // ... + // START:VPOS2 + // ... + // END:VPOS2 + // ... + // END:VPOS + // + // However the following code has a bug. + // When error occurs after calling startRecord(), the entry which is probably + // the cause of the error remains to be in vNodeList, while endRecord() is not called. + // + // I leave this code as is since I'm not familiar with vcalendar specification. + // But I believe we should refactor this code in the future. + // Until this, the last entry has to be removed when some error occurs. public void startRecord(String type) { + VNode vnode = new VNode(); vnode.parseStatus = 1; vnode.VName = type; + // I feel this should be done in endRecord(), but it cannot be done because of + // the reason above. vNodeList.add(vnode); - mNodeListPos = vNodeList.size()-1; + mNodeListPos = vNodeList.size() - 1; mCurrentVNode = vNodeList.get(mNodeListPos); } @@ -90,15 +136,14 @@ public class VDataBuilder implements VBuilder { } public void startProperty() { - // System.out.println("+ startProperty. "); + mCurrentPropNode = new PropertyNode(); } public void endProperty() { - // System.out.println("- endProperty. "); + mCurrentVNode.propList.add(mCurrentPropNode); } public void propertyName(String name) { - mCurrentPropNode = new PropertyNode(); mCurrentPropNode.propName = name; } @@ -122,139 +167,145 @@ public class VDataBuilder implements VBuilder { mCurrentParamType = null; } - private String encodeString(String originalString, String targetEncoding) { - Charset charset = Charset.forName(mCharset); + private String encodeString(String originalString, String targetCharset) { + if (mSourceCharset.equalsIgnoreCase(targetCharset)) { + return originalString; + } + Charset charset = Charset.forName(mSourceCharset); ByteBuffer byteBuffer = charset.encode(originalString); // byteBuffer.array() "may" return byte array which is larger than // byteBuffer.remaining(). Here, we keep on the safe side. byte[] bytes = new byte[byteBuffer.remaining()]; byteBuffer.get(bytes); try { - return new String(bytes, targetEncoding); + return new String(bytes, targetCharset); } catch (UnsupportedEncodingException e) { - return null; + Log.e(LOG_TAG, "Failed to encode: charset=" + targetCharset); + return new String(bytes); } } - public void propertyValues(List<String> values) { - ContentValues paramMap = mCurrentPropNode.paramMap; - - String charsetString = paramMap.getAsString("CHARSET"); - - boolean setupParamValues = false; - //decode value string to propValue_bytes - if (paramMap.containsKey("ENCODING")) { - String encoding = paramMap.getAsString("ENCODING"); - if (encoding.equalsIgnoreCase("BASE64") || - encoding.equalsIgnoreCase("B")) { - if (values.size() > 1) { - Log.e(LOG_TAG, - ("BASE64 encoding is used while " + - "there are multiple values (" + values.size())); - } + private String handleOneValue(String value, String targetCharset, String encoding) { + if (encoding != null) { + if (encoding.equals("BASE64") || encoding.equals("B")) { + // Assume BASE64 is used only when the number of values is 1. mCurrentPropNode.propValue_bytes = - Base64.decodeBase64(values.get(0). - replaceAll(" ","").replaceAll("\t",""). - replaceAll("\r\n",""). - getBytes()); - } - - if(encoding.equalsIgnoreCase("QUOTED-PRINTABLE")){ - // if CHARSET is defined, we translate each String into the Charset. - List<String> tmpValues = new ArrayList<String>(); - Vector<byte[]> byteVector = new Vector<byte[]>(); - int size = 0; - try{ - for (String value : values) { - String quotedPrintable = value - .replaceAll("= ", " ").replaceAll("=\t", "\t"); - String[] lines; - if (mStrictLineBreakParsing) { - lines = quotedPrintable.split("\r\n"); - } else { - lines = quotedPrintable - .replace("\r\n", "\n").replace("\r", "\n").split("\n"); - } - StringBuilder builder = new StringBuilder(); - for (String line : lines) { - if (line.endsWith("=")) { - line = line.substring(0, line.length() - 1); - } - builder.append(line); - } - byte[] bytes = QuotedPrintableCodec.decodeQuotedPrintable( - builder.toString().getBytes()); - if (charsetString != null) { - try { - tmpValues.add(new String(bytes, charsetString)); - } catch (UnsupportedEncodingException e) { - Log.e(LOG_TAG, "Failed to encode: charset=" + charsetString); - tmpValues.add(new String(bytes)); + Base64.decodeBase64(value.getBytes()); + return value; + } else if (encoding.equals("QUOTED-PRINTABLE")) { + String quotedPrintable = value + .replaceAll("= ", " ").replaceAll("=\t", "\t"); + String[] lines; + if (mStrictLineBreakParsing) { + lines = quotedPrintable.split("\r\n"); + } else { + StringBuilder builder = new StringBuilder(); + int length = quotedPrintable.length(); + ArrayList<String> list = new ArrayList<String>(); + for (int i = 0; i < length; i++) { + char ch = quotedPrintable.charAt(i); + if (ch == '\n') { + list.add(builder.toString()); + builder = new StringBuilder(); + } else if (ch == '\r') { + list.add(builder.toString()); + builder = new StringBuilder(); + if (i < length - 1) { + char nextCh = quotedPrintable.charAt(i + 1); + if (nextCh == '\n') { + i++; + } } } else { - tmpValues.add(new String(bytes)); - } - byteVector.add(bytes); - size += bytes.length; - } // for (String value : values) { - mCurrentPropNode.propValue_vector = tmpValues; - mCurrentPropNode.propValue = listToString(tmpValues); - - mCurrentPropNode.propValue_bytes = new byte[size]; - - { - byte[] tmpBytes = mCurrentPropNode.propValue_bytes; - int index = 0; - for (byte[] bytes : byteVector) { - int length = bytes.length; - for (int i = 0; i < length; i++, index++) { - tmpBytes[index] = bytes[i]; - } + builder.append(ch); } } - setupParamValues = true; - } catch(Exception e) { - Log.e(LOG_TAG, "Failed to decode quoted-printable: " + e); + String finalLine = builder.toString(); + if (finalLine.length() > 0) { + list.add(finalLine); + } + lines = list.toArray(new String[0]); } - } // QUOTED-PRINTABLE - } // ENCODING - - if (!setupParamValues) { - // if CHARSET is defined, we translate each String into the Charset. - if (charsetString != null) { - List<String> tmpValues = new ArrayList<String>(); - for (String value : values) { - String result = encodeString(value, charsetString); - if (result != null) { - tmpValues.add(result); - } else { - Log.e(LOG_TAG, "Failed to encode: charset=" + charsetString); - tmpValues.add(value); + StringBuilder builder = new StringBuilder(); + for (String line : lines) { + if (line.endsWith("=")) { + line = line.substring(0, line.length() - 1); } + builder.append(line); + } + byte[] bytes; + try { + bytes = builder.toString().getBytes(mSourceCharset); + } catch (UnsupportedEncodingException e1) { + Log.e(LOG_TAG, "Failed to encode: charset=" + mSourceCharset); + bytes = builder.toString().getBytes(); + } + + try { + bytes = QuotedPrintableCodec.decodeQuotedPrintable(bytes); + } catch (DecoderException e) { + Log.e(LOG_TAG, "Failed to decode quoted-printable: " + e); + return ""; + } + + try { + return new String(bytes, targetCharset); + } catch (UnsupportedEncodingException e) { + Log.e(LOG_TAG, "Failed to encode: charset=" + targetCharset); + return new String(bytes); } - values = tmpValues; } - - mCurrentPropNode.propValue_vector = values; - mCurrentPropNode.propValue = listToString(values); + // Unknown encoding. Fall back to default. } - mCurrentVNode.propList.add(mCurrentPropNode); + return encodeString(value, targetCharset); } - - private String listToString(Collection<String> list){ - StringBuilder typeListB = new StringBuilder(); - for (String type : list) { - typeListB.append(type).append(";"); + + public void propertyValues(List<String> values) { + if (values == null || values.size() == 0) { + mCurrentPropNode.propValue_bytes = null; + mCurrentPropNode.propValue_vector.clear(); + mCurrentPropNode.propValue_vector.add(""); + mCurrentPropNode.propValue = ""; + return; + } + + ContentValues paramMap = mCurrentPropNode.paramMap; + + String targetCharset = CharsetUtils.nameForDefaultVendor(paramMap.getAsString("CHARSET")); + String encoding = paramMap.getAsString("ENCODING"); + + if (targetCharset == null || targetCharset.length() == 0) { + targetCharset = mTargetCharset; + } + + for (String value : values) { + mCurrentPropNode.propValue_vector.add( + handleOneValue(value, targetCharset, encoding)); } - int len = typeListB.length(); - if (len > 0 && typeListB.charAt(len - 1) == ';') { - return typeListB.substring(0, len - 1); + + mCurrentPropNode.propValue = listToString(mCurrentPropNode.propValue_vector); + } + + private String listToString(List<String> list){ + int size = list.size(); + if (size > 1) { + StringBuilder typeListB = new StringBuilder(); + for (String type : list) { + typeListB.append(type).append(";"); + } + int len = typeListB.length(); + if (len > 0 && typeListB.charAt(len - 1) == ';') { + return typeListB.substring(0, len - 1); + } + return typeListB.toString(); + } else if (size == 1) { + return list.get(0); + } else { + return ""; } - return typeListB.toString(); } public String getResult(){ return null; } } - diff --git a/core/java/android/syncml/pim/VParser.java b/core/java/android/syncml/pim/VParser.java index df93f38..57c5f7a 100644 --- a/core/java/android/syncml/pim/VParser.java +++ b/core/java/android/syncml/pim/VParser.java @@ -26,6 +26,9 @@ import java.io.UnsupportedEncodingException; * */ abstract public class VParser { + // Assume that "iso-8859-1" is able to map "all" 8bit characters to some unicode and + // decode the unicode to the original charset. If not, this setting will cause some bug. + public static String DEFAULT_CHARSET = "iso-8859-1"; /** * The buffer used to store input stream @@ -96,6 +99,20 @@ abstract public class VParser { } /** + * Parse the given stream with the default encoding. + * + * @param is + * The source to parse. + * @param builder + * The v builder which used to construct data. + * @return Return true for success, otherwise false. + * @throws IOException + */ + public boolean parse(InputStream is, VBuilder builder) throws IOException { + return parse(is, DEFAULT_CHARSET, builder); + } + + /** * Copy the content of input stream and filter the "folding" */ protected void setInputStream(InputStream is, String encoding) diff --git a/core/java/android/syncml/pim/vcard/ContactStruct.java b/core/java/android/syncml/pim/vcard/ContactStruct.java index 8d9b7fa..5a29112 100644 --- a/core/java/android/syncml/pim/vcard/ContactStruct.java +++ b/core/java/android/syncml/pim/vcard/ContactStruct.java @@ -16,45 +16,103 @@ package android.syncml.pim.vcard; -import java.util.List; +import android.content.AbstractSyncableContentProvider; +import android.content.ContentProviderOperation; +import android.content.ContentResolver; +import android.content.ContentUris; +import android.content.ContentValues; +import android.net.Uri; +import android.provider.Contacts; +import android.provider.Contacts.ContactMethods; +import android.provider.Contacts.Extensions; +import android.provider.Contacts.GroupMembership; +import android.provider.Contacts.Organizations; +import android.provider.Contacts.People; +import android.provider.Contacts.Phones; +import android.provider.Contacts.Photos; +import android.syncml.pim.PropertyNode; +import android.syncml.pim.VNode; +import android.telephony.PhoneNumberUtils; +import android.text.TextUtils; +import android.util.Log; + import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Map.Entry; /** - * The parameter class of VCardCreator. + * The parameter class of VCardComposer. * This class standy by the person-contact in * Android system, we must use this class instance as parameter to transmit to - * VCardCreator so that create vCard string. + * VCardComposer so that create vCard string. */ // TODO: rename the class name, next step public class ContactStruct { - public String company; + private static final String LOG_TAG = "ContactStruct"; + + // Note: phonetic name probably should be "LAST FIRST MIDDLE" for European languages, and + // space should be added between each element while it should not be in Japanese. + // But unfortunately, we currently do not have the data and are not sure whether we should + // support European version of name ordering. + // + // TODO: Implement the logic described above if we really need European version of + // phonetic name handling. Also, adding the appropriate test case of vCard would be + // highly appreciated. + public static final int NAME_ORDER_TYPE_ENGLISH = 0; + public static final int NAME_ORDER_TYPE_JAPANESE = 1; + /** MUST exist */ public String name; + public String phoneticName; /** maybe folding */ - public String notes; + public List<String> notes = new ArrayList<String>(); /** maybe folding */ public String title; /** binary bytes of pic. */ public byte[] photoBytes; - /** mime_type col of images table */ + /** The type of Photo (e.g. JPEG, BMP, etc.) */ public String photoType; /** Only for GET. Use addPhoneList() to PUT. */ public List<PhoneData> phoneList; /** Only for GET. Use addContactmethodList() to PUT. */ public List<ContactMethod> contactmethodList; + /** Only for GET. Use addOrgList() to PUT. */ + public List<OrganizationData> organizationList; + /** Only for GET. Use addExtension() to PUT */ + public Map<String, List<String>> extensionMap; - public static class PhoneData{ + // Use organizationList instead when handling ORG. + @Deprecated + public String company; + + public static class PhoneData { + public int type; /** maybe folding */ public String data; - public String type; public String label; + public boolean isPrimary; } - public static class ContactMethod{ - public String kind; - public String type; + public static class ContactMethod { + // Contacts.KIND_EMAIL, Contacts.KIND_POSTAL + public int kind; + // e.g. Contacts.ContactMethods.TYPE_HOME, Contacts.PhoneColumns.TYPE_HOME + // If type == Contacts.PhoneColumns.TYPE_CUSTOM, label is used. + public int type; public String data; + // Used only when TYPE is TYPE_CUSTOM. public String label; + public boolean isPrimary; + } + + public static class OrganizationData { + public int type; + public String companyName; + public String positionName; + public boolean isPrimary; } /** @@ -63,29 +121,837 @@ public class ContactStruct { * @param type type col of content://contacts/phones * @param label lable col of content://contacts/phones */ - public void addPhone(String data, String type, String label){ - if(phoneList == null) + public void addPhone(int type, String data, String label, boolean isPrimary){ + if (phoneList == null) { phoneList = new ArrayList<PhoneData>(); - PhoneData st = new PhoneData(); - st.data = data; - st.type = type; - st.label = label; - phoneList.add(st); + } + PhoneData phoneData = new PhoneData(); + phoneData.type = type; + + StringBuilder builder = new StringBuilder(); + String trimed = data.trim(); + int length = trimed.length(); + for (int i = 0; i < length; i++) { + char ch = trimed.charAt(i); + if (('0' <= ch && ch <= '9') || (i == 0 && ch == '+')) { + builder.append(ch); + } + } + phoneData.data = PhoneNumberUtils.formatNumber(builder.toString()); + phoneData.label = label; + phoneData.isPrimary = isPrimary; + phoneList.add(phoneData); } + /** * Add a contactmethod info to contactmethodList. - * @param data contact data + * @param kind integer value defined in Contacts.java + * (e.g. Contacts.KIND_EMAIL) * @param type type col of content://contacts/contact_methods + * @param data contact data + * @param label extra string used only when kind is Contacts.KIND_CUSTOM. */ - public void addContactmethod(String kind, String data, String type, - String label){ - if(contactmethodList == null) + public void addContactmethod(int kind, int type, String data, + String label, boolean isPrimary){ + if (contactmethodList == null) { contactmethodList = new ArrayList<ContactMethod>(); - ContactMethod st = new ContactMethod(); - st.kind = kind; - st.data = data; - st.type = type; - st.label = label; - contactmethodList.add(st); + } + ContactMethod contactMethod = new ContactMethod(); + contactMethod.kind = kind; + contactMethod.type = type; + contactMethod.data = data; + contactMethod.label = label; + contactMethod.isPrimary = isPrimary; + contactmethodList.add(contactMethod); + } + + /** + * Add a Organization info to organizationList. + */ + public void addOrganization(int type, String companyName, String positionName, + boolean isPrimary) { + if (organizationList == null) { + organizationList = new ArrayList<OrganizationData>(); + } + OrganizationData organizationData = new OrganizationData(); + organizationData.type = type; + organizationData.companyName = companyName; + organizationData.positionName = positionName; + organizationData.isPrimary = isPrimary; + organizationList.add(organizationData); + } + + public void addExtension(PropertyNode propertyNode) { + if (propertyNode.propValue.length() == 0) { + return; + } + // Now store the string into extensionMap. + List<String> list; + String name = propertyNode.propName; + if (extensionMap == null) { + extensionMap = new HashMap<String, List<String>>(); + } + if (!extensionMap.containsKey(name)){ + list = new ArrayList<String>(); + extensionMap.put(name, list); + } else { + list = extensionMap.get(name); + } + + list.add(propertyNode.encode()); + } + + private static String getNameFromNProperty(List<String> elems, int nameOrderType) { + // Family, Given, Middle, Prefix, Suffix. (1 - 5) + int size = elems.size(); + if (size > 1) { + StringBuilder builder = new StringBuilder(); + boolean builderIsEmpty = true; + // Prefix + if (size > 3 && elems.get(3).length() > 0) { + builder.append(elems.get(3)); + builderIsEmpty = false; + } + String first, second; + if (nameOrderType == NAME_ORDER_TYPE_JAPANESE) { + first = elems.get(0); + second = elems.get(1); + } else { + first = elems.get(1); + second = elems.get(0); + } + if (first.length() > 0) { + if (!builderIsEmpty) { + builder.append(' '); + } + builder.append(first); + builderIsEmpty = false; + } + // Middle name + if (size > 2 && elems.get(2).length() > 0) { + if (!builderIsEmpty) { + builder.append(' '); + } + builder.append(elems.get(2)); + builderIsEmpty = false; + } + if (second.length() > 0) { + if (!builderIsEmpty) { + builder.append(' '); + } + builder.append(second); + builderIsEmpty = false; + } + // Suffix + if (size > 4 && elems.get(4).length() > 0) { + if (!builderIsEmpty) { + builder.append(' '); + } + builder.append(elems.get(4)); + builderIsEmpty = false; + } + return builder.toString(); + } else if (size == 1) { + return elems.get(0); + } else { + return ""; + } + } + + public static ContactStruct constructContactFromVNode(VNode node, + int nameOrderType) { + if (!node.VName.equals("VCARD")) { + // Impossible in current implementation. Just for safety. + Log.e(LOG_TAG, "Non VCARD data is inserted."); + return null; + } + + // For name, there are three fields in vCard: FN, N, NAME. + // We prefer FN, which is a required field in vCard 3.0 , but not in vCard 2.1. + // Next, we prefer NAME, which is defined only in vCard 3.0. + // Finally, we use N, which is a little difficult to parse. + String fullName = null; + String nameFromNProperty = null; + + // Some vCard has "X-PHONETIC-FIRST-NAME", "X-PHONETIC-MIDDLE-NAME", and + // "X-PHONETIC-LAST-NAME" + String xPhoneticFirstName = null; + String xPhoneticMiddleName = null; + String xPhoneticLastName = null; + + ContactStruct contact = new ContactStruct(); + + // Each Column of four properties has ISPRIMARY field + // (See android.provider.Contacts) + // If false even after the following loop, we choose the first + // entry as a "primary" entry. + boolean prefIsSetAddress = false; + boolean prefIsSetPhone = false; + boolean prefIsSetEmail = false; + boolean prefIsSetOrganization = false; + + for (PropertyNode propertyNode: node.propList) { + String name = propertyNode.propName; + + if (TextUtils.isEmpty(propertyNode.propValue)) { + continue; + } + + if (name.equals("VERSION")) { + // vCard version. Ignore this. + } else if (name.equals("FN")) { + fullName = propertyNode.propValue; + } else if (name.equals("NAME") && fullName == null) { + // Only in vCard 3.0. Use this if FN does not exist. + // Though, note that vCard 3.0 requires FN. + fullName = propertyNode.propValue; + } else if (name.equals("N")) { + nameFromNProperty = getNameFromNProperty(propertyNode.propValue_vector, + nameOrderType); + } else if (name.equals("SORT-STRING")) { + contact.phoneticName = propertyNode.propValue; + } else if (name.equals("SOUND")) { + if (propertyNode.paramMap_TYPE.contains("X-IRMC-N") && + contact.phoneticName == null) { + // Some Japanese mobile phones use this field for phonetic name, + // since vCard 2.1 does not have "SORT-STRING" type. + // Also, in some cases, the field has some ';' in it. + // We remove them. + StringBuilder builder = new StringBuilder(); + String value = propertyNode.propValue; + int length = value.length(); + for (int i = 0; i < length; i++) { + char ch = value.charAt(i); + if (ch != ';') { + builder.append(ch); + } + } + contact.phoneticName = builder.toString(); + } else { + contact.addExtension(propertyNode); + } + } else if (name.equals("ADR")) { + List<String> values = propertyNode.propValue_vector; + boolean valuesAreAllEmpty = true; + for (String value : values) { + if (value.length() > 0) { + valuesAreAllEmpty = false; + break; + } + } + if (valuesAreAllEmpty) { + continue; + } + + int kind = Contacts.KIND_POSTAL; + int type = -1; + String label = ""; + boolean isPrimary = false; + for (String typeString : propertyNode.paramMap_TYPE) { + if (typeString.equals("PREF") && !prefIsSetAddress) { + // Only first "PREF" is considered. + prefIsSetAddress = true; + isPrimary = true; + } else if (typeString.equalsIgnoreCase("HOME")) { + type = Contacts.ContactMethodsColumns.TYPE_HOME; + label = ""; + } else if (typeString.equalsIgnoreCase("WORK") || + typeString.equalsIgnoreCase("COMPANY")) { + // "COMPANY" seems emitted by Windows Mobile, which is not + // specifically supported by vCard 2.1. We assume this is same + // as "WORK". + type = Contacts.ContactMethodsColumns.TYPE_WORK; + label = ""; + } else if (typeString.equalsIgnoreCase("POSTAL")) { + kind = Contacts.KIND_POSTAL; + } else if (typeString.equalsIgnoreCase("PARCEL") || + typeString.equalsIgnoreCase("DOM") || + typeString.equalsIgnoreCase("INTL")) { + // We do not have a kind or type matching these. + // TODO: fix this. We may need to split entries into two. + // (e.g. entries for KIND_POSTAL and KIND_PERCEL) + } else if (typeString.toUpperCase().startsWith("X-") && + type < 0) { + type = Contacts.ContactMethodsColumns.TYPE_CUSTOM; + label = typeString.substring(2); + } else if (type < 0) { + // vCard 3.0 allows iana-token. Also some vCard 2.1 exporters + // emit non-standard types. We do not handle their values now. + type = Contacts.ContactMethodsColumns.TYPE_CUSTOM; + label = typeString; + } + } + // We use "HOME" as default + if (type < 0) { + type = Contacts.ContactMethodsColumns.TYPE_HOME; + } + + // adr-value = 0*6(text-value ";") text-value + // ; PO Box, Extended Address, Street, Locality, Region, Postal + // ; Code, Country Name + String address; + List<String> list = propertyNode.propValue_vector; + int size = list.size(); + if (size > 1) { + StringBuilder builder = new StringBuilder(); + boolean builderIsEmpty = true; + if (Locale.getDefault().getCountry().equals(Locale.JAPAN.getCountry())) { + // In Japan, the order is reversed. + for (int i = size - 1; i >= 0; i--) { + String addressPart = list.get(i); + if (addressPart.length() > 0) { + if (!builderIsEmpty) { + builder.append(' '); + } + builder.append(addressPart); + builderIsEmpty = false; + } + } + } else { + for (int i = 0; i < size; i++) { + String addressPart = list.get(i); + if (addressPart.length() > 0) { + if (!builderIsEmpty) { + builder.append(' '); + } + builder.append(addressPart); + builderIsEmpty = false; + } + } + } + address = builder.toString().trim(); + } else { + address = propertyNode.propValue; + } + contact.addContactmethod(kind, type, address, label, isPrimary); + } else if (name.equals("ORG")) { + // vCard specification does not specify other types. + int type = Contacts.OrganizationColumns.TYPE_WORK; + String companyName = ""; + String positionName = ""; + boolean isPrimary = false; + + for (String typeString : propertyNode.paramMap_TYPE) { + if (typeString.equals("PREF") && !prefIsSetOrganization) { + // vCard specification officially does not have PREF in ORG. + // This is just for safety. + prefIsSetOrganization = true; + isPrimary = true; + } + // XXX: Should we cope with X- words? + } + + List<String> list = propertyNode.propValue_vector; + int size = list.size(); + if (size > 1) { + companyName = list.get(0); + StringBuilder builder = new StringBuilder(); + for (int i = 1; i < size; i++) { + builder.append(list.get(1)); + if (i != size - 1) { + builder.append(", "); + } + } + positionName = builder.toString(); + } else if (size == 1) { + companyName = propertyNode.propValue; + positionName = ""; + } + contact.addOrganization(type, companyName, positionName, isPrimary); + } else if (name.equals("TITLE")) { + contact.title = propertyNode.propValue; + // XXX: What to do this? Isn't ORG enough? + contact.addExtension(propertyNode); + } else if (name.equals("ROLE")) { + // XXX: What to do this? Isn't ORG enough? + contact.addExtension(propertyNode); + } else if (name.equals("PHOTO")) { + // We prefer PHOTO to LOGO. + String valueType = propertyNode.paramMap.getAsString("VALUE"); + if (valueType != null && valueType.equals("URL")) { + // TODO: do something. + } else { + // Assume PHOTO is stored in BASE64. In that case, + // data is already stored in propValue_bytes in binary form. + // It should be automatically done by VBuilder (VDataBuilder/VCardDatabuilder) + contact.photoBytes = propertyNode.propValue_bytes; + String type = propertyNode.paramMap.getAsString("TYPE"); + if (type != null) { + contact.photoType = type; + } + } + } else if (name.equals("LOGO")) { + // When PHOTO is not available this is not URL, + // we use this instead of PHOTO. + String valueType = propertyNode.paramMap.getAsString("VALUE"); + if (valueType != null && valueType.equals("URL")) { + // TODO: do something. + } else if (contact.photoBytes == null) { + contact.photoBytes = propertyNode.propValue_bytes; + String type = propertyNode.paramMap.getAsString("TYPE"); + if (type != null) { + contact.photoType = type; + } + } + } else if (name.equals("EMAIL")) { + int type = -1; + String label = null; + boolean isPrimary = false; + for (String typeString : propertyNode.paramMap_TYPE) { + if (typeString.equals("PREF") && !prefIsSetEmail) { + // Only first "PREF" is considered. + prefIsSetEmail = true; + isPrimary = true; + } else if (typeString.equalsIgnoreCase("HOME")) { + type = Contacts.ContactMethodsColumns.TYPE_HOME; + } else if (typeString.equalsIgnoreCase("WORK")) { + type = Contacts.ContactMethodsColumns.TYPE_WORK; + } else if (typeString.equalsIgnoreCase("CELL")) { + // We do not have Contacts.ContactMethodsColumns.TYPE_MOBILE yet. + type = Contacts.ContactMethodsColumns.TYPE_CUSTOM; + label = Contacts.ContactMethodsColumns.MOBILE_EMAIL_TYPE_NAME; + } else if (typeString.toUpperCase().startsWith("X-") && + type < 0) { + type = Contacts.ContactMethodsColumns.TYPE_CUSTOM; + label = typeString.substring(2); + } else if (type < 0) { + // vCard 3.0 allows iana-token. + // We may have INTERNET (specified in vCard spec), + // SCHOOL, etc. + type = Contacts.ContactMethodsColumns.TYPE_CUSTOM; + label = typeString; + } + } + // We use "OTHER" as default. + if (type < 0) { + type = Contacts.ContactMethodsColumns.TYPE_OTHER; + } + contact.addContactmethod(Contacts.KIND_EMAIL, + type, propertyNode.propValue,label, isPrimary); + } else if (name.equals("TEL")) { + int type = -1; + String label = null; + boolean isPrimary = false; + boolean isFax = false; + for (String typeString : propertyNode.paramMap_TYPE) { + if (typeString.equals("PREF") && !prefIsSetPhone) { + // Only first "PREF" is considered. + prefIsSetPhone = true; + isPrimary = true; + } else if (typeString.equalsIgnoreCase("HOME")) { + type = Contacts.PhonesColumns.TYPE_HOME; + } else if (typeString.equalsIgnoreCase("WORK")) { + type = Contacts.PhonesColumns.TYPE_WORK; + } else if (typeString.equalsIgnoreCase("CELL")) { + type = Contacts.PhonesColumns.TYPE_MOBILE; + } else if (typeString.equalsIgnoreCase("PAGER")) { + type = Contacts.PhonesColumns.TYPE_PAGER; + } else if (typeString.equalsIgnoreCase("FAX")) { + isFax = true; + } else if (typeString.equalsIgnoreCase("VOICE") || + typeString.equalsIgnoreCase("MSG")) { + // Defined in vCard 3.0. Ignore these because they + // conflict with "HOME", "WORK", etc. + // XXX: do something? + } else if (typeString.toUpperCase().startsWith("X-") && + type < 0) { + type = Contacts.PhonesColumns.TYPE_CUSTOM; + label = typeString.substring(2); + } else if (type < 0){ + // We may have MODEM, CAR, ISDN, etc... + type = Contacts.PhonesColumns.TYPE_CUSTOM; + label = typeString; + } + } + // We use "HOME" as default + if (type < 0) { + type = Contacts.PhonesColumns.TYPE_HOME; + } + if (isFax) { + if (type == Contacts.PhonesColumns.TYPE_HOME) { + type = Contacts.PhonesColumns.TYPE_FAX_HOME; + } else if (type == Contacts.PhonesColumns.TYPE_WORK) { + type = Contacts.PhonesColumns.TYPE_FAX_WORK; + } + } + + contact.addPhone(type, propertyNode.propValue, label, isPrimary); + } else if (name.equals("NOTE")) { + contact.notes.add(propertyNode.propValue); + } else if (name.equals("BDAY")) { + contact.addExtension(propertyNode); + } else if (name.equals("URL")) { + contact.addExtension(propertyNode); + } else if (name.equals("REV")) { + // Revision of this VCard entry. I think we can ignore this. + contact.addExtension(propertyNode); + } else if (name.equals("UID")) { + contact.addExtension(propertyNode); + } else if (name.equals("KEY")) { + // Type is X509 or PGP? I don't know how to handle this... + contact.addExtension(propertyNode); + } else if (name.equals("MAILER")) { + contact.addExtension(propertyNode); + } else if (name.equals("TZ")) { + contact.addExtension(propertyNode); + } else if (name.equals("GEO")) { + contact.addExtension(propertyNode); + } else if (name.equals("NICKNAME")) { + // vCard 3.0 only. + contact.addExtension(propertyNode); + } else if (name.equals("CLASS")) { + // vCard 3.0 only. + // e.g. CLASS:CONFIDENTIAL + contact.addExtension(propertyNode); + } else if (name.equals("PROFILE")) { + // VCard 3.0 only. Must be "VCARD". I think we can ignore this. + contact.addExtension(propertyNode); + } else if (name.equals("CATEGORIES")) { + // VCard 3.0 only. + // e.g. CATEGORIES:INTERNET,IETF,INDUSTRY,INFORMATION TECHNOLOGY + contact.addExtension(propertyNode); + } else if (name.equals("SOURCE")) { + // VCard 3.0 only. + contact.addExtension(propertyNode); + } else if (name.equals("PRODID")) { + // VCard 3.0 only. + // To specify the identifier for the product that created + // the vCard object. + contact.addExtension(propertyNode); + } else if (name.equals("X-PHONETIC-FIRST-NAME")) { + xPhoneticFirstName = propertyNode.propValue; + } else if (name.equals("X-PHONETIC-MIDDLE-NAME")) { + xPhoneticMiddleName = propertyNode.propValue; + } else if (name.equals("X-PHONETIC-LAST-NAME")) { + xPhoneticLastName = propertyNode.propValue; + } else { + // Unknown X- words and IANA token. + contact.addExtension(propertyNode); + } + } + + if (fullName != null) { + contact.name = fullName; + } else if(nameFromNProperty != null) { + contact.name = nameFromNProperty; + } else { + contact.name = ""; + } + + if (contact.phoneticName == null && + (xPhoneticFirstName != null || xPhoneticMiddleName != null || + xPhoneticLastName != null)) { + // Note: In Europe, this order should be "LAST FIRST MIDDLE". See the comment around + // NAME_ORDER_TYPE_* for more detail. + String first; + String second; + if (nameOrderType == NAME_ORDER_TYPE_JAPANESE) { + first = xPhoneticLastName; + second = xPhoneticFirstName; + } else { + first = xPhoneticFirstName; + second = xPhoneticLastName; + } + StringBuilder builder = new StringBuilder(); + if (first != null) { + builder.append(first); + } + if (xPhoneticMiddleName != null) { + builder.append(xPhoneticMiddleName); + } + if (second != null) { + builder.append(second); + } + contact.phoneticName = builder.toString(); + } + + // Remove unnecessary white spaces. + // It is found that some mobile phone emits phonetic name with just one white space + // when a user does not specify one. + // This logic is effective toward such kind of weird data. + if (contact.phoneticName != null) { + contact.phoneticName = contact.phoneticName.trim(); + } + + // If there is no "PREF", we choose the first entries as primary. + if (!prefIsSetPhone && + contact.phoneList != null && + contact.phoneList.size() > 0) { + contact.phoneList.get(0).isPrimary = true; + } + + if (!prefIsSetAddress && contact.contactmethodList != null) { + for (ContactMethod contactMethod : contact.contactmethodList) { + if (contactMethod.kind == Contacts.KIND_POSTAL) { + contactMethod.isPrimary = true; + break; + } + } + } + if (!prefIsSetEmail && contact.contactmethodList != null) { + for (ContactMethod contactMethod : contact.contactmethodList) { + if (contactMethod.kind == Contacts.KIND_EMAIL) { + contactMethod.isPrimary = true; + break; + } + } + } + if (!prefIsSetOrganization && + contact.organizationList != null && + contact.organizationList.size() > 0) { + contact.organizationList.get(0).isPrimary = true; + } + + return contact; + } + + public String displayString() { + if (name.length() > 0) { + return name; + } + if (contactmethodList != null && contactmethodList.size() > 0) { + for (ContactMethod contactMethod : contactmethodList) { + if (contactMethod.kind == Contacts.KIND_EMAIL && contactMethod.isPrimary) { + return contactMethod.data; + } + } + } + if (phoneList != null && phoneList.size() > 0) { + for (PhoneData phoneData : phoneList) { + if (phoneData.isPrimary) { + return phoneData.data; + } + } + } + return ""; + } + + private void pushIntoContentProviderOrResolver(Object contentSomething, + long myContactsGroupId) { + ContentResolver resolver = null; + AbstractSyncableContentProvider provider = null; + if (contentSomething instanceof ContentResolver) { + resolver = (ContentResolver)contentSomething; + } else if (contentSomething instanceof AbstractSyncableContentProvider) { + provider = (AbstractSyncableContentProvider)contentSomething; + } else { + Log.e(LOG_TAG, "Unsupported object came."); + return; + } + + ContentValues contentValues = new ContentValues(); + contentValues.put(People.NAME, name); + contentValues.put(People.PHONETIC_NAME, phoneticName); + + if (notes.size() > 1) { + StringBuilder builder = new StringBuilder(); + for (String note : notes) { + builder.append(note); + builder.append("\n"); + } + contentValues.put(People.NOTES, builder.toString()); + } else if (notes.size() == 1){ + contentValues.put(People.NOTES, notes.get(0)); + } + + Uri personUri; + long personId = 0; + if (resolver != null) { + personUri = Contacts.People.createPersonInMyContactsGroup( + resolver, contentValues); + if (personUri != null) { + personId = ContentUris.parseId(personUri); + } + } else { + personUri = provider.insert(People.CONTENT_URI, contentValues); + if (personUri != null) { + personId = ContentUris.parseId(personUri); + ContentValues values = new ContentValues(); + values.put(GroupMembership.PERSON_ID, personId); + values.put(GroupMembership.GROUP_ID, myContactsGroupId); + Uri resultUri = provider.insert(GroupMembership.CONTENT_URI, values); + if (resultUri == null) { + Log.e(LOG_TAG, "Faild to insert the person to MyContact."); + provider.delete(personUri, null, null); + personUri = null; + } + } + } + + if (personUri == null) { + Log.e(LOG_TAG, "Failed to create the contact."); + return; + } + + if (photoBytes != null) { + if (resolver != null) { + People.setPhotoData(resolver, personUri, photoBytes); + } else { + Uri photoUri = Uri.withAppendedPath(personUri, Contacts.Photos.CONTENT_DIRECTORY); + ContentValues values = new ContentValues(); + values.put(Photos.DATA, photoBytes); + provider.update(photoUri, values, null, null); + } + } + + long primaryPhoneId = -1; + if (phoneList != null && phoneList.size() > 0) { + for (PhoneData phoneData : phoneList) { + ContentValues values = new ContentValues(); + values.put(Contacts.PhonesColumns.TYPE, phoneData.type); + if (phoneData.type == Contacts.PhonesColumns.TYPE_CUSTOM) { + values.put(Contacts.PhonesColumns.LABEL, phoneData.label); + } + // Already formatted. + values.put(Contacts.PhonesColumns.NUMBER, phoneData.data); + + // Not sure about Contacts.PhonesColumns.NUMBER_KEY ... + values.put(Contacts.PhonesColumns.ISPRIMARY, 1); + values.put(Contacts.Phones.PERSON_ID, personId); + Uri phoneUri; + if (resolver != null) { + phoneUri = resolver.insert(Phones.CONTENT_URI, values); + } else { + phoneUri = provider.insert(Phones.CONTENT_URI, values); + } + if (phoneData.isPrimary) { + primaryPhoneId = Long.parseLong(phoneUri.getLastPathSegment()); + } + } + } + + long primaryOrganizationId = -1; + if (organizationList != null && organizationList.size() > 0) { + for (OrganizationData organizationData : organizationList) { + ContentValues values = new ContentValues(); + // Currently, we do not use TYPE_CUSTOM. + values.put(Contacts.OrganizationColumns.TYPE, + organizationData.type); + values.put(Contacts.OrganizationColumns.COMPANY, + organizationData.companyName); + values.put(Contacts.OrganizationColumns.TITLE, + organizationData.positionName); + values.put(Contacts.OrganizationColumns.ISPRIMARY, 1); + values.put(Contacts.OrganizationColumns.PERSON_ID, personId); + + Uri organizationUri; + if (resolver != null) { + organizationUri = resolver.insert(Organizations.CONTENT_URI, values); + } else { + organizationUri = provider.insert(Organizations.CONTENT_URI, values); + } + if (organizationData.isPrimary) { + primaryOrganizationId = Long.parseLong(organizationUri.getLastPathSegment()); + } + } + } + + long primaryEmailId = -1; + if (contactmethodList != null && contactmethodList.size() > 0) { + for (ContactMethod contactMethod : contactmethodList) { + ContentValues values = new ContentValues(); + values.put(Contacts.ContactMethodsColumns.KIND, contactMethod.kind); + values.put(Contacts.ContactMethodsColumns.TYPE, contactMethod.type); + if (contactMethod.type == Contacts.ContactMethodsColumns.TYPE_CUSTOM) { + values.put(Contacts.ContactMethodsColumns.LABEL, contactMethod.label); + } + values.put(Contacts.ContactMethodsColumns.DATA, contactMethod.data); + values.put(Contacts.ContactMethodsColumns.ISPRIMARY, 1); + values.put(Contacts.ContactMethods.PERSON_ID, personId); + + if (contactMethod.kind == Contacts.KIND_EMAIL) { + Uri emailUri; + if (resolver != null) { + emailUri = resolver.insert(ContactMethods.CONTENT_URI, values); + } else { + emailUri = provider.insert(ContactMethods.CONTENT_URI, values); + } + if (contactMethod.isPrimary) { + primaryEmailId = Long.parseLong(emailUri.getLastPathSegment()); + } + } else { // probably KIND_POSTAL + if (resolver != null) { + resolver.insert(ContactMethods.CONTENT_URI, values); + } else { + provider.insert(ContactMethods.CONTENT_URI, values); + } + } + } + } + + if (extensionMap != null && extensionMap.size() > 0) { + ArrayList<ContentValues> contentValuesArray; + if (resolver != null) { + contentValuesArray = new ArrayList<ContentValues>(); + } else { + contentValuesArray = null; + } + for (Entry<String, List<String>> entry : extensionMap.entrySet()) { + String key = entry.getKey(); + List<String> list = entry.getValue(); + for (String value : list) { + ContentValues values = new ContentValues(); + values.put(Extensions.NAME, key); + values.put(Extensions.VALUE, value); + values.put(Extensions.PERSON_ID, personId); + if (resolver != null) { + contentValuesArray.add(values); + } else { + provider.insert(Extensions.CONTENT_URI, values); + } + } + } + if (resolver != null) { + resolver.bulkInsert(Extensions.CONTENT_URI, + contentValuesArray.toArray(new ContentValues[0])); + } + } + + if (primaryPhoneId >= 0 || primaryOrganizationId >= 0 || primaryEmailId >= 0) { + ContentValues values = new ContentValues(); + if (primaryPhoneId >= 0) { + values.put(People.PRIMARY_PHONE_ID, primaryPhoneId); + } + if (primaryOrganizationId >= 0) { + values.put(People.PRIMARY_ORGANIZATION_ID, primaryOrganizationId); + } + if (primaryEmailId >= 0) { + values.put(People.PRIMARY_EMAIL_ID, primaryEmailId); + } + if (resolver != null) { + resolver.update(personUri, values, null, null); + } else { + provider.update(personUri, values, null, null); + } + } + } + + /** + * Push this object into database in the resolver. + */ + public void pushIntoContentResolver(ContentResolver resolver) { + pushIntoContentProviderOrResolver(resolver, 0); + } + + /** + * Push this object into AbstractSyncableContentProvider object. + */ + public void pushIntoAbstractSyncableContentProvider( + AbstractSyncableContentProvider provider, long myContactsGroupId) { + boolean successful = false; + provider.beginBatch(); + try { + pushIntoContentProviderOrResolver(provider, myContactsGroupId); + successful = true; + } finally { + provider.endBatch(successful); + } + } + + public boolean isIgnorable() { + return TextUtils.isEmpty(name) && + TextUtils.isEmpty(phoneticName) && + (phoneList == null || phoneList.size() == 0) && + (contactmethodList == null || contactmethodList.size() == 0); } } diff --git a/core/java/android/syncml/pim/vcard/VCardComposer.java b/core/java/android/syncml/pim/vcard/VCardComposer.java index 05e8f40..192736a 100644 --- a/core/java/android/syncml/pim/vcard/VCardComposer.java +++ b/core/java/android/syncml/pim/vcard/VCardComposer.java @@ -124,9 +124,9 @@ public class VCardComposer { mResult.append("ORG:").append(struct.company).append(mNewline); } - if (!isNull(struct.notes)) { + if (struct.notes.size() > 0 && !isNull(struct.notes.get(0))) { mResult.append("NOTE:").append( - foldingString(struct.notes, vcardversion)).append(mNewline); + foldingString(struct.notes.get(0), vcardversion)).append(mNewline); } if (!isNull(struct.title)) { @@ -190,7 +190,7 @@ public class VCardComposer { */ private void appendPhotoStr(byte[] bytes, String type, int version) throws VCardException { - String value, apptype, encodingStr; + String value, encodingStr; try { value = foldingString(new String(Base64.encodeBase64(bytes, true)), version); @@ -198,20 +198,23 @@ public class VCardComposer { throw new VCardException(e.getMessage()); } - if (isNull(type)) { - type = "image/jpeg"; - } - if (type.indexOf("jpeg") > 0) { - apptype = "JPEG"; - } else if (type.indexOf("gif") > 0) { - apptype = "GIF"; - } else if (type.indexOf("bmp") > 0) { - apptype = "BMP"; + if (isNull(type) || type.toUpperCase().indexOf("JPEG") >= 0) { + type = "JPEG"; + } else if (type.toUpperCase().indexOf("GIF") >= 0) { + type = "GIF"; + } else if (type.toUpperCase().indexOf("BMP") >= 0) { + type = "BMP"; } else { - apptype = type.substring(type.indexOf("/")).toUpperCase(); + // Handle the string like "image/tiff". + int indexOfSlash = type.indexOf("/"); + if (indexOfSlash >= 0) { + type = type.substring(indexOfSlash + 1).toUpperCase(); + } else { + type = type.toUpperCase(); + } } - mResult.append("LOGO;TYPE=").append(apptype); + mResult.append("LOGO;TYPE=").append(type); if (version == VERSION_VCARD21_INT) { encodingStr = ";ENCODING=BASE64:"; value = value + mNewline; @@ -281,7 +284,7 @@ public class VCardComposer { private String getPhoneTypeStr(PhoneData phone) { - int phoneType = Integer.parseInt(phone.type); + int phoneType = phone.type; String typeStr, label; if (phoneTypeMap.containsKey(phoneType)) { @@ -308,7 +311,7 @@ public class VCardComposer { String joinMark = version == VERSION_VCARD21_INT ? ";" : ","; for (ContactStruct.ContactMethod contactMethod : contactMList) { // same with v2.1 and v3.0 - switch (Integer.parseInt(contactMethod.kind)) { + switch (contactMethod.kind) { case Contacts.KIND_EMAIL: String mailType = "INTERNET"; if (!isNull(contactMethod.data)) { diff --git a/core/java/android/syncml/pim/vcard/VCardDataBuilder.java b/core/java/android/syncml/pim/vcard/VCardDataBuilder.java new file mode 100644 index 0000000..a0513f1 --- /dev/null +++ b/core/java/android/syncml/pim/vcard/VCardDataBuilder.java @@ -0,0 +1,442 @@ +/* + * Copyright (C) 2007 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.syncml.pim.vcard; + +import android.app.ProgressDialog; +import android.content.AbstractSyncableContentProvider; +import android.content.ContentProvider; +import android.content.ContentResolver; +import android.content.ContentValues; +import android.content.IContentProvider; +import android.os.Handler; +import android.provider.Contacts; +import android.syncml.pim.PropertyNode; +import android.syncml.pim.VBuilder; +import android.syncml.pim.VNode; +import android.syncml.pim.VParser; +import android.util.CharsetUtils; +import android.util.Log; + +import org.apache.commons.codec.DecoderException; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.codec.net.QuotedPrintableCodec; + +import java.io.UnsupportedEncodingException; +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.List; + +/** + * VBuilder for VCard. VCard may contain big photo images encoded by BASE64, + * If we store all VNode entries in memory like VDataBuilder.java, + * OutOfMemoryError may be thrown. Thus, this class push each VCard entry into + * ContentResolver immediately. + */ +public class VCardDataBuilder implements VBuilder { + static private String LOG_TAG = "VCardDataBuilder"; + + /** + * If there's no other information available, this class uses this charset for encoding + * byte arrays. + */ + static public String DEFAULT_CHARSET = "UTF-8"; + + private class ProgressShower implements Runnable { + private ContactStruct mContact; + + public ProgressShower(ContactStruct contact) { + mContact = contact; + } + + public void run () { + mProgressDialog.setMessage(mProgressMessage + "\n" + + mContact.displayString()); + } + } + + /** type=VNode */ + private VNode mCurrentVNode; + private PropertyNode mCurrentPropNode; + private String mCurrentParamType; + + /** + * The charset using which VParser parses the text. + */ + private String mSourceCharset; + + /** + * The charset with which byte array is encoded to String. + */ + private String mTargetCharset; + private boolean mStrictLineBreakParsing; + private ContentResolver mContentResolver; + + // For letting VCardDataBuilder show the display name of VCard while handling it. + private Handler mHandler; + private ProgressDialog mProgressDialog; + private String mProgressMessage; + private Runnable mOnProgressRunnable; + private boolean mLastNameComesBeforeFirstName; + + // Just for testing. + private long mTimeCreateContactStruct; + private long mTimePushIntoContentResolver; + + // Ideally, this should be ContactsProvider but it seems Class loader cannot find it, + // even when it is subclass of ContactsProvider... + private AbstractSyncableContentProvider mProvider; + private long mMyContactsGroupId; + + public VCardDataBuilder(ContentResolver resolver) { + mTargetCharset = DEFAULT_CHARSET; + mContentResolver = resolver; + } + + /** + * Constructor which requires minimum requiredvariables. + * + * @param resolver insert each data into this ContentResolver + * @param progressDialog + * @param progressMessage + * @param handler if this importer works on the different thread than main one, + * set appropriate handler object. If not, it is ok to set this null. + */ + public VCardDataBuilder(ContentResolver resolver, + ProgressDialog progressDialog, + String progressMessage, + Handler handler) { + this(resolver, progressDialog, progressMessage, handler, + null, null, false, false); + } + + public VCardDataBuilder(ContentResolver resolver, + ProgressDialog progressDialog, + String progressMessage, + Handler handler, + String charset, + boolean strictLineBreakParsing, + boolean lastNameComesBeforeFirstName) { + this(resolver, progressDialog, progressMessage, handler, + null, charset, strictLineBreakParsing, + lastNameComesBeforeFirstName); + } + + /** + * @hide + */ + public VCardDataBuilder(ContentResolver resolver, + ProgressDialog progressDialog, + String progressMessage, + Handler handler, + String sourceCharset, + String targetCharset, + boolean strictLineBreakParsing, + boolean lastNameComesBeforeFirstName) { + if (sourceCharset != null) { + mSourceCharset = sourceCharset; + } else { + mSourceCharset = VParser.DEFAULT_CHARSET; + } + if (targetCharset != null) { + mTargetCharset = targetCharset; + } else { + mTargetCharset = DEFAULT_CHARSET; + } + mContentResolver = resolver; + mStrictLineBreakParsing = strictLineBreakParsing; + mHandler = handler; + mProgressDialog = progressDialog; + mProgressMessage = progressMessage; + mLastNameComesBeforeFirstName = lastNameComesBeforeFirstName; + + tryGetOriginalProvider(); + } + + private void tryGetOriginalProvider() { + final ContentResolver resolver = mContentResolver; + + if ((mMyContactsGroupId = Contacts.People.tryGetMyContactsGroupId(resolver)) == 0) { + Log.e(LOG_TAG, "Could not get group id of MyContact"); + return; + } + + IContentProvider iProviderForName = resolver.acquireProvider(Contacts.CONTENT_URI); + ContentProvider contentProvider = + ContentProvider.coerceToLocalContentProvider(iProviderForName); + if (contentProvider == null) { + Log.e(LOG_TAG, "Fail to get ContentProvider object."); + return; + } + + if (!(contentProvider instanceof AbstractSyncableContentProvider)) { + Log.e(LOG_TAG, + "Acquired ContentProvider object is not AbstractSyncableContentProvider."); + return; + } + + mProvider = (AbstractSyncableContentProvider)contentProvider; + } + + public void setOnProgressRunnable(Runnable runnable) { + mOnProgressRunnable = runnable; + } + + public void start() { + } + + public void end() { + } + + /** + * Assume that VCard is not nested. In other words, this code does not accept + */ + public void startRecord(String type) { + if (mCurrentVNode != null) { + // This means startRecord() is called inside startRecord() - endRecord() block. + // TODO: should throw some Exception + Log.e(LOG_TAG, "Nested VCard code is not supported now."); + } + mCurrentVNode = new VNode(); + mCurrentVNode.parseStatus = 1; + mCurrentVNode.VName = type; + } + + public void endRecord() { + mCurrentVNode.parseStatus = 0; + long start = System.currentTimeMillis(); + ContactStruct contact = ContactStruct.constructContactFromVNode(mCurrentVNode, + mLastNameComesBeforeFirstName ? ContactStruct.NAME_ORDER_TYPE_JAPANESE : + ContactStruct.NAME_ORDER_TYPE_ENGLISH); + mTimeCreateContactStruct += System.currentTimeMillis() - start; + if (!contact.isIgnorable()) { + if (mProgressDialog != null && mProgressMessage != null) { + if (mHandler != null) { + mHandler.post(new ProgressShower(contact)); + } else { + mProgressDialog.setMessage(mProgressMessage + "\n" + + contact.displayString()); + } + } + start = System.currentTimeMillis(); + if (mProvider != null) { + contact.pushIntoAbstractSyncableContentProvider( + mProvider, mMyContactsGroupId); + } else { + contact.pushIntoContentResolver(mContentResolver); + } + mTimePushIntoContentResolver += System.currentTimeMillis() - start; + } + if (mOnProgressRunnable != null) { + mOnProgressRunnable.run(); + } + mCurrentVNode = null; + } + + public void startProperty() { + mCurrentPropNode = new PropertyNode(); + } + + public void endProperty() { + mCurrentVNode.propList.add(mCurrentPropNode); + mCurrentPropNode = null; + } + + public void propertyName(String name) { + mCurrentPropNode.propName = name; + } + + public void propertyGroup(String group) { + mCurrentPropNode.propGroupSet.add(group); + } + + public void propertyParamType(String type) { + mCurrentParamType = type; + } + + public void propertyParamValue(String value) { + if (mCurrentParamType == null || + mCurrentParamType.equalsIgnoreCase("TYPE")) { + mCurrentPropNode.paramMap_TYPE.add(value); + } else { + mCurrentPropNode.paramMap.put(mCurrentParamType, value); + } + + mCurrentParamType = null; + } + + private String encodeString(String originalString, String targetCharset) { + if (mSourceCharset.equalsIgnoreCase(targetCharset)) { + return originalString; + } + Charset charset = Charset.forName(mSourceCharset); + ByteBuffer byteBuffer = charset.encode(originalString); + // byteBuffer.array() "may" return byte array which is larger than + // byteBuffer.remaining(). Here, we keep on the safe side. + byte[] bytes = new byte[byteBuffer.remaining()]; + byteBuffer.get(bytes); + try { + return new String(bytes, targetCharset); + } catch (UnsupportedEncodingException e) { + Log.e(LOG_TAG, "Failed to encode: charset=" + targetCharset); + return new String(bytes); + } + } + + private String handleOneValue(String value, String targetCharset, String encoding) { + if (encoding != null) { + if (encoding.equals("BASE64") || encoding.equals("B")) { + mCurrentPropNode.propValue_bytes = + Base64.decodeBase64(value.getBytes()); + return value; + } else if (encoding.equals("QUOTED-PRINTABLE")) { + // "= " -> " ", "=\t" -> "\t". + // Previous code had done this replacement. Keep on the safe side. + StringBuilder builder = new StringBuilder(); + int length = value.length(); + for (int i = 0; i < length; i++) { + char ch = value.charAt(i); + if (ch == '=' && i < length - 1) { + char nextCh = value.charAt(i + 1); + if (nextCh == ' ' || nextCh == '\t') { + + builder.append(nextCh); + i++; + continue; + } + } + builder.append(ch); + } + String quotedPrintable = builder.toString(); + + String[] lines; + if (mStrictLineBreakParsing) { + lines = quotedPrintable.split("\r\n"); + } else { + builder = new StringBuilder(); + length = quotedPrintable.length(); + ArrayList<String> list = new ArrayList<String>(); + for (int i = 0; i < length; i++) { + char ch = quotedPrintable.charAt(i); + if (ch == '\n') { + list.add(builder.toString()); + builder = new StringBuilder(); + } else if (ch == '\r') { + list.add(builder.toString()); + builder = new StringBuilder(); + if (i < length - 1) { + char nextCh = quotedPrintable.charAt(i + 1); + if (nextCh == '\n') { + i++; + } + } + } else { + builder.append(ch); + } + } + String finalLine = builder.toString(); + if (finalLine.length() > 0) { + list.add(finalLine); + } + lines = list.toArray(new String[0]); + } + + builder = new StringBuilder(); + for (String line : lines) { + if (line.endsWith("=")) { + line = line.substring(0, line.length() - 1); + } + builder.append(line); + } + byte[] bytes; + try { + bytes = builder.toString().getBytes(mSourceCharset); + } catch (UnsupportedEncodingException e1) { + Log.e(LOG_TAG, "Failed to encode: charset=" + mSourceCharset); + bytes = builder.toString().getBytes(); + } + + try { + bytes = QuotedPrintableCodec.decodeQuotedPrintable(bytes); + } catch (DecoderException e) { + Log.e(LOG_TAG, "Failed to decode quoted-printable: " + e); + return ""; + } + + try { + return new String(bytes, targetCharset); + } catch (UnsupportedEncodingException e) { + Log.e(LOG_TAG, "Failed to encode: charset=" + targetCharset); + return new String(bytes); + } + } + // Unknown encoding. Fall back to default. + } + return encodeString(value, targetCharset); + } + + public void propertyValues(List<String> values) { + if (values == null || values.size() == 0) { + mCurrentPropNode.propValue_bytes = null; + mCurrentPropNode.propValue_vector.clear(); + mCurrentPropNode.propValue_vector.add(""); + mCurrentPropNode.propValue = ""; + return; + } + + ContentValues paramMap = mCurrentPropNode.paramMap; + + String targetCharset = CharsetUtils.nameForDefaultVendor(paramMap.getAsString("CHARSET")); + String encoding = paramMap.getAsString("ENCODING"); + + if (targetCharset == null || targetCharset.length() == 0) { + targetCharset = mTargetCharset; + } + + for (String value : values) { + mCurrentPropNode.propValue_vector.add( + handleOneValue(value, targetCharset, encoding)); + } + + mCurrentPropNode.propValue = listToString(mCurrentPropNode.propValue_vector); + } + + public void showDebugInfo() { + Log.d(LOG_TAG, "time for creating ContactStruct: " + mTimeCreateContactStruct + " ms"); + Log.d(LOG_TAG, "time for insert ContactStruct to database: " + + mTimePushIntoContentResolver + " ms"); + } + + private String listToString(List<String> list){ + int size = list.size(); + if (size > 1) { + StringBuilder builder = new StringBuilder(); + int i = 0; + for (String type : list) { + builder.append(type); + if (i < size - 1) { + builder.append(";"); + } + } + return builder.toString(); + } else if (size == 1) { + return list.get(0); + } else { + return ""; + } + } +} diff --git a/core/java/android/syncml/pim/vcard/VCardEntryCounter.java b/core/java/android/syncml/pim/vcard/VCardEntryCounter.java new file mode 100644 index 0000000..03cd1d9 --- /dev/null +++ b/core/java/android/syncml/pim/vcard/VCardEntryCounter.java @@ -0,0 +1,63 @@ +/* + * 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.syncml.pim.vcard; + +import java.util.List; + +import android.syncml.pim.VBuilder; + +public class VCardEntryCounter implements VBuilder { + private int mCount; + + public int getCount() { + return mCount; + } + + public void start() { + } + + public void end() { + } + + public void startRecord(String type) { + } + + public void endRecord() { + mCount++; + } + + public void startProperty() { + } + + public void endProperty() { + } + + public void propertyGroup(String group) { + } + + public void propertyName(String name) { + } + + public void propertyParamType(String type) { + } + + public void propertyParamValue(String value) { + } + + public void propertyValues(List<String> values) { + } +}
\ No newline at end of file diff --git a/core/java/android/syncml/pim/vcard/VCardNestedException.java b/core/java/android/syncml/pim/vcard/VCardNestedException.java new file mode 100644 index 0000000..def6f3b --- /dev/null +++ b/core/java/android/syncml/pim/vcard/VCardNestedException.java @@ -0,0 +1,27 @@ +/* + * 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.syncml.pim.vcard; + +/** + * VCardException thrown when VCard is nested without VCardParser's being notified. + */ +public class VCardNestedException extends VCardException { + public VCardNestedException() {} + public VCardNestedException(String message) { + super(message); + } +} diff --git a/core/java/android/syncml/pim/vcard/VCardParser_V21.java b/core/java/android/syncml/pim/vcard/VCardParser_V21.java index f853c5e..d865668 100644 --- a/core/java/android/syncml/pim/vcard/VCardParser_V21.java +++ b/core/java/android/syncml/pim/vcard/VCardParser_V21.java @@ -17,21 +17,26 @@ package android.syncml.pim.vcard; import android.syncml.pim.VBuilder; +import android.syncml.pim.VParser; +import android.util.Log; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.io.Reader; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; -import java.util.regex.Pattern; /** - * This class is used to parse vcard. Please refer to vCard Specification 2.1 + * This class is used to parse vcard. Please refer to vCard Specification 2.1. */ public class VCardParser_V21 { - + private static final String LOG_TAG = "VCardParser_V21"; + + public static final String DEFAULT_CHARSET = VParser.DEFAULT_CHARSET; + /** Store the known-type */ private static final HashSet<String> sKnownTypeSet = new HashSet<String>( Arrays.asList("DOM", "INTL", "POSTAL", "PARCEL", "HOME", "WORK", @@ -42,19 +47,17 @@ public class VCardParser_V21 { "CGM", "WMF", "BMP", "MET", "PMB", "DIB", "PICT", "TIFF", "PDF", "PS", "JPEG", "QTIME", "MPEG", "MPEG2", "AVI", "WAVE", "AIFF", "PCM", "X509", "PGP")); - + /** Store the known-value */ private static final HashSet<String> sKnownValueSet = new HashSet<String>( Arrays.asList("INLINE", "URL", "CONTENT-ID", "CID")); - /** Store the property name available in vCard 2.1 */ - // NICKNAME is not supported in vCard 2.1, but some vCard may contain. + /** Store the property names available in vCard 2.1 */ private static final HashSet<String> sAvailablePropertyNameV21 = new HashSet<String>(Arrays.asList( - "LOGO", "PHOTO", "LABEL", "FN", "TITLE", "SOUND", + "BEGIN", "LOGO", "PHOTO", "LABEL", "FN", "TITLE", "SOUND", "VERSION", "TEL", "EMAIL", "TZ", "GEO", "NOTE", "URL", - "BDAY", "ROLE", "REV", "UID", "KEY", "MAILER", - "NICKNAME")); + "BDAY", "ROLE", "REV", "UID", "KEY", "MAILER")); // Though vCard 2.1 specification does not allow "B" encoding, some data may have it. // We allow it for safety... @@ -76,6 +79,30 @@ public class VCardParser_V21 { // Should not directly read a line from this. Use getLine() instead. protected BufferedReader mReader; + private boolean mCanceled; + + // In some cases, vCard is nested. Currently, we only consider the most interior vCard data. + // See v21_foma_1.vcf in test directory for more information. + private int mNestCount; + + // In order to reduce warning message as much as possible, we hold the value which made Logger + // emit a warning message. + protected HashSet<String> mWarningValueMap = new HashSet<String>(); + + // Just for debugging + private long mTimeTotal; + private long mTimeStartRecord; + private long mTimeEndRecord; + private long mTimeStartProperty; + private long mTimeEndProperty; + private long mTimeParseItems; + private long mTimeParseItem1; + private long mTimeParseItem2; + private long mTimeParseItem3; + private long mTimeHandlePropertyValue1; + private long mTimeHandlePropertyValue2; + private long mTimeHandlePropertyValue3; + /** * Create a new VCard parser. */ @@ -83,12 +110,35 @@ public class VCardParser_V21 { super(); } + public VCardParser_V21(VCardSourceDetector detector) { + super(); + if (detector != null && detector.getType() == VCardSourceDetector.TYPE_FOMA) { + mNestCount = 1; + } + } + /** * Parse the file at the given position * vcard_file = [wsls] vcard [wsls] */ protected void parseVCardFile() throws IOException, VCardException { - while (parseOneVCard()) { + boolean firstReading = true; + while (true) { + if (mCanceled) { + break; + } + if (!parseOneVCard(firstReading)) { + break; + } + firstReading = false; + } + + if (mNestCount > 0) { + boolean useCache = true; + for (int i = 0; i < mNestCount; i++) { + readEndVCard(useCache, true); + useCache = false; + } } } @@ -100,7 +150,13 @@ public class VCardParser_V21 { * @return true when the propertyName is a valid property name. */ protected boolean isValidPropertyName(String propertyName) { - return sAvailablePropertyNameV21.contains(propertyName.toUpperCase()); + if (!(sAvailablePropertyNameV21.contains(propertyName.toUpperCase()) || + propertyName.startsWith("X-")) && + !mWarningValueMap.contains(propertyName)) { + mWarningValueMap.add(propertyName); + Log.w(LOG_TAG, "Property name unsupported by vCard 2.1: " + propertyName); + } + return true; } /** @@ -129,7 +185,7 @@ public class VCardParser_V21 { line = getLine(); if (line == null) { throw new VCardException("Reached end of buffer."); - } else if (line.trim().length() > 0) { + } else if (line.trim().length() > 0) { return line; } } @@ -140,12 +196,37 @@ public class VCardParser_V21 { * items *CRLF * "END" [ws] ":" [ws] "VCARD" */ - private boolean parseOneVCard() throws IOException, VCardException { - if (!readBeginVCard()) { + private boolean parseOneVCard(boolean firstReading) throws IOException, VCardException { + boolean allowGarbage = false; + if (firstReading) { + if (mNestCount > 0) { + for (int i = 0; i < mNestCount; i++) { + if (!readBeginVCard(allowGarbage)) { + return false; + } + allowGarbage = true; + } + } + } + + if (!readBeginVCard(allowGarbage)) { return false; } + long start; + if (mBuilder != null) { + start = System.currentTimeMillis(); + mBuilder.startRecord("VCARD"); + mTimeStartRecord += System.currentTimeMillis() - start; + } + start = System.currentTimeMillis(); parseItems(); - readEndVCard(); + mTimeParseItems += System.currentTimeMillis() - start; + readEndVCard(true, false); + if (mBuilder != null) { + start = System.currentTimeMillis(); + mBuilder.endRecord(); + mTimeEndRecord += System.currentTimeMillis() - start; + } return true; } @@ -154,46 +235,102 @@ public class VCardParser_V21 { * @throws IOException * @throws VCardException */ - protected boolean readBeginVCard() throws IOException, VCardException { + protected boolean readBeginVCard(boolean allowGarbage) + throws IOException, VCardException { String line; - while (true) { - line = getLine(); - if (line == null) { - return false; - } else if (line.trim().length() > 0) { - break; + do { + while (true) { + line = getLine(); + if (line == null) { + return false; + } else if (line.trim().length() > 0) { + break; + } } - } - String[] strArray = line.split(":", 2); - - // Though vCard specification does not allow lower cases, - // some data may have them, so we allow it. - if (!(strArray.length == 2 && - strArray[0].trim().equalsIgnoreCase("BEGIN") && - strArray[1].trim().equalsIgnoreCase("VCARD"))) { - throw new VCardException("BEGIN:VCARD != \"" + line + "\""); - } - - if (mBuilder != null) { - mBuilder.startRecord("VCARD"); - } + String[] strArray = line.split(":", 2); + int length = strArray.length; - return true; + // Though vCard 2.1/3.0 specification does not allow lower cases, + // some data may have them, so we allow it (Actually, previous code + // had explicitly allowed "BEGIN:vCard" though there's no example). + // + // TODO: ignore non vCard entry (e.g. vcalendar). + // XXX: Not sure, but according to VDataBuilder.java, vcalendar + // entry + // may be nested. Just seeking "END:SOMETHING" may not be enough. + // e.g. + // BEGIN:VCARD + // ... (Valid. Must parse this) + // END:VCARD + // BEGIN:VSOMETHING + // ... (Must ignore this) + // BEGIN:VSOMETHING2 + // ... (Must ignore this) + // END:VSOMETHING2 + // ... (Must ignore this!) + // END:VSOMETHING + // BEGIN:VCARD + // ... (Valid. Must parse this) + // END:VCARD + // INVALID_STRING (VCardException should be thrown) + if (length == 2 && + strArray[0].trim().equalsIgnoreCase("BEGIN") && + strArray[1].trim().equalsIgnoreCase("VCARD")) { + return true; + } else if (!allowGarbage) { + if (mNestCount > 0) { + mPreviousLine = line; + return false; + } else { + throw new VCardException( + "Expected String \"BEGIN:VCARD\" did not come " + + "(Instead, \"" + line + "\" came)"); + } + } + } while(allowGarbage); + + throw new VCardException("Reached where must not be reached."); } - - protected void readEndVCard() throws VCardException { - // Though vCard specification does not allow lower cases, - // some data may have them, so we allow it. - String[] strArray = mPreviousLine.split(":", 2); - if (!(strArray.length == 2 && - strArray[0].trim().equalsIgnoreCase("END") && - strArray[1].trim().equalsIgnoreCase("VCARD"))) { - throw new VCardException("END:VCARD != \"" + mPreviousLine + "\""); - } - - if (mBuilder != null) { - mBuilder.endRecord(); - } + + /** + * The arguments useCache and allowGarbase are usually true and false accordingly when + * this function is called outside this function itself. + * + * @param useCache When true, line is obtained from mPreviousline. Otherwise, getLine() + * is used. + * @param allowGarbage When true, ignore non "END:VCARD" line. + * @throws IOException + * @throws VCardException + */ + protected void readEndVCard(boolean useCache, boolean allowGarbage) + throws IOException, VCardException { + String line; + do { + if (useCache) { + // Though vCard specification does not allow lower cases, + // some data may have them, so we allow it. + line = mPreviousLine; + } else { + while (true) { + line = getLine(); + if (line == null) { + throw new VCardException("Expected END:VCARD was not found."); + } else if (line.trim().length() > 0) { + break; + } + } + } + + String[] strArray = line.split(":", 2); + if (strArray.length == 2 && + strArray[0].trim().equalsIgnoreCase("END") && + strArray[1].trim().equalsIgnoreCase("VCARD")) { + return; + } else if (!allowGarbage) { + throw new VCardException("END:VCARD != \"" + mPreviousLine + "\""); + } + useCache = false; + } while (allowGarbage); } /** @@ -205,32 +342,33 @@ public class VCardParser_V21 { boolean ended = false; if (mBuilder != null) { + long start = System.currentTimeMillis(); mBuilder.startProperty(); + mTimeStartProperty += System.currentTimeMillis() - start; } - - try { - ended = parseItem(); - } finally { - if (mBuilder != null) { - mBuilder.endProperty(); - } + ended = parseItem(); + if (mBuilder != null && !ended) { + long start = System.currentTimeMillis(); + mBuilder.endProperty(); + mTimeEndProperty += System.currentTimeMillis() - start; } while (!ended) { // follow VCARD ,it wont reach endProperty if (mBuilder != null) { + long start = System.currentTimeMillis(); mBuilder.startProperty(); + mTimeStartProperty += System.currentTimeMillis() - start; } - try { - ended = parseItem(); - } finally { - if (mBuilder != null) { - mBuilder.endProperty(); - } + ended = parseItem(); + if (mBuilder != null && !ended) { + long start = System.currentTimeMillis(); + mBuilder.endProperty(); + mTimeEndProperty += System.currentTimeMillis() - start; } } } - + /** * item = [groups "."] name [params] ":" value CRLF * / [groups "."] "ADR" [params] ":" addressparts CRLF @@ -241,57 +379,134 @@ public class VCardParser_V21 { protected boolean parseItem() throws IOException, VCardException { mEncoding = sDefaultEncoding; - // params = ";" [ws] paramlist String line = getNonEmptyLine(); - String[] strArray = line.split(":", 2); - if (strArray.length < 2) { - throw new VCardException("Invalid line(\":\" does not exist): " + line); - } - String propertyValue = strArray[1]; - String[] groupNameParamsArray = strArray[0].split(";"); - String groupAndName = groupNameParamsArray[0].trim(); - String[] groupNameArray = groupAndName.split("\\."); - int length = groupNameArray.length; - String propertyName = groupNameArray[length - 1]; - if (mBuilder != null) { - mBuilder.propertyName(propertyName); - for (int i = 0; i < length - 1; i++) { - mBuilder.propertyGroup(groupNameArray[i]); - } - } - if (propertyName.equalsIgnoreCase("END")) { - mPreviousLine = line; + long start = System.currentTimeMillis(); + + String[] propertyNameAndValue = separateLineAndHandleGroup(line); + if (propertyNameAndValue == null) { return true; } - - length = groupNameParamsArray.length; - for (int i = 1; i < length; i++) { - handleParams(groupNameParamsArray[i]); + if (propertyNameAndValue.length != 2) { + throw new VCardException("Invalid line \"" + line + "\""); } - - if (isValidPropertyName(propertyName) || - propertyName.startsWith("X-")) { - if (propertyName.equals("VERSION") && - !propertyValue.equals(getVersion())) { - throw new VCardVersionException("Incompatible version: " + - propertyValue + " != " + getVersion()); - } - handlePropertyValue(propertyName, propertyValue); - return false; - } else if (propertyName.equals("ADR") || + String propertyName = propertyNameAndValue[0].toUpperCase(); + String propertyValue = propertyNameAndValue[1]; + + mTimeParseItem1 += System.currentTimeMillis() - start; + + if (propertyName.equals("ADR") || propertyName.equals("ORG") || propertyName.equals("N")) { + start = System.currentTimeMillis(); handleMultiplePropertyValue(propertyName, propertyValue); + mTimeParseItem3 += System.currentTimeMillis() - start; return false; } else if (propertyName.equals("AGENT")) { handleAgent(propertyValue); return false; + } else if (isValidPropertyName(propertyName)) { + if (propertyName.equals("BEGIN")) { + if (propertyValue.equals("VCARD")) { + throw new VCardNestedException("This vCard has nested vCard data in it."); + } else { + throw new VCardException("Unknown BEGIN type: " + propertyValue); + } + } else if (propertyName.equals("VERSION") && + !propertyValue.equals(getVersion())) { + throw new VCardVersionException("Incompatible version: " + + propertyValue + " != " + getVersion()); + } + start = System.currentTimeMillis(); + handlePropertyValue(propertyName, propertyValue); + mTimeParseItem2 += System.currentTimeMillis() - start; + return false; } throw new VCardException("Unknown property name: \"" + propertyName + "\""); } + static private final int STATE_GROUP_OR_PROPNAME = 0; + static private final int STATE_PARAMS = 1; + // vCard 3.1 specification allows double-quoted param-value, while vCard 2.1 does not. + // This is just for safety. + static private final int STATE_PARAMS_IN_DQUOTE = 2; + + protected String[] separateLineAndHandleGroup(String line) throws VCardException { + int length = line.length(); + int state = STATE_GROUP_OR_PROPNAME; + int nameIndex = 0; + + String[] propertyNameAndValue = new String[2]; + + for (int i = 0; i < length; i++) { + char ch = line.charAt(i); + switch (state) { + case STATE_GROUP_OR_PROPNAME: + if (ch == ':') { + String propertyName = line.substring(nameIndex, i); + if (propertyName.equalsIgnoreCase("END")) { + mPreviousLine = line; + return null; + } + if (mBuilder != null) { + mBuilder.propertyName(propertyName); + } + propertyNameAndValue[0] = propertyName; + if (i < length - 1) { + propertyNameAndValue[1] = line.substring(i + 1); + } else { + propertyNameAndValue[1] = ""; + } + return propertyNameAndValue; + } else if (ch == '.') { + String groupName = line.substring(nameIndex, i); + if (mBuilder != null) { + mBuilder.propertyGroup(groupName); + } + nameIndex = i + 1; + } else if (ch == ';') { + String propertyName = line.substring(nameIndex, i); + if (propertyName.equalsIgnoreCase("END")) { + mPreviousLine = line; + return null; + } + if (mBuilder != null) { + mBuilder.propertyName(propertyName); + } + propertyNameAndValue[0] = propertyName; + nameIndex = i + 1; + state = STATE_PARAMS; + } + break; + case STATE_PARAMS: + if (ch == '"') { + state = STATE_PARAMS_IN_DQUOTE; + } else if (ch == ';') { + handleParams(line.substring(nameIndex, i)); + nameIndex = i + 1; + } else if (ch == ':') { + handleParams(line.substring(nameIndex, i)); + if (i < length - 1) { + propertyNameAndValue[1] = line.substring(i + 1); + } else { + propertyNameAndValue[1] = ""; + } + return propertyNameAndValue; + } + break; + case STATE_PARAMS_IN_DQUOTE: + if (ch == '"') { + state = STATE_PARAMS; + } + break; + } + } + + throw new VCardException("Invalid line: \"" + line + "\""); + } + + /** * params = ";" [ws] paramlist * paramlist = paramlist [ws] ";" [ws] param @@ -330,18 +545,19 @@ public class VCardParser_V21 { } /** - * typeval = knowntype / "X-" word + * ptypeval = knowntype / "X-" word */ - protected void handleType(String ptypeval) throws VCardException { - if (sKnownTypeSet.contains(ptypeval.toUpperCase()) || - ptypeval.startsWith("X-")) { - if (mBuilder != null) { - mBuilder.propertyParamType("TYPE"); - mBuilder.propertyParamValue(ptypeval.toUpperCase()); - } - } else { - throw new VCardException("Unknown type: \"" + ptypeval + "\""); - } + protected void handleType(String ptypeval) { + String upperTypeValue = ptypeval; + if (!(sKnownTypeSet.contains(upperTypeValue) || upperTypeValue.startsWith("X-")) && + !mWarningValueMap.contains(ptypeval)) { + mWarningValueMap.add(ptypeval); + Log.w(LOG_TAG, "Type unsupported by vCard 2.1: " + ptypeval); + } + if (mBuilder != null) { + mBuilder.propertyParamType("TYPE"); + mBuilder.propertyParamValue(upperTypeValue); + } } /** @@ -427,31 +643,48 @@ public class VCardParser_V21 { protected void handlePropertyValue( String propertyName, String propertyValue) throws IOException, VCardException { - if (mEncoding == null || mEncoding.equalsIgnoreCase("7BIT") - || mEncoding.equalsIgnoreCase("8BIT") - || mEncoding.toUpperCase().startsWith("X-")) { - if (mBuilder != null) { - ArrayList<String> v = new ArrayList<String>(); - v.add(maybeUnescapeText(propertyValue)); - mBuilder.propertyValues(v); - } - } else if (mEncoding.equalsIgnoreCase("QUOTED-PRINTABLE")) { + if (mEncoding.equalsIgnoreCase("QUOTED-PRINTABLE")) { + long start = System.currentTimeMillis(); String result = getQuotedPrintable(propertyValue); if (mBuilder != null) { ArrayList<String> v = new ArrayList<String>(); v.add(result); mBuilder.propertyValues(v); } + mTimeHandlePropertyValue2 += System.currentTimeMillis() - start; } else if (mEncoding.equalsIgnoreCase("BASE64") || mEncoding.equalsIgnoreCase("B")) { - String result = getBase64(propertyValue); + long start = System.currentTimeMillis(); + // It is very rare, but some BASE64 data may be so big that + // OutOfMemoryError occurs. To ignore such cases, use try-catch. + try { + String result = getBase64(propertyValue); + if (mBuilder != null) { + ArrayList<String> v = new ArrayList<String>(); + v.add(result); + mBuilder.propertyValues(v); + } + } catch (OutOfMemoryError error) { + Log.e(LOG_TAG, "OutOfMemoryError happened during parsing BASE64 data!"); + if (mBuilder != null) { + mBuilder.propertyValues(null); + } + } + mTimeHandlePropertyValue3 += System.currentTimeMillis() - start; + } else { + if (!(mEncoding == null || mEncoding.equalsIgnoreCase("7BIT") + || mEncoding.equalsIgnoreCase("8BIT") + || mEncoding.toUpperCase().startsWith("X-"))) { + Log.w(LOG_TAG, "The encoding unsupported by vCard spec: \"" + mEncoding + "\"."); + } + + long start = System.currentTimeMillis(); if (mBuilder != null) { ArrayList<String> v = new ArrayList<String>(); - v.add(result); + v.add(maybeUnescapeText(propertyValue)); mBuilder.propertyValues(v); - } - } else { - throw new VCardException("Unknown encoding: \"" + mEncoding + "\""); + } + mTimeHandlePropertyValue1 += System.currentTimeMillis() - start; } } @@ -546,57 +779,51 @@ public class VCardParser_V21 { if (mEncoding.equalsIgnoreCase("QUOTED-PRINTABLE")) { propertyValue = getQuotedPrintable(propertyValue); } - - if (propertyValue.endsWith("\\")) { + + if (mBuilder != null) { + // TODO: limit should be set in accordance with propertyName? StringBuilder builder = new StringBuilder(); - // builder.append(propertyValue); - builder.append(propertyValue.substring(0, propertyValue.length() - 1)); - try { - String line; - while (true) { - line = getNonEmptyLine(); - // builder.append("\r\n"); - // builder.append(line); - if (!line.endsWith("\\")) { - builder.append(line); - break; + ArrayList<String> list = new ArrayList<String>(); + int length = propertyValue.length(); + for (int i = 0; i < length; i++) { + char ch = propertyValue.charAt(i); + if (ch == '\\' && i < length - 1) { + char nextCh = propertyValue.charAt(i + 1); + String unescapedString = maybeUnescape(nextCh); + if (unescapedString != null) { + builder.append(unescapedString); + i++; } else { - builder.append(line.substring(0, line.length() - 1)); + builder.append(ch); } + } else if (ch == ';') { + list.add(builder.toString()); + builder = new StringBuilder(); + } else { + builder.append(ch); } - } catch (IOException e) { - throw new VCardException( - "IOException is throw during reading propertyValue" + e); } - // Now, propertyValue may contain "\r\n" - propertyValue = builder.toString(); - } - - if (mBuilder != null) { - // In String#replaceAll() and Pattern class, "\\\\" means single slash. - - final String IMPOSSIBLE_STRING = "\0"; - // First replace two backslashes with impossible strings. - propertyValue = propertyValue.replaceAll("\\\\\\\\", IMPOSSIBLE_STRING); - - // Now, split propertyValue with ; whose previous char is not back slash. - Pattern pattern = Pattern.compile("(?<!\\\\);"); - // TODO: limit should be set in accordance with propertyName? - String[] strArray = pattern.split(propertyValue, -1); - ArrayList<String> arrayList = new ArrayList<String>(); - for (String str : strArray) { - // Replace impossible strings with original two backslashes - arrayList.add( - unescapeText(str.replaceAll(IMPOSSIBLE_STRING, "\\\\\\\\"))); - } - mBuilder.propertyValues(arrayList); + list.add(builder.toString()); + mBuilder.propertyValues(list); } } /** * vCard 2.1 specifies AGENT allows one vcard entry. It is not encoded at all. + * + * item = ... + * / [groups "."] "AGENT" + * [params] ":" vcard CRLF + * vcard = "BEGIN" [ws] ":" [ws] "VCARD" [ws] 1*CRLF + * items *CRLF "END" [ws] ":" [ws] "VCARD" + * */ - protected void handleAgent(String propertyValue) throws IOException, VCardException { + protected void handleAgent(String propertyValue) throws VCardException { + throw new VCardException("AGENT Property is not supported."); + /* This is insufficient support. Also, AGENT Property is very rare. + Ignore it for now. + TODO: fix this. + String[] strArray = propertyValue.split(":", 2); if (!(strArray.length == 2 || strArray[0].trim().equalsIgnoreCase("BEGIN") && @@ -605,6 +832,7 @@ public class VCardParser_V21 { } parseItems(); readEndVCard(); + */ } /** @@ -615,17 +843,18 @@ public class VCardParser_V21 { } /** - * Convert escaped text into unescaped text. + * Returns unescaped String if the character should be unescaped. Return null otherwise. + * e.g. In vCard 2.1, "\;" should be unescaped into ";" while "\x" should not be. */ - protected String unescapeText(String text) { + protected String maybeUnescape(char ch) { // Original vCard 2.1 specification does not allow transformation // "\:" -> ":", "\," -> ",", and "\\" -> "\", but previous implementation of // this class allowed them, so keep it as is. - // In String#replaceAll(), "\\\\" means single slash. - return text.replaceAll("\\\\;", ";") - .replaceAll("\\\\:", ":") - .replaceAll("\\\\,", ",") - .replaceAll("\\\\\\\\", "\\\\"); + if (ch == '\\' || ch == ';' || ch == ':' || ch == ',') { + return String.valueOf(ch); + } else { + return null; + } } /** @@ -656,12 +885,15 @@ public class VCardParser_V21 { */ public boolean parse(InputStream is, String charset, VBuilder builder) throws IOException, VCardException { + // TODO: make this count error entries instead of just throwing VCardException. + // TODO: If we really need to allow only CRLF as line break, // we will have to develop our own BufferedReader(). - mReader = new BufferedReader(new InputStreamReader(is, charset)); + mReader = new CustomBufferedReader(new InputStreamReader(is, charset)); mBuilder = builder; + long start = System.currentTimeMillis(); if (mBuilder != null) { mBuilder.start(); } @@ -669,9 +901,50 @@ public class VCardParser_V21 { if (mBuilder != null) { mBuilder.end(); } + mTimeTotal += System.currentTimeMillis() - start; + return true; } + public boolean parse(InputStream is, VBuilder builder) throws IOException, VCardException { + return parse(is, DEFAULT_CHARSET, builder); + } + + /** + * Cancel parsing. + * Actual cancel is done after the end of the current one vcard entry parsing. + */ + public void cancel() { + mCanceled = true; + } + + /** + * It is very, very rare case, but there is a case where + * canceled may be already true outside this object. + * @hide + */ + public void parse(InputStream is, String charset, VBuilder builder, boolean canceled) + throws IOException, VCardException { + mCanceled = canceled; + parse(is, charset, builder); + } + + public void showDebugInfo() { + Log.d(LOG_TAG, "total parsing time: " + mTimeTotal + " ms"); + if (mReader instanceof CustomBufferedReader) { + Log.d(LOG_TAG, "total readLine time: " + + ((CustomBufferedReader)mReader).getTotalmillisecond() + " ms"); + } + Log.d(LOG_TAG, "mTimeStartRecord: " + mTimeStartRecord + " ms"); + Log.d(LOG_TAG, "mTimeEndRecord: " + mTimeEndRecord + " ms"); + Log.d(LOG_TAG, "mTimeParseItem1: " + mTimeParseItem1 + " ms"); + Log.d(LOG_TAG, "mTimeParseItem2: " + mTimeParseItem2 + " ms"); + Log.d(LOG_TAG, "mTimeParseItem3: " + mTimeParseItem3 + " ms"); + Log.d(LOG_TAG, "mTimeHandlePropertyValue1: " + mTimeHandlePropertyValue1 + " ms"); + Log.d(LOG_TAG, "mTimeHandlePropertyValue2: " + mTimeHandlePropertyValue2 + " ms"); + Log.d(LOG_TAG, "mTimeHandlePropertyValue3: " + mTimeHandlePropertyValue3 + " ms"); + } + private boolean isLetter(char ch) { if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) { return true; @@ -679,3 +952,24 @@ public class VCardParser_V21 { return false; } } + +class CustomBufferedReader extends BufferedReader { + private long mTime; + + public CustomBufferedReader(Reader in) { + super(in); + } + + @Override + public String readLine() throws IOException { + long start = System.currentTimeMillis(); + String ret = super.readLine(); + long end = System.currentTimeMillis(); + mTime += end - start; + return ret; + } + + public long getTotalmillisecond() { + return mTime; + } +} diff --git a/core/java/android/syncml/pim/vcard/VCardParser_V30.java b/core/java/android/syncml/pim/vcard/VCardParser_V30.java index 901bd49..e67525e 100644 --- a/core/java/android/syncml/pim/vcard/VCardParser_V30.java +++ b/core/java/android/syncml/pim/vcard/VCardParser_V30.java @@ -16,8 +16,9 @@ package android.syncml.pim.vcard; +import android.util.Log; + import java.io.IOException; -import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; @@ -26,9 +27,11 @@ import java.util.HashSet; * Please refer to vCard Specification 3.0 (http://tools.ietf.org/html/rfc2426) */ public class VCardParser_V30 extends VCardParser_V21 { + private static final String LOG_TAG = "VCardParser_V30"; + private static final HashSet<String> acceptablePropsWithParam = new HashSet<String>( Arrays.asList( - "LOGO", "PHOTO", "LABEL", "FN", "TITLE", "SOUND", + "BEGIN", "LOGO", "PHOTO", "LABEL", "FN", "TITLE", "SOUND", "VERSION", "TEL", "EMAIL", "TZ", "GEO", "NOTE", "URL", "BDAY", "ROLE", "REV", "UID", "KEY", "MAILER", // 2.1 "NAME", "PROFILE", "SOURCE", "NICKNAME", "CLASS", @@ -51,8 +54,14 @@ public class VCardParser_V30 extends VCardParser_V21 { @Override protected boolean isValidPropertyName(String propertyName) { - return acceptablePropsWithParam.contains(propertyName) || - acceptablePropsWithoutParam.contains(propertyName); + if (!(acceptablePropsWithParam.contains(propertyName) || + acceptablePropsWithoutParam.contains(propertyName) || + propertyName.startsWith("X-")) && + !mWarningValueMap.contains(propertyName)) { + mWarningValueMap.add(propertyName); + Log.w(LOG_TAG, "Property name unsupported by vCard 3.0: " + propertyName); + } + return true; } @Override @@ -100,7 +109,21 @@ public class VCardParser_V30 extends VCardParser_V21 { } } else if (line.charAt(0) == ' ' || line.charAt(0) == '\t') { if (builder != null) { - // TODO: Check whether MIME requires only one whitespace. + // See Section 5.8.1 of RFC 2425 (MIME-DIR document). + // Following is the excerpts from it. + // + // DESCRIPTION:This is a long description that exists on a long line. + // + // Can be represented as: + // + // DESCRIPTION:This is a long description + // that exists on a long line. + // + // It could also be represented as: + // + // DESCRIPTION:This is a long descrip + // tion that exists o + // n a long line. builder.append(line.substring(1)); } else if (mPreviousLine != null) { builder = new StringBuilder(); @@ -113,10 +136,13 @@ public class VCardParser_V30 extends VCardParser_V21 { } else { if (mPreviousLine == null) { mPreviousLine = line; + if (builder != null) { + return builder.toString(); + } } else { String ret = mPreviousLine; mPreviousLine = line; - return ret; + return ret; } } } @@ -130,15 +156,16 @@ public class VCardParser_V30 extends VCardParser_V21 { * [group "."] "END" ":" "VCARD" 1*CRLF */ @Override - protected boolean readBeginVCard() throws IOException, VCardException { + protected boolean readBeginVCard(boolean allowGarbage) throws IOException, VCardException { // TODO: vCard 3.0 supports group. - return super.readBeginVCard(); + return super.readBeginVCard(allowGarbage); } @Override - protected void readEndVCard() throws VCardException { + protected void readEndVCard(boolean useCache, boolean allowGarbage) + throws IOException, VCardException { // TODO: vCard 3.0 supports group. - super.readEndVCard(); + super.readEndVCard(useCache, allowGarbage); } /** @@ -214,23 +241,6 @@ public class VCardParser_V30 extends VCardParser_V21 { throw new VCardException("AGENT in vCard 3.0 is not supported yet."); } - // vCard 3.0 supports "B" as BASE64 encoding. - @Override - protected void handlePropertyValue( - String propertyName, String propertyValue) throws - IOException, VCardException { - if (mEncoding != null && mEncoding.equalsIgnoreCase("B")) { - String result = getBase64(propertyValue); - if (mBuilder != null) { - ArrayList<String> v = new ArrayList<String>(); - v.add(result); - mBuilder.propertyValues(v); - } - } - - super.handlePropertyValue(propertyName, propertyValue); - } - /** * vCard 3.0 does not require two CRLF at the last of BASE64 data. * It only requires that data should be MIME-encoded. @@ -259,27 +269,38 @@ public class VCardParser_V30 extends VCardParser_V21 { } /** - * Return unescapeText(text). - * In vCard 3.0, 8bit text is always encoded. - */ - @Override - protected String maybeUnescapeText(String text) { - return unescapeText(text); - } - - /** * ESCAPED-CHAR = "\\" / "\;" / "\," / "\n" / "\N") * ; \\ encodes \, \n or \N encodes newline * ; \; encodes ;, \, encodes , - */ + * + * Note: Apple escape ':' into '\:' while does not escape '\' + */ @Override - protected String unescapeText(String text) { - // In String#replaceAll(), "\\\\" means single slash. - return text.replaceAll("\\\\;", ";") - .replaceAll("\\\\:", ":") - .replaceAll("\\\\,", ",") - .replaceAll("\\\\n", "\r\n") - .replaceAll("\\\\N", "\r\n") - .replaceAll("\\\\\\\\", "\\\\"); + protected String maybeUnescapeText(String text) { + StringBuilder builder = new StringBuilder(); + int length = text.length(); + for (int i = 0; i < length; i++) { + char ch = text.charAt(i); + if (ch == '\\' && i < length - 1) { + char next_ch = text.charAt(++i); + if (next_ch == 'n' || next_ch == 'N') { + builder.append("\r\n"); + } else { + builder.append(next_ch); + } + } else { + builder.append(ch); + } + } + return builder.toString(); + } + + @Override + protected String maybeUnescape(char ch) { + if (ch == 'n' || ch == 'N') { + return "\r\n"; + } else { + return String.valueOf(ch); + } } } diff --git a/core/java/android/syncml/pim/vcard/VCardSourceDetector.java b/core/java/android/syncml/pim/vcard/VCardSourceDetector.java new file mode 100644 index 0000000..8c48391 --- /dev/null +++ b/core/java/android/syncml/pim/vcard/VCardSourceDetector.java @@ -0,0 +1,140 @@ +/* + * 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.syncml.pim.vcard; + +import android.syncml.pim.VBuilder; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * Class which tries to detects the source of the vCard from its properties. + * Currently this implementation is very premature. + * @hide + */ +public class VCardSourceDetector implements VBuilder { + // Should only be used in package. + static final int TYPE_UNKNOWN = 0; + static final int TYPE_APPLE = 1; + static final int TYPE_JAPANESE_MOBILE_PHONE = 2; // Used in Japanese mobile phones. + static final int TYPE_FOMA = 3; // Used in some Japanese FOMA mobile phones. + static final int TYPE_WINDOWS_MOBILE_JP = 4; + // TODO: Excel, etc. + + private static Set<String> APPLE_SIGNS = new HashSet<String>(Arrays.asList( + "X-PHONETIC-FIRST-NAME", "X-PHONETIC-MIDDLE-NAME", "X-PHONETIC-LAST-NAME", + "X-ABADR", "X-ABUID")); + + private static Set<String> JAPANESE_MOBILE_PHONE_SIGNS = new HashSet<String>(Arrays.asList( + "X-GNO", "X-GN", "X-REDUCTION")); + + private static Set<String> WINDOWS_MOBILE_PHONE_SIGNS = new HashSet<String>(Arrays.asList( + "X-MICROSOFT-ASST_TEL", "X-MICROSOFT-ASSISTANT", "X-MICROSOFT-OFFICELOC")); + + // Note: these signes appears before the signs of the other type (e.g. "X-GN"). + // In other words, Japanese FOMA mobile phones are detected as FOMA, not JAPANESE_MOBILE_PHONES. + private static Set<String> FOMA_SIGNS = new HashSet<String>(Arrays.asList( + "X-SD-VERN", "X-SD-FORMAT_VER", "X-SD-CATEGORIES", "X-SD-CLASS", "X-SD-DCREATED", + "X-SD-DESCRIPTION")); + private static String TYPE_FOMA_CHARSET_SIGN = "X-SD-CHAR_CODE"; + + private int mType = TYPE_UNKNOWN; + // Some mobile phones (like FOMA) tells us the charset of the data. + private boolean mNeedParseSpecifiedCharset; + private String mSpecifiedCharset; + + public void start() { + } + + public void end() { + } + + public void startRecord(String type) { + } + + public void startProperty() { + mNeedParseSpecifiedCharset = false; + } + + public void endProperty() { + } + + public void endRecord() { + } + + public void propertyGroup(String group) { + } + + public void propertyName(String name) { + if (name.equalsIgnoreCase(TYPE_FOMA_CHARSET_SIGN)) { + mType = TYPE_FOMA; + mNeedParseSpecifiedCharset = true; + return; + } + if (mType != TYPE_UNKNOWN) { + return; + } + if (WINDOWS_MOBILE_PHONE_SIGNS.contains(name)) { + mType = TYPE_WINDOWS_MOBILE_JP; + } else if (FOMA_SIGNS.contains(name)) { + mType = TYPE_FOMA; + } else if (JAPANESE_MOBILE_PHONE_SIGNS.contains(name)) { + mType = TYPE_JAPANESE_MOBILE_PHONE; + } else if (APPLE_SIGNS.contains(name)) { + mType = TYPE_APPLE; + } + } + + public void propertyParamType(String type) { + } + + public void propertyParamValue(String value) { + } + + public void propertyValues(List<String> values) { + if (mNeedParseSpecifiedCharset && values.size() > 0) { + mSpecifiedCharset = values.get(0); + } + } + + int getType() { + return mType; + } + + /** + * Return charset String guessed from the source's properties. + * This method must be called after parsing target file(s). + * @return Charset String. Null is returned if guessing the source fails. + */ + public String getEstimatedCharset() { + if (mSpecifiedCharset != null) { + return mSpecifiedCharset; + } + switch (mType) { + case TYPE_WINDOWS_MOBILE_JP: + case TYPE_FOMA: + case TYPE_JAPANESE_MOBILE_PHONE: + return "SHIFT_JIS"; + case TYPE_APPLE: + return "UTF-8"; + default: + return null; + } + } +} diff --git a/core/java/android/text/format/DateFormat.java b/core/java/android/text/format/DateFormat.java index 0dc96c3..3156d8b 100644 --- a/core/java/android/text/format/DateFormat.java +++ b/core/java/android/text/format/DateFormat.java @@ -242,64 +242,48 @@ public class DateFormat { /** * Returns a {@link java.text.DateFormat} object that can format the time according - * to the current user preference. + * to the current locale. * @param context the application context * @return the {@link java.text.DateFormat} object that properly formats the time. */ public static final java.text.DateFormat getTimeFormat(Context context) { - boolean b24 = is24HourFormat(context); - int res; - - if (b24) { - res = R.string.twenty_four_hour_time_format; - } else { - res = R.string.twelve_hour_time_format; - } - - return new java.text.SimpleDateFormat(context.getString(res)); + return java.text.DateFormat.getTimeInstance(java.text.DateFormat.SHORT); } /** - * Returns a {@link java.text.DateFormat} object that can format the date according - * to the current user preference. + * Returns a {@link java.text.DateFormat} object that can format the date + * in short form (such as 12/31/1999) according + * to the current locale. * @param context the application context * @return the {@link java.text.DateFormat} object that properly formats the date. */ public static final java.text.DateFormat getDateFormat(Context context) { - String value = getDateFormatString(context); + /* + * We use a resource string here instead of just DateFormat.SHORT + * so that we get a four-digit year instead a two-digit year. + */ + String value = context.getString(R.string.numeric_date_format); return new java.text.SimpleDateFormat(value); } /** * Returns a {@link java.text.DateFormat} object that can format the date - * in long form (such as December 31, 1999) based on user preference. + * in long form (such as December 31, 1999) for the current locale. * @param context the application context * @return the {@link java.text.DateFormat} object that formats the date in long form. */ public static final java.text.DateFormat getLongDateFormat(Context context) { - String value = getDateFormatString(context); - if (value.indexOf('M') < value.indexOf('d')) { - value = context.getString(R.string.full_date_month_first); - } else { - value = context.getString(R.string.full_date_day_first); - } - return new java.text.SimpleDateFormat(value); + return java.text.DateFormat.getDateInstance(java.text.DateFormat.LONG); } /** * Returns a {@link java.text.DateFormat} object that can format the date - * in medium form (such as Dec. 31, 1999) based on user preference. + * in medium form (such as Dec. 31, 1999) for the current locale. * @param context the application context * @return the {@link java.text.DateFormat} object that formats the date in long form. */ public static final java.text.DateFormat getMediumDateFormat(Context context) { - String value = getDateFormatString(context); - if (value.indexOf('M') < value.indexOf('d')) { - value = context.getString(R.string.medium_date_month_first); - } else { - value = context.getString(R.string.medium_date_day_first); - } - return new java.text.SimpleDateFormat(value); + return java.text.DateFormat.getDateInstance(java.text.DateFormat.MEDIUM); } /** @@ -338,6 +322,12 @@ public class DateFormat { } private static String getDateFormatString(Context context) { + java.text.DateFormat df; + df = java.text.DateFormat.getDateInstance(java.text.DateFormat.SHORT); + if (df instanceof SimpleDateFormat) { + return ((SimpleDateFormat) df).toPattern(); + } + String value = Settings.System.getString(context.getContentResolver(), Settings.System.DATE_FORMAT); if (value == null || value.length() < 6) { diff --git a/core/java/android/text/format/DateUtils.java b/core/java/android/text/format/DateUtils.java index 8a7cdd9..9073d82 100644 --- a/core/java/android/text/format/DateUtils.java +++ b/core/java/android/text/format/DateUtils.java @@ -62,15 +62,6 @@ public class DateUtils com.android.internal.R.string.day_of_week_short_friday, com.android.internal.R.string.day_of_week_short_saturday, }; - private static final int[] sDaysShorter = new int[] { - com.android.internal.R.string.day_of_week_shorter_sunday, - com.android.internal.R.string.day_of_week_shorter_monday, - com.android.internal.R.string.day_of_week_shorter_tuesday, - com.android.internal.R.string.day_of_week_shorter_wednesday, - com.android.internal.R.string.day_of_week_shorter_thursday, - com.android.internal.R.string.day_of_week_shorter_friday, - com.android.internal.R.string.day_of_week_shorter_saturday, - }; private static final int[] sDaysShortest = new int[] { com.android.internal.R.string.day_of_week_shortest_sunday, com.android.internal.R.string.day_of_week_shortest_monday, @@ -80,6 +71,20 @@ public class DateUtils com.android.internal.R.string.day_of_week_shortest_friday, com.android.internal.R.string.day_of_week_shortest_saturday, }; + private static final int[] sMonthsStandaloneLong = new int [] { + com.android.internal.R.string.month_long_standalone_january, + com.android.internal.R.string.month_long_standalone_february, + com.android.internal.R.string.month_long_standalone_march, + com.android.internal.R.string.month_long_standalone_april, + com.android.internal.R.string.month_long_standalone_may, + com.android.internal.R.string.month_long_standalone_june, + com.android.internal.R.string.month_long_standalone_july, + com.android.internal.R.string.month_long_standalone_august, + com.android.internal.R.string.month_long_standalone_september, + com.android.internal.R.string.month_long_standalone_october, + com.android.internal.R.string.month_long_standalone_november, + com.android.internal.R.string.month_long_standalone_december, + }; private static final int[] sMonthsLong = new int [] { com.android.internal.R.string.month_long_january, com.android.internal.R.string.month_long_february, @@ -127,7 +132,7 @@ public class DateUtils com.android.internal.R.string.pm, }; private static Configuration sLastConfig; - private static String sStatusTimeFormat; + private static java.text.DateFormat sStatusTimeFormat; private static String sElapsedFormatMMSS; private static String sElapsedFormatHMMSS; @@ -255,18 +260,15 @@ public class DateUtils * For use with the 'abbrev' parameter of {@link #getDayOfWeekString} and {@link #getMonthString}. * @more * <p>e.g. "Su" or "Jan" - * <p>In some languages, the results returned for LENGTH_SHORT may be the same as - * return for {@link #LENGTH_MEDIUM}. + * <p>In most languages, the results returned for LENGTH_SHORT will be the same as + * the results returned for {@link #LENGTH_MEDIUM}. */ public static final int LENGTH_SHORT = 30; /** * Request an even shorter abbreviated version of the name. - * For use with the 'abbrev' parameter of {@link #getDayOfWeekString} and {@link #getMonthString}. - * @more - * <p>e.g. "M", "Tu", "Th" or "J" - * <p>In some languages, the results returned for LENGTH_SHORTEST may be the same as - * return for {@link #LENGTH_SHORTER}. + * Do not use this. Currently this will always return the same result + * as {@link #LENGTH_SHORT}. */ public static final int LENGTH_SHORTER = 40; @@ -275,8 +277,8 @@ public class DateUtils * For use with the 'abbrev' parameter of {@link #getDayOfWeekString} and {@link #getMonthString}. * @more * <p>e.g. "S", "T", "T" or "J" - * <p>In some languages, the results returned for LENGTH_SHORTEST may be the same as - * return for {@link #LENGTH_SHORTER}. + * <p>In some languages, the results returned for LENGTH_SHORTEST will be the same as + * the results returned for {@link #LENGTH_SHORT}. */ public static final int LENGTH_SHORTEST = 50; @@ -284,9 +286,12 @@ public class DateUtils * Return a string for the day of the week. * @param dayOfWeek One of {@link Calendar#SUNDAY Calendar.SUNDAY}, * {@link Calendar#MONDAY Calendar.MONDAY}, etc. - * @param abbrev One of {@link #LENGTH_LONG}, {@link #LENGTH_SHORT}, {@link #LENGTH_SHORTER} - * or {@link #LENGTH_SHORTEST}. For forward compatibility, anything else - * will return the same as {#LENGTH_MEDIUM}. + * @param abbrev One of {@link #LENGTH_LONG}, {@link #LENGTH_SHORT}, + * {@link #LENGTH_MEDIUM}, or {@link #LENGTH_SHORTEST}. + * Note that in most languages, {@link #LENGTH_SHORT} + * will return the same as {@link #LENGTH_MEDIUM}. + * Undefined lengths will return {@link #LENGTH_MEDIUM} + * but may return something different in the future. * @throws IndexOutOfBoundsException if the dayOfWeek is out of bounds. */ public static String getDayOfWeekString(int dayOfWeek, int abbrev) { @@ -295,7 +300,7 @@ public class DateUtils case LENGTH_LONG: list = sDaysLong; break; case LENGTH_MEDIUM: list = sDaysMedium; break; case LENGTH_SHORT: list = sDaysShort; break; - case LENGTH_SHORTER: list = sDaysShorter; break; + case LENGTH_SHORTER: list = sDaysShort; break; case LENGTH_SHORTEST: list = sDaysShortest; break; default: list = sDaysMedium; break; } @@ -316,13 +321,14 @@ public class DateUtils } /** - * Return a localized string for the day of the week. + * Return a localized string for the month of the year. * @param month One of {@link Calendar#JANUARY Calendar.JANUARY}, * {@link Calendar#FEBRUARY Calendar.FEBRUARY}, etc. - * @param abbrev One of {@link #LENGTH_LONG}, {@link #LENGTH_SHORT}, {@link #LENGTH_SHORTER} - * or {@link #LENGTH_SHORTEST}. For forward compatibility, anything else - * will return the same as {#LENGTH_MEDIUM}. - * @return Localized day of the week. + * @param abbrev One of {@link #LENGTH_LONG}, {@link #LENGTH_MEDIUM}, + * or {@link #LENGTH_SHORTEST}. + * Undefined lengths will return {@link #LENGTH_MEDIUM} + * but may return something different in the future. + * @return Localized month of the year. */ public static String getMonthString(int month, int abbrev) { // Note that here we use sMonthsMedium for MEDIUM, SHORT and SHORTER. @@ -344,6 +350,40 @@ public class DateUtils } /** + * Return a localized string for the month of the year, for + * contexts where the month is not formatted together with + * a day of the month. + * + * @param month One of {@link Calendar#JANUARY Calendar.JANUARY}, + * {@link Calendar#FEBRUARY Calendar.FEBRUARY}, etc. + * @param abbrev One of {@link #LENGTH_LONG}, {@link #LENGTH_MEDIUM}, + * or {@link #LENGTH_SHORTEST}. + * Undefined lengths will return {@link #LENGTH_MEDIUM} + * but may return something different in the future. + * @return Localized month of the year. + * @hide Pending API council approval + */ + public static String getStandaloneMonthString(int month, int abbrev) { + // Note that here we use sMonthsMedium for MEDIUM, SHORT and SHORTER. + // This is a shortcut to not spam the translators with too many variations + // of the same string. If we find that in a language the distinction + // is necessary, we can can add more without changing this API. + int[] list; + switch (abbrev) { + case LENGTH_LONG: list = sMonthsStandaloneLong; + break; + case LENGTH_MEDIUM: list = sMonthsMedium; break; + case LENGTH_SHORT: list = sMonthsMedium; break; + case LENGTH_SHORTER: list = sMonthsMedium; break; + case LENGTH_SHORTEST: list = sMonthsShortest; break; + default: list = sMonthsMedium; break; + } + + Resources r = Resources.getSystem(); + return r.getString(list[month - Calendar.JANUARY]); + } + + /** * Returns a string describing the elapsed time since startTime. * @param startTime some time in the past. * @return a String object containing the elapsed time. @@ -572,7 +612,7 @@ public class DateUtils Configuration cfg = r.getConfiguration(); if (sLastConfig == null || !sLastConfig.equals(cfg)) { sLastConfig = cfg; - sStatusTimeFormat = r.getString(com.android.internal.R.string.status_bar_time_format); + sStatusTimeFormat = java.text.DateFormat.getTimeInstance(java.text.DateFormat.SHORT); sElapsedFormatMMSS = r.getString(com.android.internal.R.string.elapsed_time_short_format_mm_ss); sElapsedFormatHMMSS = r.getString(com.android.internal.R.string.elapsed_time_short_format_h_mm_ss); } @@ -586,7 +626,7 @@ public class DateUtils */ public static final CharSequence timeString(long millis) { initFormatStrings(); - return DateFormat.format(sStatusTimeFormat, millis); + return sStatusTimeFormat.format(millis); } /** diff --git a/core/java/android/text/format/Time.java b/core/java/android/text/format/Time.java index 8f12355..8eae111 100644 --- a/core/java/android/text/format/Time.java +++ b/core/java/android/text/format/Time.java @@ -135,6 +135,7 @@ public class Time { private static Locale sLocale; private static String[] sShortMonths; private static String[] sLongMonths; + private static String[] sLongStandaloneMonths; private static String[] sShortWeekdays; private static String[] sLongWeekdays; private static String sTimeOnlyFormat; @@ -321,6 +322,20 @@ public class Time { r.getString(com.android.internal.R.string.month_long_november), r.getString(com.android.internal.R.string.month_long_december), }; + sLongStandaloneMonths = new String[] { + r.getString(com.android.internal.R.string.month_long_standalone_january), + r.getString(com.android.internal.R.string.month_long_standalone_february), + r.getString(com.android.internal.R.string.month_long_standalone_march), + r.getString(com.android.internal.R.string.month_long_standalone_april), + r.getString(com.android.internal.R.string.month_long_standalone_may), + r.getString(com.android.internal.R.string.month_long_standalone_june), + r.getString(com.android.internal.R.string.month_long_standalone_july), + r.getString(com.android.internal.R.string.month_long_standalone_august), + r.getString(com.android.internal.R.string.month_long_standalone_september), + r.getString(com.android.internal.R.string.month_long_standalone_october), + r.getString(com.android.internal.R.string.month_long_standalone_november), + r.getString(com.android.internal.R.string.month_long_standalone_december), + }; sShortWeekdays = new String[] { r.getString(com.android.internal.R.string.day_of_week_medium_sunday), r.getString(com.android.internal.R.string.day_of_week_medium_monday), diff --git a/core/java/android/util/CharsetUtils.java b/core/java/android/util/CharsetUtils.java index 7553029..9d91aca 100644 --- a/core/java/android/util/CharsetUtils.java +++ b/core/java/android/util/CharsetUtils.java @@ -142,20 +142,25 @@ public final class CharsetUtils { /** * Returns whether the given character set name indicates the Shift-JIS - * encoding. + * encoding. Returns false if the name is null. * * @param charsetName the character set name * @return {@code true} if the name corresponds to Shift-JIS or * {@code false} if not */ private static boolean isShiftJis(String charsetName) { - if (charsetName.length() != 9) { - // Bail quickly if the length doesn't match. + // Bail quickly if the length doesn't match. + if (charsetName == null) { + return false; + } + int length = charsetName.length(); + if (length != 4 && length != 9) { return false; } return charsetName.equalsIgnoreCase("shift_jis") - || charsetName.equalsIgnoreCase("shift-jis"); + || charsetName.equalsIgnoreCase("shift-jis") + || charsetName.equalsIgnoreCase("sjis"); } /** diff --git a/core/java/android/view/MotionEvent.java b/core/java/android/view/MotionEvent.java index 86261c4..f1bf0f4 100644 --- a/core/java/android/view/MotionEvent.java +++ b/core/java/android/view/MotionEvent.java @@ -19,7 +19,6 @@ package android.view; import android.os.Parcel; import android.os.Parcelable; import android.os.SystemClock; -import android.util.Config; /** * Object used to report movement (mouse, pen, finger, trackball) events. This @@ -87,6 +86,7 @@ public final class MotionEvent implements Parcelable { private long mDownTime; private long mEventTime; + private long mEventTimeNano; private int mAction; private float mX; private float mY; @@ -123,6 +123,62 @@ public final class MotionEvent implements Parcelable { return ev; } } + + /** + * Create a new MotionEvent, filling in all of the basic values that + * define the motion. + * + * @param downTime The time (in ms) when the user originally pressed down to start + * a stream of position events. This must be obtained from {@link SystemClock#uptimeMillis()}. + * @param eventTime The the time (in ms) when this specific event was generated. This + * must be obtained from {@link SystemClock#uptimeMillis()}. + * @param eventTimeNano The the time (in ns) when this specific event was generated. This + * must be obtained from {@link System#nanoTime()}. + * @param action The kind of action being performed -- one of either + * {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or + * {@link #ACTION_CANCEL}. + * @param x The X coordinate of this event. + * @param y The Y coordinate of this event. + * @param pressure The current pressure of this event. The pressure generally + * ranges from 0 (no pressure at all) to 1 (normal pressure), however + * values higher than 1 may be generated depending on the calibration of + * the input device. + * @param size A scaled value of the approximate size of the area being pressed when + * touched with the finger. The actual value in pixels corresponding to the finger + * touch is normalized with a device specific range of values + * and scaled to a value between 0 and 1. + * @param metaState The state of any meta / modifier keys that were in effect when + * the event was generated. + * @param xPrecision The precision of the X coordinate being reported. + * @param yPrecision The precision of the Y coordinate being reported. + * @param deviceId The id for the device that this event came from. An id of + * zero indicates that the event didn't come from a physical device; other + * numbers are arbitrary and you shouldn't depend on the values. + * @param edgeFlags A bitfield indicating which edges, if any, where touched by this + * MotionEvent. + * + * @hide + */ + static public MotionEvent obtainNano(long downTime, long eventTime, long eventTimeNano, + int action, float x, float y, float pressure, float size, int metaState, + float xPrecision, float yPrecision, int deviceId, int edgeFlags) { + MotionEvent ev = obtain(); + ev.mDeviceId = deviceId; + ev.mEdgeFlags = edgeFlags; + ev.mDownTime = downTime; + ev.mEventTime = eventTime; + ev.mEventTimeNano = eventTimeNano; + ev.mAction = action; + ev.mX = ev.mRawX = x; + ev.mY = ev.mRawY = y; + ev.mPressure = pressure; + ev.mSize = size; + ev.mMetaState = metaState; + ev.mXPrecision = xPrecision; + ev.mYPrecision = yPrecision; + + return ev; + } /** * Create a new MotionEvent, filling in all of the basic values that @@ -163,6 +219,7 @@ public final class MotionEvent implements Parcelable { ev.mEdgeFlags = edgeFlags; ev.mDownTime = downTime; ev.mEventTime = eventTime; + ev.mEventTimeNano = eventTime * 1000000; ev.mAction = action; ev.mX = ev.mRawX = x; ev.mY = ev.mRawY = y; @@ -199,6 +256,7 @@ public final class MotionEvent implements Parcelable { ev.mEdgeFlags = 0; ev.mDownTime = downTime; ev.mEventTime = eventTime; + ev.mEventTimeNano = eventTime * 1000000; ev.mAction = action; ev.mX = ev.mRawX = x; ev.mY = ev.mRawY = y; @@ -246,6 +304,7 @@ public final class MotionEvent implements Parcelable { ev.mEdgeFlags = o.mEdgeFlags; ev.mDownTime = o.mDownTime; ev.mEventTime = o.mEventTime; + ev.mEventTimeNano = o.mEventTimeNano; ev.mAction = o.mAction; ev.mX = o.mX; ev.mRawX = o.mRawX; @@ -317,6 +376,16 @@ public final class MotionEvent implements Parcelable { } /** + * Returns the time (in ns) when this specific event was generated. + * The value is in nanosecond precision but it may not have nanosecond accuracy. + * + * @hide + */ + public final long getEventTimeNano() { + return mEventTimeNano; + } + + /** * Returns the X coordinate of this event. Whole numbers are pixels; the * value may have a fraction for input devices that are sub-pixel precise. */ @@ -644,6 +713,7 @@ public final class MotionEvent implements Parcelable { public void writeToParcel(Parcel out, int flags) { out.writeLong(mDownTime); out.writeLong(mEventTime); + out.writeLong(mEventTimeNano); out.writeInt(mAction); out.writeFloat(mX); out.writeFloat(mY); @@ -675,6 +745,7 @@ public final class MotionEvent implements Parcelable { private void readFromParcel(Parcel in) { mDownTime = in.readLong(); mEventTime = in.readLong(); + mEventTimeNano = in.readLong(); mAction = in.readInt(); mX = in.readFloat(); mY = in.readFloat(); diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 49e4e4c..e70c94c 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -101,6 +101,8 @@ public class SurfaceView extends View { static final int KEEP_SCREEN_ON_MSG = 1; static final int GET_NEW_SURFACE_MSG = 2; + int mWindowType = WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA; + boolean mIsCreating = false; final Handler mHandler = new Handler() { @@ -286,6 +288,15 @@ public class SurfaceView extends View { super.dispatchDraw(canvas); } + /** + * Hack to allow special layering of windows. The type is one of the + * types in WindowManager.LayoutParams. This is a hack so: + * @hide + */ + public void setWindowType(int type) { + mWindowType = type; + } + private void updateWindow(boolean force) { if (!mHaveFrame) { return; @@ -343,7 +354,7 @@ public class SurfaceView extends View { if (mWindow == null) { mWindow = new MyWindow(this); - mLayout.type = WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA; + mLayout.type = mWindowType; mLayout.gravity = Gravity.LEFT|Gravity.TOP; mSession.add(mWindow, mLayout, mVisible ? VISIBLE : GONE, mContentInsets); diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 1564fd0..1f72eea 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -1443,6 +1443,27 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility static final int DIRTY_MASK = 0x00600000; /** + * Indicates whether the background is opaque. + * + * @hide + */ + static final int OPAQUE_BACKGROUND = 0x00800000; + + /** + * Indicates whether the scrollbars are opaque. + * + * @hide + */ + static final int OPAQUE_SCROLLBARS = 0x01000000; + + /** + * Indicates whether the view is opaque. + * + * @hide + */ + static final int OPAQUE_MASK = 0x01800000; + + /** * The parent this view is attached to. * {@hide} * @@ -1721,7 +1742,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility public View(Context context) { mContext = context; mResources = context != null ? context.getResources() : null; - mViewFlags = SOUND_EFFECTS_ENABLED|HAPTIC_FEEDBACK_ENABLED; + mViewFlags = SOUND_EFFECTS_ENABLED | HAPTIC_FEEDBACK_ENABLED; ++sInstanceCount; } @@ -2013,7 +2034,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility if (!setScrollContainer && (viewFlagValues&SCROLLBARS_VERTICAL) != 0) { setScrollContainer(true); } - + + computeOpaqueFlags(); + a.recycle(); } @@ -4700,7 +4723,35 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility */ @ViewDebug.ExportedProperty public boolean isOpaque() { - return mBGDrawable != null && mBGDrawable.getOpacity() == PixelFormat.OPAQUE; + return (mPrivateFlags & OPAQUE_MASK) == OPAQUE_MASK; + } + + private void computeOpaqueFlags() { + // Opaque if: + // - Has a background + // - Background is opaque + // - Doesn't have scrollbars or scrollbars are inside overlay + + if (mBGDrawable != null && mBGDrawable.getOpacity() == PixelFormat.OPAQUE) { + mPrivateFlags |= OPAQUE_BACKGROUND; + } else { + mPrivateFlags &= ~OPAQUE_BACKGROUND; + } + + final int flags = mViewFlags; + if (((flags & SCROLLBARS_VERTICAL) == 0 && (flags & SCROLLBARS_HORIZONTAL) == 0) || + (flags & SCROLLBARS_STYLE_MASK) == SCROLLBARS_INSIDE_OVERLAY) { + mPrivateFlags |= OPAQUE_SCROLLBARS; + } else { + mPrivateFlags &= ~OPAQUE_SCROLLBARS; + } + } + + /** + * @hide + */ + protected boolean hasOpaqueScrollbars() { + return (mPrivateFlags & OPAQUE_SCROLLBARS) == OPAQUE_SCROLLBARS; } /** @@ -5027,6 +5078,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility public void setHorizontalScrollBarEnabled(boolean horizontalScrollBarEnabled) { if (isHorizontalScrollBarEnabled() != horizontalScrollBarEnabled) { mViewFlags ^= SCROLLBARS_HORIZONTAL; + computeOpaqueFlags(); recomputePadding(); } } @@ -5056,6 +5108,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility public void setVerticalScrollBarEnabled(boolean verticalScrollBarEnabled) { if (isVerticalScrollBarEnabled() != verticalScrollBarEnabled) { mViewFlags ^= SCROLLBARS_VERTICAL; + computeOpaqueFlags(); recomputePadding(); } } @@ -5084,6 +5137,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility public void setScrollBarStyle(int style) { if (style != (mViewFlags & SCROLLBARS_STYLE_MASK)) { mViewFlags = (mViewFlags & ~SCROLLBARS_STYLE_MASK) | (style & SCROLLBARS_STYLE_MASK); + computeOpaqueFlags(); recomputePadding(); } } @@ -6848,6 +6902,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility requestLayout = true; } + computeOpaqueFlags(); + if (requestLayout) { requestLayout(); } diff --git a/core/java/android/view/ViewRoot.java b/core/java/android/view/ViewRoot.java index 7cd65e2..d999119 100644 --- a/core/java/android/view/ViewRoot.java +++ b/core/java/android/view/ViewRoot.java @@ -77,6 +77,9 @@ public final class ViewRoot extends Handler implements ViewParent, private static final boolean DEBUG_IMF = false || LOCAL_LOGV; private static final boolean WATCH_POINTER = false; + private static final boolean MEASURE_LATENCY = false; + private static LatencyTimer lt; + /** * Maximum time we allow the user to roll the trackball enough to generate * a key event, before resetting the counters. @@ -192,6 +195,10 @@ public final class ViewRoot extends Handler implements ViewParent, public ViewRoot(Context context) { super(); + if (MEASURE_LATENCY && lt == null) { + lt = new LatencyTimer(100, 1000); + } + ++sInstanceCount; // Initialize the statics when this class is first instantiated. This is @@ -1579,7 +1586,17 @@ public final class ViewRoot extends Handler implements ViewParent, boolean didFinish; if (event == null) { try { + long timeBeforeGettingEvents; + if (MEASURE_LATENCY) { + timeBeforeGettingEvents = System.nanoTime(); + } + event = sWindowSession.getPendingPointerMove(mWindow); + + if (MEASURE_LATENCY && event != null) { + lt.sample("9 Client got events ", System.nanoTime() - event.getEventTimeNano()); + lt.sample("8 Client getting events ", timeBeforeGettingEvents - event.getEventTimeNano()); + } } catch (RemoteException e) { } didFinish = true; @@ -1603,7 +1620,13 @@ public final class ViewRoot extends Handler implements ViewParent, captureMotionLog("captureDispatchPointer", event); } event.offsetLocation(0, mCurScrollY); + if (MEASURE_LATENCY) { + lt.sample("A Dispatching TouchEvents", System.nanoTime() - event.getEventTimeNano()); + } handled = mView.dispatchTouchEvent(event); + if (MEASURE_LATENCY) { + lt.sample("B Dispatched TouchEvents ", System.nanoTime() - event.getEventTimeNano()); + } if (!handled && isDown) { int edgeSlop = mViewConfiguration.getScaledEdgeSlop(); @@ -2685,7 +2708,11 @@ public final class ViewRoot extends Handler implements ViewParent, public void dispatchPointer(MotionEvent event, long eventTime) { final ViewRoot viewRoot = mViewRoot.get(); - if (viewRoot != null) { + if (viewRoot != null) { + if (MEASURE_LATENCY) { + // Note: eventTime is in milliseconds + ViewRoot.lt.sample("* ViewRoot b4 dispatchPtr", System.nanoTime() - eventTime * 1000000); + } viewRoot.dispatchPointer(event, eventTime); } else { new EventCompletion(mMainLooper, this, null, true, event); diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java index b0e738c..d7457a0 100644 --- a/core/java/android/view/Window.java +++ b/core/java/android/view/Window.java @@ -376,8 +376,14 @@ public abstract class Window { String title; if (wp.type == WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA) { title="Media"; + } else if (wp.type == WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA_OVERLAY) { + title="MediaOvr"; } else if (wp.type == WindowManager.LayoutParams.TYPE_APPLICATION_PANEL) { title="Panel"; + } else if (wp.type == WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL) { + title="SubPanel"; + } else if (wp.type == WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG) { + title="AtchDlg"; } else { title=Integer.toString(wp.type); } diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index c69c281..ec2069c 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -210,6 +210,15 @@ public interface WindowManager extends ViewManager { public static final int TYPE_APPLICATION_ATTACHED_DIALOG = FIRST_SUB_WINDOW+3; /** + * Window type: window for showing overlays on top of media windows. + * These windows are displayed between TYPE_APPLICATION_MEDIA and the + * application window. They should be translucent to be useful. This + * is a big ugly hack so: + * @hide + */ + public static final int TYPE_APPLICATION_MEDIA_OVERLAY = FIRST_SUB_WINDOW+4; + + /** * End of types of sub-windows. */ public static final int LAST_SUB_WINDOW = 1999; @@ -466,6 +475,15 @@ public interface WindowManager extends ViewManager { */ public static final int FLAG_WATCH_OUTSIDE_TOUCH = 0x00040000; + /** Window flag: special flag to let windows be shown when the screen + * is locked. This will let application windows take precedence over + * key guard or any other lock screens. Can be used with + * {@link #FLAG_KEEP_SCREEN_ON} to turn screen on and display windows + * directly before showing the key guard window + * + * {@hide} */ + public static final int FLAG_SHOW_WHEN_LOCKED = 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. diff --git a/core/java/android/webkit/gears/AndroidRadioDataProvider.java b/core/java/android/webkit/gears/AndroidRadioDataProvider.java index 2d431a8..1384042 100644 --- a/core/java/android/webkit/gears/AndroidRadioDataProvider.java +++ b/core/java/android/webkit/gears/AndroidRadioDataProvider.java @@ -28,6 +28,7 @@ package android.webkit.gears; import android.content.Context; import android.telephony.CellLocation; import android.telephony.ServiceState; +import android.telephony.SignalStrength; import android.telephony.gsm.GsmCellLocation; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; @@ -54,6 +55,7 @@ public final class AndroidRadioDataProvider extends PhoneStateListener { public static final class RadioData { public int cellId = -1; public int locationAreaCode = -1; + // TODO: use new SignalStrength instead of asu public int signalStrength = -1; public int mobileCountryCode = -1; public int mobileNetworkCode = -1; @@ -179,6 +181,7 @@ public final class AndroidRadioDataProvider extends PhoneStateListener { private CellLocation cellLocation = null; /** The last known signal strength */ + // TODO: use new SignalStrength instead of asu private int signalStrength = -1; /** The last known serviceState */ @@ -207,7 +210,7 @@ public final class AndroidRadioDataProvider extends PhoneStateListener { // Register for cell id, signal strength and service state changed // notifications. telephonyManager.listen(this, PhoneStateListener.LISTEN_CELL_LOCATION - | PhoneStateListener.LISTEN_SIGNAL_STRENGTH + | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS | PhoneStateListener.LISTEN_SERVICE_STATE); } @@ -226,8 +229,9 @@ public final class AndroidRadioDataProvider extends PhoneStateListener { } @Override - public void onSignalStrengthChanged(int asu) { - signalStrength = asu; + public void onSignalStrengthsChanged(SignalStrength ss) { + int gsmSignalStrength = ss.getGsmSignalStrength(); + signalStrength = (gsmSignalStrength == 99 ? -1 : gsmSignalStrength); notifyListeners(); } diff --git a/core/java/android/widget/ExpandableListView.java b/core/java/android/widget/ExpandableListView.java index 0fc8f49..5360621 100644 --- a/core/java/android/widget/ExpandableListView.java +++ b/core/java/android/widget/ExpandableListView.java @@ -1083,6 +1083,11 @@ public class ExpandableListView extends ListView { @Override public void onRestoreInstanceState(Parcelable state) { + if (!(state instanceof SavedState)) { + super.onRestoreInstanceState(state); + return; + } + SavedState ss = (SavedState) state; super.onRestoreInstanceState(ss.getSuperState()); diff --git a/core/java/android/widget/ImageButton.java b/core/java/android/widget/ImageButton.java index 4c1cbf6..d417e40 100644 --- a/core/java/android/widget/ImageButton.java +++ b/core/java/android/widget/ImageButton.java @@ -27,9 +27,35 @@ import java.util.Map; /** * <p> - * An image button displays an image that can be pressed, or clicked, by the - * user. - * </p> + * Displays a button with an image (instead of text) that can be pressed + * or clicked by the user. By default, an ImageButton looks like a regular + * {@link android.widget.Button}, with the standard button background + * that changes color during different button states. The image on the surface + * of the button is defined either by the {@code android:src} attribute in the + * {@code <ImageButton>} XML element or by the + * {@link #setImageResource(int)} method.</p> + * + * <p>To remove the standard button background image, define your own + * background image or set the background color to be transparent.</p> + * <p>To indicate the different button states (focused, selected, etc.), you can + * define a different image for each state. E.g., a blue image by default, an + * orange one for when focused, and a yellow one for when pressed. An easy way to + * do this is with an XML drawable "selector." For example:</p> + * <pre> + * <?xml version="1.0" encoding="utf-8"?> + * <selector xmlns:android="http://schemas.android.com/apk/res/android"> + * <item android:drawable="@drawable/button_normal" /> <!-- default --> + * <item android:state_pressed="true" + * android:drawable="@drawable/button_pressed" /> <!-- pressed --> + * <item android:state_focused="true" + * android:drawable="@drawable/button_focused" /> <!-- focused --> + * </selector></pre> + * + * <p>Save the XML file in your project {@code res/drawable/} folder and then + * reference it as a drawable for the source of your ImageButton (in the + * {@code android:src} attribute). Android will automatically change the image + * based on the state of the button and the corresponding images + * defined in the XML.</p> * * <p><strong>XML attributes</strong></p> * <p> diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java index c21c7fa..6686f75 100644 --- a/core/java/android/widget/ListView.java +++ b/core/java/android/widget/ListView.java @@ -21,6 +21,7 @@ import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Rect; import android.graphics.PixelFormat; +import android.graphics.Paint; import android.graphics.drawable.Drawable; import android.graphics.drawable.ColorDrawable; import android.os.Parcel; @@ -133,6 +134,7 @@ public class ListView extends AbsListView { // used for temporary calculations. private final Rect mTempRect = new Rect(); + private Paint mDividerPaint; // the single allocated result per list view; kinda cheesey but avoids // allocating these thingies too often. @@ -2813,12 +2815,20 @@ public class ListView extends AbsListView { */ @Override public boolean isOpaque() { - return (mCachingStarted && mIsCacheColorOpaque && mDividerIsOpaque) || super.isOpaque(); + return (mCachingStarted && mIsCacheColorOpaque && mDividerIsOpaque && + hasOpaqueScrollbars()) || super.isOpaque(); } @Override public void setCacheColorHint(int color) { - mIsCacheColorOpaque = (color >>> 24) == 0xFF; + final boolean opaque = (color >>> 24) == 0xFF; + mIsCacheColorOpaque = opaque; + if (opaque) { + if (mDividerPaint == null) { + mDividerPaint = new Paint(); + } + mDividerPaint.setColor(color); + } super.setCacheColorHint(color); } @@ -2841,6 +2851,8 @@ public class ListView extends AbsListView { final int first = mFirstPosition; final boolean areAllItemsSelectable = mAreAllItemsSelectable; final ListAdapter adapter = mAdapter; + final boolean isOpaque = isOpaque(); + final Paint paint = mDividerPaint; if (!mStackFromBottom) { int bottom; @@ -2852,12 +2864,18 @@ public class ListView extends AbsListView { View child = getChildAt(i); bottom = child.getBottom(); // Don't draw dividers next to items that are not enabled - if (bottom < listBottom && (areAllItemsSelectable || - (adapter.isEnabled(first + i) && (i == count - 1 || - adapter.isEnabled(first + i + 1))))) { - bounds.top = bottom; - bounds.bottom = bottom + dividerHeight; - drawDivider(canvas, bounds, i); + if (bottom < listBottom) { + if ((areAllItemsSelectable || + (adapter.isEnabled(first + i) && (i == count - 1 || + adapter.isEnabled(first + i + 1))))) { + bounds.top = bottom; + bounds.bottom = bottom + dividerHeight; + drawDivider(canvas, bounds, i); + } else if (isOpaque) { + bounds.top = bottom; + bounds.bottom = bottom + dividerHeight; + canvas.drawRect(bounds, paint); + } } } } @@ -2871,16 +2889,22 @@ public class ListView extends AbsListView { View child = getChildAt(i); top = child.getTop(); // Don't draw dividers next to items that are not enabled - if (top > listTop && (areAllItemsSelectable || - (adapter.isEnabled(first + i) && (i == count - 1 || - adapter.isEnabled(first + i + 1))))) { - bounds.top = top - dividerHeight; - bounds.bottom = top; - // Give the method the child ABOVE the divider, so we - // subtract one from our child - // position. Give -1 when there is no child above the - // divider. - drawDivider(canvas, bounds, i - 1); + if (top > listTop) { + if ((areAllItemsSelectable || + (adapter.isEnabled(first + i) && (i == count - 1 || + adapter.isEnabled(first + i + 1))))) { + bounds.top = top - dividerHeight; + bounds.bottom = top; + // Give the method the child ABOVE the divider, so we + // subtract one from our child + // position. Give -1 when there is no child above the + // divider. + drawDivider(canvas, bounds, i - 1); + } else if (isOpaque) { + bounds.top = top - dividerHeight; + bounds.bottom = top; + canvas.drawRect(bounds, paint); + } } } } diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 219afec..40a72a4 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -1329,9 +1329,13 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } else { // We need to retain the last set padding, so just clear // out all of the fields in the existing structure. + if (dr.mDrawableLeft != null) dr.mDrawableLeft.setCallback(null); dr.mDrawableLeft = null; + if (dr.mDrawableTop != null) dr.mDrawableTop.setCallback(null); dr.mDrawableTop = null; + if (dr.mDrawableRight != null) dr.mDrawableRight.setCallback(null); dr.mDrawableRight = null; + if (dr.mDrawableBottom != null) dr.mDrawableBottom.setCallback(null); dr.mDrawableBottom = null; dr.mDrawableSizeLeft = dr.mDrawableHeightLeft = 0; dr.mDrawableSizeRight = dr.mDrawableHeightRight = 0; @@ -1344,19 +1348,32 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mDrawables = dr = new Drawables(); } + if (dr.mDrawableLeft != left && dr.mDrawableLeft != null) { + dr.mDrawableLeft.setCallback(null); + } dr.mDrawableLeft = left; + if (dr.mDrawableTop != left && dr.mDrawableTop != null) { + dr.mDrawableTop.setCallback(null); + } dr.mDrawableTop = top; + if (dr.mDrawableRight != left && dr.mDrawableRight != null) { + dr.mDrawableRight.setCallback(null); + } dr.mDrawableRight = right; + if (dr.mDrawableBottom != left && dr.mDrawableBottom != null) { + dr.mDrawableBottom.setCallback(null); + } dr.mDrawableBottom = bottom; final Rect compoundRect = dr.mCompoundRect; - int[] state = null; + int[] state; state = getDrawableState(); if (left != null) { left.setState(state); left.copyBounds(compoundRect); + left.setCallback(this); dr.mDrawableSizeLeft = compoundRect.width(); dr.mDrawableHeightLeft = compoundRect.height(); } else { @@ -1366,6 +1383,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (right != null) { right.setState(state); right.copyBounds(compoundRect); + right.setCallback(this); dr.mDrawableSizeRight = compoundRect.width(); dr.mDrawableHeightRight = compoundRect.height(); } else { @@ -1375,6 +1393,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (top != null) { top.setState(state); top.copyBounds(compoundRect); + top.setCallback(this); dr.mDrawableSizeTop = compoundRect.height(); dr.mDrawableWidthTop = compoundRect.width(); } else { @@ -1384,6 +1403,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (bottom != null) { bottom.setState(state); bottom.copyBounds(compoundRect); + bottom.setCallback(this); dr.mDrawableSizeBottom = compoundRect.height(); dr.mDrawableWidthBottom = compoundRect.width(); } else { @@ -3681,6 +3701,54 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } @Override + public void invalidateDrawable(Drawable drawable) { + if (verifyDrawable(drawable)) { + final Rect dirty = drawable.getBounds(); + int scrollX = mScrollX; + int scrollY = mScrollY; + + // IMPORTANT: The coordinates below are based on the coordinates computed + // for each compound drawable in onDraw(). Make sure to update each section + // accordingly. + final TextView.Drawables drawables = mDrawables; + if (drawables != null) { + if (drawable == drawables.mDrawableLeft) { + final int compoundPaddingTop = getCompoundPaddingTop(); + final int compoundPaddingBottom = getCompoundPaddingBottom(); + final int vspace = mBottom - mTop - compoundPaddingBottom - compoundPaddingTop; + + scrollX += mPaddingLeft; + scrollY += compoundPaddingTop + (vspace - drawables.mDrawableHeightLeft) / 2; + } else if (drawable == drawables.mDrawableRight) { + final int compoundPaddingTop = getCompoundPaddingTop(); + final int compoundPaddingBottom = getCompoundPaddingBottom(); + final int vspace = mBottom - mTop - compoundPaddingBottom - compoundPaddingTop; + + scrollX += (mRight - mLeft - mPaddingRight - drawables.mDrawableSizeRight); + scrollY += compoundPaddingTop + (vspace - drawables.mDrawableHeightRight) / 2; + } else if (drawable == drawables.mDrawableTop) { + final int compoundPaddingLeft = getCompoundPaddingLeft(); + final int compoundPaddingRight = getCompoundPaddingRight(); + final int hspace = mRight - mLeft - compoundPaddingRight - compoundPaddingLeft; + + scrollX += compoundPaddingLeft + (hspace - drawables.mDrawableWidthTop) / 2; + scrollY += mPaddingTop; + } else if (drawable == drawables.mDrawableBottom) { + final int compoundPaddingLeft = getCompoundPaddingLeft(); + final int compoundPaddingRight = getCompoundPaddingRight(); + final int hspace = mRight - mLeft - compoundPaddingRight - compoundPaddingLeft; + + scrollX += compoundPaddingLeft + (hspace - drawables.mDrawableWidthBottom) / 2; + scrollY += (mBottom - mTop - mPaddingBottom - drawables.mDrawableSizeBottom); + } + } + + invalidate(dirty.left + scrollX, dirty.top + scrollY, + dirty.right + scrollX, dirty.bottom + scrollY); + } + } + + @Override protected void onDraw(Canvas canvas) { restartMarqueeIfNeeded(); @@ -3708,6 +3776,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener int vspace = bottom - top - compoundPaddingBottom - compoundPaddingTop; int hspace = right - left - compoundPaddingRight - compoundPaddingLeft; + // IMPORTANT: The coordinates computed are also used in invalidateDrawable() + // Make sure to update invalidateDrawable() when changing this code. if (dr.mDrawableLeft != null) { canvas.save(); canvas.translate(scrollX + mPaddingLeft, @@ -3717,6 +3787,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener canvas.restore(); } + // IMPORTANT: The coordinates computed are also used in invalidateDrawable() + // Make sure to update invalidateDrawable() when changing this code. if (dr.mDrawableRight != null) { canvas.save(); canvas.translate(scrollX + right - left - mPaddingRight - dr.mDrawableSizeRight, @@ -3725,6 +3797,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener canvas.restore(); } + // IMPORTANT: The coordinates computed are also used in invalidateDrawable() + // Make sure to update invalidateDrawable() when changing this code. if (dr.mDrawableTop != null) { canvas.save(); canvas.translate(scrollX + compoundPaddingLeft + (hspace - dr.mDrawableWidthTop) / 2, @@ -3733,6 +3807,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener canvas.restore(); } + // IMPORTANT: The coordinates computed are also used in invalidateDrawable() + // Make sure to update invalidateDrawable() when changing this code. if (dr.mDrawableBottom != null) { canvas.save(); canvas.translate(scrollX + compoundPaddingLeft + diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl index e1ff2a5..ce32754 100644 --- a/core/java/com/android/internal/app/IBatteryStats.aidl +++ b/core/java/com/android/internal/app/IBatteryStats.aidl @@ -18,6 +18,8 @@ package com.android.internal.app; import com.android.internal.os.BatteryStatsImpl; +import android.telephony.SignalStrength; + interface IBatteryStats { byte[] getStatistics(); void noteStartWakelock(int uid, String name, int type); @@ -33,7 +35,7 @@ interface IBatteryStats { void noteUserActivity(int uid, int event); void notePhoneOn(); void notePhoneOff(); - void notePhoneSignalStrength(int asu); + void notePhoneSignalStrength(in SignalStrength signalStrength); void notePhoneDataConnectionState(int dataType, boolean hasData); void noteWifiOn(int uid); void noteWifiOff(int uid); diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index e8356a2..bf9bc4e 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -23,6 +23,7 @@ import android.os.ParcelFormatException; import android.os.Parcelable; import android.os.Process; import android.os.SystemClock; +import android.telephony.SignalStrength; import android.telephony.TelephonyManager; import android.util.Log; import android.util.PrintWriterPrinter; @@ -54,7 +55,7 @@ public final class BatteryStatsImpl extends BatteryStats { private static final int MAGIC = 0xBA757475; // 'BATSTATS' // Current on-disk Parcel version - private static final int VERSION = 34; + private static final int VERSION = 35; private final File mFile; private final File mBackupFile; @@ -982,14 +983,25 @@ public final class BatteryStatsImpl extends BatteryStats { } } - public void notePhoneSignalStrengthLocked(int asu) { + public void notePhoneSignalStrengthLocked(SignalStrength signalStrength) { // Bin the strength. int bin; - if (asu < 0 || asu >= 99) bin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; - else if (asu >= 16) bin = SIGNAL_STRENGTH_GREAT; - else if (asu >= 8) bin = SIGNAL_STRENGTH_GOOD; - else if (asu >= 4) bin = SIGNAL_STRENGTH_MODERATE; - else bin = SIGNAL_STRENGTH_POOR; + + if (!signalStrength.isGsm()) { + int dBm = signalStrength.getCdmaDbm(); + if (dBm >= -75) bin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; + else if (dBm >= -85) bin = SIGNAL_STRENGTH_GREAT; + else if (dBm >= -95) bin = SIGNAL_STRENGTH_GOOD; + else if (dBm >= -100) bin = SIGNAL_STRENGTH_MODERATE; + else bin = SIGNAL_STRENGTH_POOR; + } else { + int asu = signalStrength.getGsmSignalStrength(); + if (asu < 0 || asu >= 99) bin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; + else if (asu >= 16) bin = SIGNAL_STRENGTH_GREAT; + else if (asu >= 8) bin = SIGNAL_STRENGTH_GOOD; + else if (asu >= 4) bin = SIGNAL_STRENGTH_MODERATE; + else bin = SIGNAL_STRENGTH_POOR; + } if (mPhoneSignalStrengthBin != bin) { if (mPhoneSignalStrengthBin >= 0) { mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].stopRunningLocked(this); diff --git a/core/java/com/google/android/net/GoogleHttpClient.java b/core/java/com/google/android/net/GoogleHttpClient.java index 871c925..922f5be 100644 --- a/core/java/com/google/android/net/GoogleHttpClient.java +++ b/core/java/com/google/android/net/GoogleHttpClient.java @@ -37,6 +37,10 @@ import org.apache.http.client.HttpClient; import org.apache.http.client.ResponseHandler; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.conn.ClientConnectionManager; +import org.apache.http.conn.scheme.LayeredSocketFactory; +import org.apache.http.conn.scheme.Scheme; +import org.apache.http.conn.scheme.SchemeRegistry; +import org.apache.http.conn.scheme.SocketFactory; import org.apache.http.impl.client.EntityEnclosingRequestWrapper; import org.apache.http.impl.client.RequestWrapper; import org.apache.http.params.HttpParams; @@ -44,6 +48,8 @@ import org.apache.http.protocol.HttpContext; import org.apache.harmony.xnet.provider.jsse.SSLClientSessionCache; import java.io.IOException; +import java.net.InetAddress; +import java.net.Socket; import java.net.URI; import java.net.URISyntaxException; @@ -66,25 +72,22 @@ public class GoogleHttpClient implements HttpClient { private final AndroidHttpClient mClient; private final ContentResolver mResolver; - private final String mUserAgent; + private final String mAppName, mUserAgent; + private final ThreadLocal<Boolean> mConnectionAllocated = new ThreadLocal<Boolean>(); /** - * Create an HTTP client. Normally one client is shared throughout an app. - * @param resolver to use for accessing URL rewriting rules. - * @param userAgent to report in your HTTP requests. - * @deprecated Use {@link #GoogleHttpClient(android.content.ContentResolver, String, boolean)} + * Create an HTTP client without SSL session persistence. + * @deprecated Use {@link #GoogleHttpClient(android.content.Context, String, boolean)} */ public GoogleHttpClient(ContentResolver resolver, String userAgent) { mClient = AndroidHttpClient.newInstance(userAgent); mResolver = resolver; - mUserAgent = userAgent; + mUserAgent = mAppName = userAgent; } /** - * GoogleHttpClient(Context, String, boolean) - without SSL session - * persistence. - * - * @deprecated use Context instead of ContentResolver. + * Create an HTTP client without SSL session persistence. + * @deprecated Use {@link #GoogleHttpClient(android.content.Context, String, boolean)} */ public GoogleHttpClient(ContentResolver resolver, String appAndVersion, boolean gzipCapable) { @@ -111,21 +114,72 @@ public class GoogleHttpClient implements HttpClient { * headers. Needed because Google servers require gzip in the User-Agent * in order to return gzip'd content. */ - public GoogleHttpClient(Context context, String appAndVersion, - boolean gzipCapable) { - this(context.getContentResolver(), SSLClientSessionCacheFactory.getCache(context), + public GoogleHttpClient(Context context, String appAndVersion, boolean gzipCapable) { + this(context.getContentResolver(), + SSLClientSessionCacheFactory.getCache(context), appAndVersion, gzipCapable); } - private GoogleHttpClient(ContentResolver resolver, SSLClientSessionCache cache, + private GoogleHttpClient(ContentResolver resolver, + SSLClientSessionCache cache, String appAndVersion, boolean gzipCapable) { String userAgent = appAndVersion + " (" + Build.DEVICE + " " + Build.ID + ")"; if (gzipCapable) { userAgent = userAgent + "; gzip"; } + mClient = AndroidHttpClient.newInstance(userAgent, cache); mResolver = resolver; + mAppName = appAndVersion; mUserAgent = userAgent; + + // Wrap all the socket factories with the appropriate wrapper. (Apache + // HTTP, curse its black and stupid heart, inspects the SocketFactory to + // see if it's a LayeredSocketFactory, so we need two wrapper classes.) + SchemeRegistry registry = getConnectionManager().getSchemeRegistry(); + for (String name : registry.getSchemeNames()) { + Scheme scheme = registry.unregister(name); + SocketFactory sf = scheme.getSocketFactory(); + if (sf instanceof LayeredSocketFactory) { + sf = new WrappedLayeredSocketFactory((LayeredSocketFactory) sf); + } else { + sf = new WrappedSocketFactory(sf); + } + registry.register(new Scheme(name, sf, scheme.getDefaultPort())); + } + } + + /** + * Delegating wrapper for SocketFactory records when sockets are connected. + * We use this to know whether a connection was created vs reused, to + * gather per-app statistics about connection reuse rates. + * (Note, we record only *connection*, not *creation* of sockets -- + * what we care about is the network overhead of an actual TCP connect.) + */ + private class WrappedSocketFactory implements SocketFactory { + private SocketFactory mDelegate; + private WrappedSocketFactory(SocketFactory delegate) { mDelegate = delegate; } + public final Socket createSocket() throws IOException { return mDelegate.createSocket(); } + public final boolean isSecure(Socket s) { return mDelegate.isSecure(s); } + + public final Socket connectSocket( + Socket s, String h, int p, + InetAddress la, int lp, HttpParams params) throws IOException { + mConnectionAllocated.set(Boolean.TRUE); + return mDelegate.connectSocket(s, h, p, la, lp, params); + } + } + + /** Like WrappedSocketFactory, but for the LayeredSocketFactory subclass. */ + private class WrappedLayeredSocketFactory + extends WrappedSocketFactory implements LayeredSocketFactory { + private LayeredSocketFactory mDelegate; + private WrappedLayeredSocketFactory(LayeredSocketFactory sf) { super(sf); mDelegate = sf; } + + public final Socket createSocket(Socket s, String host, int port, boolean autoClose) + throws IOException { + return mDelegate.createSocket(s, host, port, autoClose); + } } /** @@ -140,24 +194,21 @@ public class GoogleHttpClient implements HttpClient { public HttpResponse executeWithoutRewriting( HttpUriRequest request, HttpContext context) throws IOException { - String code = "Error"; + int code = -1; long start = SystemClock.elapsedRealtime(); try { HttpResponse response; - // TODO: if we're logging network stats, and if the apache library is configured - // to follow redirects, count each redirect as an additional round trip. + mConnectionAllocated.set(null); - // see if we're logging network stats. - boolean logNetworkStats = NetworkStatsEntity.shouldLogNetworkStats(); + if (NetworkStatsEntity.shouldLogNetworkStats()) { + // TODO: if we're logging network stats, and if the apache library is configured + // to follow redirects, count each redirect as an additional round trip. - if (logNetworkStats) { int uid = android.os.Process.myUid(); long startTx = NetStat.getUidTxBytes(uid); long startRx = NetStat.getUidRxBytes(uid); response = mClient.execute(request, context); - code = Integer.toString(response.getStatusLine().getStatusCode()); - HttpEntity origEntity = response == null ? null : response.getEntity(); if (origEntity != null) { // yeah, we compute the same thing below. we do need to compute this here @@ -165,30 +216,39 @@ public class GoogleHttpClient implements HttpClient { long now = SystemClock.elapsedRealtime(); long elapsed = now - start; NetworkStatsEntity entity = new NetworkStatsEntity(origEntity, - mUserAgent, uid, startTx, startRx, + mAppName, uid, startTx, startRx, elapsed /* response latency */, now /* processing start time */); response.setEntity(entity); } } else { response = mClient.execute(request, context); - code = Integer.toString(response.getStatusLine().getStatusCode()); } + code = response.getStatusLine().getStatusCode(); return response; - } catch (IOException e) { - code = "IOException"; - throw e; } finally { // Record some statistics to the checkin service about the outcome. // Note that this is only describing execute(), not body download. + // We assume the database writes are much faster than network I/O, + // and not worth running in a background thread or anything. try { long elapsed = SystemClock.elapsedRealtime() - start; ContentValues values = new ContentValues(); - values.put(Checkin.Stats.TAG, - Checkin.Stats.Tag.HTTP_STATUS + ":" + - mUserAgent + ":" + code); values.put(Checkin.Stats.COUNT, 1); values.put(Checkin.Stats.SUM, elapsed / 1000.0); + + values.put(Checkin.Stats.TAG, Checkin.Stats.Tag.HTTP_REQUEST + ":" + mAppName); + mResolver.insert(Checkin.Stats.CONTENT_URI, values); + + // No sockets and no exceptions means we successfully reused a connection + if (mConnectionAllocated.get() == null && code >= 0) { + values.put(Checkin.Stats.TAG, Checkin.Stats.Tag.HTTP_REUSED + ":" + mAppName); + mResolver.insert(Checkin.Stats.CONTENT_URI, values); + } + + String status = code < 0 ? "IOException" : Integer.toString(code); + values.put(Checkin.Stats.TAG, + Checkin.Stats.Tag.HTTP_STATUS + ":" + mAppName + ":" + status); mResolver.insert(Checkin.Stats.CONTENT_URI, values); } catch (Exception e) { Log.e(TAG, "Error recording stats", e); diff --git a/core/jni/ActivityManager.cpp b/core/jni/ActivityManager.cpp index 9017827..8950dfb 100644 --- a/core/jni/ActivityManager.cpp +++ b/core/jni/ActivityManager.cpp @@ -16,9 +16,9 @@ #include <unistd.h> #include <android_runtime/ActivityManager.h> -#include <utils/IBinder.h> -#include <utils/IServiceManager.h> -#include <utils/Parcel.h> +#include <binder/IBinder.h> +#include <binder/IServiceManager.h> +#include <binder/Parcel.h> #include <utils/String8.h> namespace android { diff --git a/core/jni/Android.mk b/core/jni/Android.mk index 702ea87..c07748e 100644 --- a/core/jni/Android.mk +++ b/core/jni/Android.mk @@ -104,7 +104,6 @@ LOCAL_SRC_FILES:= \ android_util_FileObserver.cpp \ android/opengl/poly_clip.cpp.arm \ android/opengl/util.cpp.arm \ - android_bluetooth_Database.cpp \ android_bluetooth_HeadsetBase.cpp \ android_bluetooth_common.cpp \ android_bluetooth_BluetoothAudioGateway.cpp \ @@ -118,6 +117,7 @@ LOCAL_SRC_FILES:= \ android_location_GpsLocationProvider.cpp \ com_android_internal_os_ZygoteInit.cpp \ com_android_internal_graphics_NativeUtils.cpp \ + android_backup_BackupDataOutput.cpp \ android_backup_FileBackupHelper.cpp LOCAL_C_INCLUDES += \ @@ -147,6 +147,7 @@ LOCAL_SHARED_LIBRARIES := \ libnativehelper \ libcutils \ libutils \ + libbinder \ libnetutils \ libui \ libskiagl \ diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index d1e87f3..144bf5d 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -19,11 +19,11 @@ //#define LOG_NDEBUG 0 #include <android_runtime/AndroidRuntime.h> -#include <utils/IBinder.h> -#include <utils/IServiceManager.h> +#include <binder/IBinder.h> +#include <binder/IServiceManager.h> #include <utils/Log.h> #include <utils/misc.h> -#include <utils/Parcel.h> +#include <binder/Parcel.h> #include <utils/string_array.h> #include <utils/threads.h> #include <cutils/properties.h> @@ -142,7 +142,6 @@ extern int register_android_security_Md5MessageDigest(JNIEnv *env); extern int register_android_text_AndroidCharacter(JNIEnv *env); extern int register_android_text_KeyCharacterMap(JNIEnv *env); extern int register_android_opengl_classes(JNIEnv *env); -extern int register_android_bluetooth_Database(JNIEnv* env); extern int register_android_bluetooth_HeadsetBase(JNIEnv* env); extern int register_android_bluetooth_BluetoothAudioGateway(JNIEnv* env); extern int register_android_bluetooth_RfcommSocket(JNIEnv *env); @@ -154,6 +153,7 @@ extern int register_android_ddm_DdmHandleNativeHeap(JNIEnv *env); extern int register_com_android_internal_os_ZygoteInit(JNIEnv* env); extern int register_android_util_Base64(JNIEnv* env); extern int register_android_location_GpsLocationProvider(JNIEnv* env); +extern int register_android_backup_BackupDataOutput(JNIEnv *env); extern int register_android_backup_FileBackupHelper(JNIEnv *env); static AndroidRuntime* gCurRuntime = NULL; @@ -1157,7 +1157,6 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_media_ToneGenerator), REG_JNI(register_android_opengl_classes), - REG_JNI(register_android_bluetooth_Database), REG_JNI(register_android_bluetooth_HeadsetBase), REG_JNI(register_android_bluetooth_BluetoothAudioGateway), REG_JNI(register_android_bluetooth_RfcommSocket), @@ -1169,6 +1168,7 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_ddm_DdmHandleNativeHeap), REG_JNI(register_android_util_Base64), REG_JNI(register_android_location_GpsLocationProvider), + REG_JNI(register_android_backup_BackupDataOutput), REG_JNI(register_android_backup_FileBackupHelper), }; diff --git a/core/jni/CursorWindow.cpp b/core/jni/CursorWindow.cpp index fb891c9..7864189 100644 --- a/core/jni/CursorWindow.cpp +++ b/core/jni/CursorWindow.cpp @@ -18,7 +18,7 @@ #define LOG_TAG "CursorWindow" #include <utils/Log.h> -#include <utils/MemoryDealer.h> +#include <binder/MemoryDealer.h> #include <assert.h> #include <string.h> diff --git a/core/jni/CursorWindow.h b/core/jni/CursorWindow.h index 0fb074f..e98b009 100644 --- a/core/jni/CursorWindow.h +++ b/core/jni/CursorWindow.h @@ -21,7 +21,7 @@ #include <stddef.h> #include <stdint.h> -#include <utils/MemoryDealer.h> +#include <binder/MemoryDealer.h> #include <utils/RefBase.h> #include <jni.h> diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp index 65f44d5..29d8d3c 100644 --- a/core/jni/android/graphics/Bitmap.cpp +++ b/core/jni/android/graphics/Bitmap.cpp @@ -5,7 +5,7 @@ #include "SkDither.h"
#include "SkUnPreMultiply.h"
-#include "Parcel.h"
+#include <binder/Parcel.h>
#include "android_util_Binder.h"
#include "android_nio_utils.h"
#include "CreateJavaOutputStreamAdaptor.h"
diff --git a/core/jni/android/graphics/Region.cpp b/core/jni/android/graphics/Region.cpp index 1dc0314..723cd37 100644 --- a/core/jni/android/graphics/Region.cpp +++ b/core/jni/android/graphics/Region.cpp @@ -134,7 +134,7 @@ static void Region_scale(JNIEnv* env, jobject region, jfloat scale, jobject dst) //////////////////////////////////////////////////////////////////////////////////////////////////////////// -#include "Parcel.h" +#include <binder/Parcel.h> #include "android_util_Binder.h" static SkRegion* Region_createFromParcel(JNIEnv* env, jobject clazz, jobject parcel) diff --git a/core/jni/android_backup_BackupDataOutput.cpp b/core/jni/android_backup_BackupDataOutput.cpp new file mode 100644 index 0000000..8fce2a2 --- /dev/null +++ b/core/jni/android_backup_BackupDataOutput.cpp @@ -0,0 +1,70 @@ +/* + * 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. + */ + +#define LOG_TAG "FileBackupHelper_native" +#include <utils/Log.h> + +#include "JNIHelp.h" +#include <android_runtime/AndroidRuntime.h> + +#include <utils/backup_helpers.h> + +namespace android +{ + +static jfieldID s_descriptorField = 0; + +static int +ctor_native(JNIEnv* env, jobject This, jobject fileDescriptor) +{ + int err; + + int fd = env->GetIntField(fileDescriptor, s_descriptorField); + if (fd == -1) { + return NULL; + } + + return (int)new BackupDataWriter(fd); +} + +static void +dtor_native(JNIEnv* env, jobject This, int fd) +{ + delete (BackupDataWriter*)fd; +} + +static const JNINativeMethod g_methods[] = { + { "ctor", "(Ljava/io/FileDescriptor;)I", (void*)ctor_native }, + { "dtor", "(I)V", (void*)dtor_native }, +}; + +int register_android_backup_BackupDataOutput(JNIEnv* env) +{ + LOGD("register_android_backup_BackupDataOutput"); + + jclass clazz; + + clazz = env->FindClass("java/io/FileDescriptor"); + LOG_FATAL_IF(clazz == NULL, "Unable to find class java.io.FileDescriptor"); + s_descriptorField = env->GetFieldID(clazz, "descriptor", "I"); + LOG_FATAL_IF(s_descriptorField == NULL, + "Unable to find descriptor field in java.io.FileDescriptor"); + + return AndroidRuntime::registerNativeMethods(env, "android/backup/BackupDataOutput", + g_methods, NELEM(g_methods)); +} + +} diff --git a/core/jni/android_backup_FileBackupHelper.cpp b/core/jni/android_backup_FileBackupHelper.cpp index c6de3a5..a05d812 100644 --- a/core/jni/android_backup_FileBackupHelper.cpp +++ b/core/jni/android_backup_FileBackupHelper.cpp @@ -28,7 +28,7 @@ namespace android static jfieldID s_descriptorField = 0; static int -performBackup_native(JNIEnv* env, jobject clazz, jstring basePath, jobject oldState, jobject data, +performBackup_native(JNIEnv* env, jobject clazz, jstring basePath, jobject oldState, int data, jobject newState, jobjectArray files) { int err; @@ -37,7 +37,7 @@ performBackup_native(JNIEnv* env, jobject clazz, jstring basePath, jobject oldSt LOGD("oldState=%p newState=%p data=%p\n", oldState, newState, data); int oldStateFD = oldState != NULL ? env->GetIntField(oldState, s_descriptorField) : -1; int newStateFD = env->GetIntField(newState, s_descriptorField); - int dataFD = env->GetIntField(data, s_descriptorField); + BackupDataWriter* dataStream = (BackupDataWriter*)data; char const* basePathUTF = env->GetStringUTFChars(basePath, NULL); LOGD("basePathUTF=\"%s\"\n", basePathUTF); @@ -47,7 +47,7 @@ performBackup_native(JNIEnv* env, jobject clazz, jstring basePath, jobject oldSt filesUTF[i] = env->GetStringUTFChars((jstring)env->GetObjectArrayElement(files, i), NULL); } - err = back_up_files(oldStateFD, dataFD, newStateFD, basePathUTF, filesUTF, fileCount); + err = back_up_files(oldStateFD, dataStream, newStateFD, basePathUTF, filesUTF, fileCount); for (int i=0; i<fileCount; i++) { env->ReleaseStringUTFChars((jstring)env->GetObjectArrayElement(files, i), filesUTF[i]); @@ -60,8 +60,7 @@ performBackup_native(JNIEnv* env, jobject clazz, jstring basePath, jobject oldSt static const JNINativeMethod g_methods[] = { { "performBackup_native", - "(Ljava/lang/String;Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;" - "Ljava/io/FileDescriptor;[Ljava/lang/String;)I", + "(Ljava/lang/String;Ljava/io/FileDescriptor;ILjava/io/FileDescriptor;[Ljava/lang/String;)I", (void*)performBackup_native }, }; diff --git a/core/jni/android_bluetooth_Database.cpp b/core/jni/android_bluetooth_Database.cpp deleted file mode 100644 index 136c9a3..0000000 --- a/core/jni/android_bluetooth_Database.cpp +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Copyright (C) 2007 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. - */ - -#define DBUS_CLASS_NAME BLUEZ_DBUS_BASE_IFC ".Database" -#define LOG_TAG "bluetooth_Database.cpp" - -#include "android_bluetooth_common.h" -#include "android_runtime/AndroidRuntime.h" -#include "JNIHelp.h" -#include "jni.h" -#include "utils/Log.h" - -#ifdef HAVE_BLUETOOTH -#include <dbus/dbus.h> -#endif - -namespace android { - -#ifdef HAVE_BLUETOOTH -static DBusConnection* conn = NULL; // Singleton thread-safe connection -#endif - -static void classInitNative(JNIEnv* env, jclass clazz) { - LOGV(__FUNCTION__); -#ifdef HAVE_BLUETOOTH - conn = NULL; -#endif -} - -static void initializeNativeDataNative(JNIEnv* env, jobject object) { - LOGV(__FUNCTION__); - -#ifdef HAVE_BLUETOOTH - if (conn == NULL) { - DBusError err; - dbus_error_init(&err); - dbus_threads_init_default(); - conn = dbus_bus_get(DBUS_BUS_SYSTEM, &err); - if (dbus_error_is_set(&err)) { - LOGE("Could not get onto the system bus!"); - dbus_error_free(&err); - } - } -#endif -} - -static void cleanupNativeDataNative(JNIEnv* env, jobject object) { - LOGV(__FUNCTION__); -} - -static jint addServiceRecordNative(JNIEnv *env, jobject object, - jbyteArray record) { - LOGV(__FUNCTION__); -#ifdef HAVE_BLUETOOTH - if (conn != NULL) { - jbyte* c_record = env->GetByteArrayElements(record, NULL); - DBusMessage *reply = dbus_func_args(env, - conn, - BLUEZ_DBUS_BASE_PATH, - DBUS_CLASS_NAME, - "AddServiceRecord", - DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, - &c_record, - env->GetArrayLength(record), - DBUS_TYPE_INVALID); - env->ReleaseByteArrayElements(record, c_record, JNI_ABORT); - return reply ? dbus_returns_uint32(env, reply) : -1; - } -#endif - return -1; -} - -static jint addServiceRecordFromXmlNative(JNIEnv *env, jobject object, - jstring record) { - LOGV(__FUNCTION__); -#ifdef HAVE_BLUETOOTH - if (conn != NULL) { - const char *c_record = env->GetStringUTFChars(record, NULL); - DBusMessage *reply = dbus_func_args(env, - conn, - BLUEZ_DBUS_BASE_PATH, - DBUS_CLASS_NAME, - "AddServiceRecordFromXML", - DBUS_TYPE_STRING, &c_record, - DBUS_TYPE_INVALID); - env->ReleaseStringUTFChars(record, c_record); - return reply ? dbus_returns_uint32(env, reply) : -1; - } -#endif - return -1; -} - -static void updateServiceRecordNative(JNIEnv *env, jobject object, - jint handle, - jbyteArray record) { - LOGV(__FUNCTION__); -#ifdef HAVE_BLUETOOTH - if (conn != NULL) { - jbyte* c_record = env->GetByteArrayElements(record, NULL); - DBusMessage *reply = dbus_func_args(env, - conn, - BLUEZ_DBUS_BASE_PATH, - DBUS_CLASS_NAME, - "UpdateServiceRecord", - DBUS_TYPE_UINT32, &handle, - DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, - &c_record, - env->GetArrayLength(record), - DBUS_TYPE_INVALID); - env->ReleaseByteArrayElements(record, c_record, JNI_ABORT); - } -#endif -} - -static void updateServiceRecordFromXmlNative(JNIEnv *env, jobject object, - jint handle, - jstring record) { - LOGV(__FUNCTION__); -#ifdef HAVE_BLUETOOTH - if (conn != NULL) { - const char *c_record = env->GetStringUTFChars(record, NULL); - DBusMessage *reply = dbus_func_args(env, - conn, - BLUEZ_DBUS_BASE_PATH, - DBUS_CLASS_NAME, - "UpdateServiceRecordFromXML", - DBUS_TYPE_UINT32, &handle, - DBUS_TYPE_STRING, &c_record, - DBUS_TYPE_INVALID); - env->ReleaseStringUTFChars(record, c_record); - } -#endif -} - -/* private static native void removeServiceRecordNative(int handle); */ -static void removeServiceRecordNative(JNIEnv *env, jobject object, - jint handle) { - LOGV(__FUNCTION__); -#ifdef HAVE_BLUETOOTH - if (conn != NULL) { - DBusMessage *reply = dbus_func_args(env, - conn, - BLUEZ_DBUS_BASE_PATH, - DBUS_CLASS_NAME, - "RemoveServiceRecord", - DBUS_TYPE_UINT32, &handle, - DBUS_TYPE_INVALID); - } -#endif -} - - -static JNINativeMethod sMethods[] = { - /* name, signature, funcPtr */ - {"classInitNative", "()V", (void*)classInitNative}, - {"initializeNativeDataNative", "()V", (void *)initializeNativeDataNative}, - {"cleanupNativeDataNative", "()V", (void *)cleanupNativeDataNative}, - {"addServiceRecordNative", "([B)I", (void*)addServiceRecordNative}, - {"addServiceRecordFromXmlNative", "(Ljava/lang/String;)I", (void*)addServiceRecordFromXmlNative}, - {"updateServiceRecordNative", "(I[B)V", (void*)updateServiceRecordNative}, - {"updateServiceRecordFromXmlNative", "(ILjava/lang/String;)V", (void*)updateServiceRecordFromXmlNative}, - {"removeServiceRecordNative", "(I)V", (void*)removeServiceRecordNative}, -}; - -int register_android_bluetooth_Database(JNIEnv *env) { - return AndroidRuntime::registerNativeMethods(env, - "android/bluetooth/Database", sMethods, NELEM(sMethods)); -} - -} /* namespace android */ diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp index c107993..31086b8 100644 --- a/core/jni/android_hardware_Camera.cpp +++ b/core/jni/android_hardware_Camera.cpp @@ -25,7 +25,7 @@ #include <ui/Surface.h> #include <ui/Camera.h> -#include <utils/IMemory.h> +#include <binder/IMemory.h> using namespace android; diff --git a/core/jni/android_location_GpsLocationProvider.cpp b/core/jni/android_location_GpsLocationProvider.cpp index 004b0e3..0858741 100644 --- a/core/jni/android_location_GpsLocationProvider.cpp +++ b/core/jni/android_location_GpsLocationProvider.cpp @@ -176,7 +176,7 @@ static jboolean android_location_GpsLocationProvider_start(JNIEnv* env, jobject { int result = sGpsInterface->set_position_mode(positionMode, (singleFix ? 0 : fixFrequency)); if (result) { - return result; + return false; } return (sGpsInterface->start() == 0); diff --git a/core/jni/android_media_AudioTrack.cpp b/core/jni/android_media_AudioTrack.cpp index 42ada54..0cce3a6 100644 --- a/core/jni/android_media_AudioTrack.cpp +++ b/core/jni/android_media_AudioTrack.cpp @@ -30,8 +30,8 @@ #include "media/AudioSystem.h" #include "media/AudioTrack.h" -#include <utils/MemoryHeapBase.h> -#include <utils/MemoryBase.h> +#include <binder/MemoryHeapBase.h> +#include <binder/MemoryBase.h> // ---------------------------------------------------------------------------- diff --git a/core/jni/android_opengl_GLES10.cpp b/core/jni/android_opengl_GLES10.cpp index 482d8eb..2685d75 100644 --- a/core/jni/android_opengl_GLES10.cpp +++ b/core/jni/android_opengl_GLES10.cpp @@ -133,6 +133,19 @@ releasePointer(JNIEnv *_env, jarray array, void *data, jboolean commit) commit ? 0 : JNI_ABORT); } +static void * +getDirectBufferPointer(JNIEnv *_env, jobject buffer) { + char* buf = (char*) _env->GetDirectBufferAddress(buffer); + if (buf) { + jint position = _env->GetIntField(buffer, positionID); + jint elementSizeShift = _env->GetIntField(buffer, elementSizeShiftID); + buf += position << elementSizeShift; + } else { + _env->ThrowNew(IAEClass, "Must use a native order direct Buffer"); + } + return (void*) buf; +} + static int getNumCompressedTextureFormats() { int numCompressedTextureFormats = 0; @@ -305,9 +318,8 @@ android_glColorPointerBounds__IIILjava_nio_Buffer_2I GLvoid *pointer = (GLvoid *) 0; if (pointer_buf) { - pointer = (GLvoid *) _env->GetDirectBufferAddress(pointer_buf); + pointer = (GLvoid *) getDirectBufferPointer(_env, pointer_buf); if ( ! pointer ) { - _env->ThrowNew(IAEClass, "Must use a native order direct Buffer"); return; } } @@ -2779,9 +2791,8 @@ android_glNormalPointerBounds__IILjava_nio_Buffer_2I GLvoid *pointer = (GLvoid *) 0; if (pointer_buf) { - pointer = (GLvoid *) _env->GetDirectBufferAddress(pointer_buf); + pointer = (GLvoid *) getDirectBufferPointer(_env, pointer_buf); if ( ! pointer ) { - _env->ThrowNew(IAEClass, "Must use a native order direct Buffer"); return; } } @@ -3034,9 +3045,8 @@ android_glTexCoordPointerBounds__IIILjava_nio_Buffer_2I GLvoid *pointer = (GLvoid *) 0; if (pointer_buf) { - pointer = (GLvoid *) _env->GetDirectBufferAddress(pointer_buf); + pointer = (GLvoid *) getDirectBufferPointer(_env, pointer_buf); if ( ! pointer ) { - _env->ThrowNew(IAEClass, "Must use a native order direct Buffer"); return; } } @@ -3392,9 +3402,8 @@ android_glVertexPointerBounds__IIILjava_nio_Buffer_2I GLvoid *pointer = (GLvoid *) 0; if (pointer_buf) { - pointer = (GLvoid *) _env->GetDirectBufferAddress(pointer_buf); + pointer = (GLvoid *) getDirectBufferPointer(_env, pointer_buf); if ( ! pointer ) { - _env->ThrowNew(IAEClass, "Must use a native order direct Buffer"); return; } } diff --git a/core/jni/android_text_format_Time.cpp b/core/jni/android_text_format_Time.cpp index 923e1aa..7c208e9 100644 --- a/core/jni/android_text_format_Time.cpp +++ b/core/jni/android_text_format_Time.cpp @@ -44,6 +44,7 @@ static jfieldID g_timezoneField = 0; static jfieldID g_shortMonthsField = 0; static jfieldID g_longMonthsField = 0; +static jfieldID g_longStandaloneMonthsField = 0; static jfieldID g_shortWeekdaysField = 0; static jfieldID g_longWeekdaysField = 0; static jfieldID g_timeOnlyFormatField = 0; @@ -193,6 +194,7 @@ static jstring android_text_format_Time_format(JNIEnv* env, jobject This, static jobject js_locale_previous = NULL; static struct strftime_locale locale; static jstring js_mon[12], js_month[12], js_wday[7], js_weekday[7]; + static jstring js_standalone_month[12]; static jstring js_X_fmt, js_x_fmt, js_c_fmt, js_am, js_pm, js_date_fmt; Time t; @@ -206,8 +208,10 @@ static jstring android_text_format_Time_format(JNIEnv* env, jobject This, for (int i = 0; i < 12; i++) { env->ReleaseStringUTFChars(js_mon[i], locale.mon[i]); env->ReleaseStringUTFChars(js_month[i], locale.month[i]); + env->ReleaseStringUTFChars(js_standalone_month[i], locale.standalone_month[i]); env->DeleteGlobalRef(js_mon[i]); env->DeleteGlobalRef(js_month[i]); + env->DeleteGlobalRef(js_standalone_month[i]); } for (int i = 0; i < 7; i++) { @@ -245,6 +249,12 @@ static jstring android_text_format_Time_format(JNIEnv* env, jobject This, locale.month[i] = env->GetStringUTFChars(js_month[i], NULL); } + ja = (jobjectArray) env->GetStaticObjectField(timeClass, g_longStandaloneMonthsField); + for (int i = 0; i < 12; i++) { + js_standalone_month[i] = (jstring) env->NewGlobalRef(env->GetObjectArrayElement(ja, i)); + locale.standalone_month[i] = env->GetStringUTFChars(js_standalone_month[i], NULL); + } + ja = (jobjectArray) env->GetStaticObjectField(timeClass, g_shortWeekdaysField); for (int i = 0; i < 7; i++) { js_wday[i] = (jstring) env->NewGlobalRef(env->GetObjectArrayElement(ja, i)); @@ -639,6 +649,7 @@ int register_android_text_format_Time(JNIEnv* env) g_shortMonthsField = env->GetStaticFieldID(timeClass, "sShortMonths", "[Ljava/lang/String;"); g_longMonthsField = env->GetStaticFieldID(timeClass, "sLongMonths", "[Ljava/lang/String;"); + g_longStandaloneMonthsField = env->GetStaticFieldID(timeClass, "sLongStandaloneMonths", "[Ljava/lang/String;"); g_shortWeekdaysField = env->GetStaticFieldID(timeClass, "sShortWeekdays", "[Ljava/lang/String;"); g_longWeekdaysField = env->GetStaticFieldID(timeClass, "sLongWeekdays", "[Ljava/lang/String;"); g_timeOnlyFormatField = env->GetStaticFieldID(timeClass, "sTimeOnlyFormat", "Ljava/lang/String;"); diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp index 7325432..f0885fd 100644 --- a/core/jni/android_util_Binder.cpp +++ b/core/jni/android_util_Binder.cpp @@ -25,12 +25,12 @@ #include <stdio.h> #include <utils/Atomic.h> -#include <utils/IInterface.h> -#include <utils/IPCThreadState.h> +#include <binder/IInterface.h> +#include <binder/IPCThreadState.h> #include <utils/Log.h> -#include <utils/Parcel.h> -#include <utils/ProcessState.h> -#include <utils/IServiceManager.h> +#include <binder/Parcel.h> +#include <binder/ProcessState.h> +#include <binder/IServiceManager.h> #include <android_runtime/AndroidRuntime.h> diff --git a/core/jni/android_util_Binder.h b/core/jni/android_util_Binder.h index 16d993d..495e76a 100644 --- a/core/jni/android_util_Binder.h +++ b/core/jni/android_util_Binder.h @@ -15,7 +15,7 @@ ** limitations under the License. */ -#include <utils/IBinder.h> +#include <binder/IBinder.h> #include "jni.h" diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp index d760feb..e8bffa4 100644 --- a/core/jni/android_util_Process.cpp +++ b/core/jni/android_util_Process.cpp @@ -18,9 +18,9 @@ #define LOG_TAG "Process" #include <utils/Log.h> -#include <utils/IPCThreadState.h> -#include <utils/ProcessState.h> -#include <utils/IServiceManager.h> +#include <binder/IPCThreadState.h> +#include <binder/ProcessState.h> +#include <binder/IServiceManager.h> #include <utils/String8.h> #include <utils/Vector.h> @@ -236,6 +236,36 @@ void android_os_Process_setThreadGroup(JNIEnv* env, jobject clazz, int pid, jint signalExceptionForGroupError(env, clazz, errno); } +void android_os_Process_setProcessGroup(JNIEnv* env, jobject clazz, int pid, jint grp) +{ + DIR *d; + FILE *fp; + char proc_path[255]; + struct dirent *de; + + if (grp > ANDROID_TGROUP_MAX || grp < 0) { + signalExceptionForGroupError(env, clazz, EINVAL); + return; + } + + sprintf(proc_path, "/proc/%d/task", pid); + if (!(d = opendir(proc_path))) { + signalExceptionForGroupError(env, clazz, errno); + return; + } + + while ((de = readdir(d))) { + if (de->d_name[0] == '.') + continue; + if (add_pid_to_cgroup(atoi(de->d_name), grp)) { + signalExceptionForGroupError(env, clazz, errno); + closedir(d); + return; + } + } + closedir(d); +} + void android_os_Process_setThreadPriority(JNIEnv* env, jobject clazz, jint pid, jint pri) { @@ -820,6 +850,7 @@ static const JNINativeMethod methods[] = { {"setThreadPriority", "(I)V", (void*)android_os_Process_setCallingThreadPriority}, {"getThreadPriority", "(I)I", (void*)android_os_Process_getThreadPriority}, {"setThreadGroup", "(II)V", (void*)android_os_Process_setThreadGroup}, + {"setProcessGroup", "(II)V", (void*)android_os_Process_setProcessGroup}, {"setOomAdj", "(II)Z", (void*)android_os_Process_setOomAdj}, {"setArgV0", "(Ljava/lang/String;)V", (void*)android_os_Process_setArgV0}, {"setUid", "(I)I", (void*)android_os_Process_setUid}, diff --git a/core/jni/com_google_android_gles_jni_GLImpl.cpp b/core/jni/com_google_android_gles_jni_GLImpl.cpp index 11822e0..15e3a81 100644 --- a/core/jni/com_google_android_gles_jni_GLImpl.cpp +++ b/core/jni/com_google_android_gles_jni_GLImpl.cpp @@ -133,6 +133,19 @@ releasePointer(JNIEnv *_env, jarray array, void *data, jboolean commit) commit ? 0 : JNI_ABORT); } +static void * +getDirectBufferPointer(JNIEnv *_env, jobject buffer) { + char* buf = (char*) _env->GetDirectBufferAddress(buffer); + if (buf) { + jint position = _env->GetIntField(buffer, positionID); + jint elementSizeShift = _env->GetIntField(buffer, elementSizeShiftID); + buf += position << elementSizeShift; + } else { + _env->ThrowNew(IAEClass, "Must use a native order direct Buffer"); + } + return (void*) buf; +} + static int getNumCompressedTextureFormats() { int numCompressedTextureFormats = 0; @@ -305,9 +318,8 @@ android_glColorPointerBounds__IIILjava_nio_Buffer_2I GLvoid *pointer = (GLvoid *) 0; if (pointer_buf) { - pointer = (GLvoid *) _env->GetDirectBufferAddress(pointer_buf); + pointer = (GLvoid *) getDirectBufferPointer(_env, pointer_buf); if ( ! pointer ) { - _env->ThrowNew(IAEClass, "Must use a native order direct Buffer"); return; } } @@ -2779,9 +2791,8 @@ android_glNormalPointerBounds__IILjava_nio_Buffer_2I GLvoid *pointer = (GLvoid *) 0; if (pointer_buf) { - pointer = (GLvoid *) _env->GetDirectBufferAddress(pointer_buf); + pointer = (GLvoid *) getDirectBufferPointer(_env, pointer_buf); if ( ! pointer ) { - _env->ThrowNew(IAEClass, "Must use a native order direct Buffer"); return; } } @@ -3034,9 +3045,8 @@ android_glTexCoordPointerBounds__IIILjava_nio_Buffer_2I GLvoid *pointer = (GLvoid *) 0; if (pointer_buf) { - pointer = (GLvoid *) _env->GetDirectBufferAddress(pointer_buf); + pointer = (GLvoid *) getDirectBufferPointer(_env, pointer_buf); if ( ! pointer ) { - _env->ThrowNew(IAEClass, "Must use a native order direct Buffer"); return; } } @@ -3392,9 +3402,8 @@ android_glVertexPointerBounds__IIILjava_nio_Buffer_2I GLvoid *pointer = (GLvoid *) 0; if (pointer_buf) { - pointer = (GLvoid *) _env->GetDirectBufferAddress(pointer_buf); + pointer = (GLvoid *) getDirectBufferPointer(_env, pointer_buf); if ( ! pointer ) { - _env->ThrowNew(IAEClass, "Must use a native order direct Buffer"); return; } } diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 05fbe64..b97e07b 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -220,12 +220,6 @@ android:label="@string/permlab_installLocationProvider" android:description="@string/permdesc_installLocationProvider" /> - <!-- Allows an application to install a location collector into the Location Manager --> - <permission android:name="android.permission.INSTALL_LOCATION_COLLECTOR" - android:protectionLevel="signatureOrSystem" - android:label="@string/permlab_installLocationCollector" - android:description="@string/permdesc_installLocationCollector" /> - <!-- ======================================= --> <!-- Permissions for accessing networks --> <!-- ======================================= --> @@ -389,11 +383,11 @@ android:description="@string/permgroupdesc_storage" /> <!-- Allows an application to write to the SD card --> - <permission android:name="android.permission.SDCARD_WRITE" + <permission android:name="android.permission.WRITE_SDCARD" android:permissionGroup="android.permission-group.STORAGE" android:label="@string/permlab_sdcardWrite" android:description="@string/permdesc_sdcardWrite" - android:protectionLevel="normal" /> + android:protectionLevel="dangerous" /> <!-- ============================================ --> <!-- Permissions for low-level system interaction --> @@ -803,14 +797,22 @@ android:description="@string/permdesc_runSetActivityWatcher" android:protectionLevel="signature" /> - <!-- Allows an application to watch and control how activities are - started globally in the system. Only for is in debugging - (usually the monkey command). --> + <!-- Allows an application to call the activity manager shutdown() API + to put the higher-level system there into a shutdown state. --> <permission android:name="android.permission.SHUTDOWN" android:label="@string/permlab_shutdown" android:description="@string/permdesc_shutdown" android:protectionLevel="signature" /> + <!-- Allows an application to tell the activity manager to temporarily + stop application switches, putting it into a special mode that + prevents applications from immediately switching away from some + critical UI such as the home screen. --> + <permission android:name="android.permission.STOP_APP_SWITCHES" + android:label="@string/permlab_stopAppSwitches" + android:description="@string/permdesc_stopAppSwitches" + android:protectionLevel="signature" /> + <!-- Allows an application to retrieve the current state of keys and switches. This is only for use by the system.--> <permission android:name="android.permission.READ_INPUT_STATE" @@ -973,7 +975,7 @@ android:permissionGroup="android.permission-group.PERSONAL_INFO" android:label="@string/permlab_bindGadget" android:description="@string/permdesc_bindGadget" - android:protectionLevel="signature" /> + android:protectionLevel="signatureOrSystem" /> <!-- Allows applications to change the background data setting @hide pending API council --> diff --git a/core/res/res/drawable/search_spinner.xml b/core/res/res/drawable/search_spinner.xml new file mode 100644 index 0000000..34c163d --- /dev/null +++ b/core/res/res/drawable/search_spinner.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** +** Copyright 2008, 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. +*/ +--> +<animation-list + xmlns:android="http://schemas.android.com/apk/res/android" + android:oneshot="false"> + <item android:drawable="@drawable/search_spinner_anim1" android:duration="150" /> + <item android:drawable="@drawable/search_spinner_anim2" android:duration="150" /> + <item android:drawable="@drawable/search_spinner_anim3" android:duration="150" /> + <item android:drawable="@drawable/search_spinner_anim4" android:duration="150" /> + <item android:drawable="@drawable/search_spinner_anim5" android:duration="150" /> + <item android:drawable="@drawable/search_spinner_anim6" android:duration="150" /> + <item android:drawable="@drawable/search_spinner_anim7" android:duration="150" /> + <item android:drawable="@drawable/search_spinner_anim8" android:duration="150" /> + <item android:drawable="@drawable/search_spinner_anim9" android:duration="150" /> + <item android:drawable="@drawable/search_spinner_anim10" android:duration="150" /> + <item android:drawable="@drawable/search_spinner_anim11" android:duration="150" /> + <item android:drawable="@drawable/search_spinner_anim12" android:duration="150" /> +</animation-list> + diff --git a/core/res/res/drawable/search_spinner_anim1.png b/core/res/res/drawable/search_spinner_anim1.png Binary files differnew file mode 100755 index 0000000..e55b60d --- /dev/null +++ b/core/res/res/drawable/search_spinner_anim1.png diff --git a/core/res/res/drawable/search_spinner_anim10.png b/core/res/res/drawable/search_spinner_anim10.png Binary files differnew file mode 100755 index 0000000..9611d97 --- /dev/null +++ b/core/res/res/drawable/search_spinner_anim10.png diff --git a/core/res/res/drawable/search_spinner_anim11.png b/core/res/res/drawable/search_spinner_anim11.png Binary files differnew file mode 100755 index 0000000..4261704 --- /dev/null +++ b/core/res/res/drawable/search_spinner_anim11.png diff --git a/core/res/res/drawable/search_spinner_anim12.png b/core/res/res/drawable/search_spinner_anim12.png Binary files differnew file mode 100755 index 0000000..0602314 --- /dev/null +++ b/core/res/res/drawable/search_spinner_anim12.png diff --git a/core/res/res/drawable/search_spinner_anim2.png b/core/res/res/drawable/search_spinner_anim2.png Binary files differnew file mode 100755 index 0000000..05d58e0 --- /dev/null +++ b/core/res/res/drawable/search_spinner_anim2.png diff --git a/core/res/res/drawable/search_spinner_anim3.png b/core/res/res/drawable/search_spinner_anim3.png Binary files differnew file mode 100755 index 0000000..69fa9c1 --- /dev/null +++ b/core/res/res/drawable/search_spinner_anim3.png diff --git a/core/res/res/drawable/search_spinner_anim4.png b/core/res/res/drawable/search_spinner_anim4.png Binary files differnew file mode 100755 index 0000000..9201bac --- /dev/null +++ b/core/res/res/drawable/search_spinner_anim4.png diff --git a/core/res/res/drawable/search_spinner_anim5.png b/core/res/res/drawable/search_spinner_anim5.png Binary files differnew file mode 100755 index 0000000..f0c7101 --- /dev/null +++ b/core/res/res/drawable/search_spinner_anim5.png diff --git a/core/res/res/drawable/search_spinner_anim6.png b/core/res/res/drawable/search_spinner_anim6.png Binary files differnew file mode 100755 index 0000000..99d1d4e --- /dev/null +++ b/core/res/res/drawable/search_spinner_anim6.png diff --git a/core/res/res/drawable/search_spinner_anim7.png b/core/res/res/drawable/search_spinner_anim7.png Binary files differnew file mode 100755 index 0000000..8ca3358 --- /dev/null +++ b/core/res/res/drawable/search_spinner_anim7.png diff --git a/core/res/res/drawable/search_spinner_anim8.png b/core/res/res/drawable/search_spinner_anim8.png Binary files differnew file mode 100755 index 0000000..408d723 --- /dev/null +++ b/core/res/res/drawable/search_spinner_anim8.png diff --git a/core/res/res/drawable/search_spinner_anim9.png b/core/res/res/drawable/search_spinner_anim9.png Binary files differnew file mode 100755 index 0000000..42a2c65 --- /dev/null +++ b/core/res/res/drawable/search_spinner_anim9.png diff --git a/core/res/res/drawable/stat_ecb_mode.png b/core/res/res/drawable/stat_ecb_mode.png Binary files differnew file mode 100644 index 0000000..a948770 --- /dev/null +++ b/core/res/res/drawable/stat_ecb_mode.png diff --git a/core/res/res/drawable/stat_sys_data_dormant_1xrtt.png b/core/res/res/drawable/stat_sys_data_dormant_1xrtt.png Binary files differnew file mode 100755 index 0000000..11c2eae --- /dev/null +++ b/core/res/res/drawable/stat_sys_data_dormant_1xrtt.png diff --git a/core/res/res/drawable/stat_sys_data_dormant_evdo.png b/core/res/res/drawable/stat_sys_data_dormant_evdo.png Binary files differnew file mode 100755 index 0000000..811fcb5 --- /dev/null +++ b/core/res/res/drawable/stat_sys_data_dormant_evdo.png diff --git a/core/res/res/drawable/stat_sys_roaming_cdma_0.png b/core/res/res/drawable/stat_sys_roaming_cdma_0.png Binary files differnew file mode 100755 index 0000000..c61cce7 --- /dev/null +++ b/core/res/res/drawable/stat_sys_roaming_cdma_0.png diff --git a/core/res/res/drawable/stat_sys_roaming_cdma_flash.xml b/core/res/res/drawable/stat_sys_roaming_cdma_flash.xml new file mode 100644 index 0000000..07dc446 --- /dev/null +++ b/core/res/res/drawable/stat_sys_roaming_cdma_flash.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* //device/apps/common/res/drawable/stat_sys_battery.xml +** +** Copyright 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. +*/ +--> +<animation-list + xmlns:android="http://schemas.android.com/apk/res/android" + android:oneshot="false"> + <item android:drawable="@drawable/stat_sys_roaming_cdma_flash_anim0" android:duration="800" /> + <item android:drawable="@drawable/stat_sys_roaming_cdma_flash_anim1" android:duration="1200" /> +</animation-list> diff --git a/core/res/res/drawable/stat_sys_roaming_cdma_flash_anim0.png b/core/res/res/drawable/stat_sys_roaming_cdma_flash_anim0.png Binary files differnew file mode 100755 index 0000000..d62502d --- /dev/null +++ b/core/res/res/drawable/stat_sys_roaming_cdma_flash_anim0.png diff --git a/core/res/res/drawable/stat_sys_roaming_cdma_flash_anim1.png b/core/res/res/drawable/stat_sys_roaming_cdma_flash_anim1.png Binary files differnew file mode 100755 index 0000000..c61cce7 --- /dev/null +++ b/core/res/res/drawable/stat_sys_roaming_cdma_flash_anim1.png diff --git a/core/res/res/drawable/stat_sys_signal_cdma_0.png b/core/res/res/drawable/stat_sys_signal_cdma_0.png Binary files differnew file mode 100755 index 0000000..0ef7d53 --- /dev/null +++ b/core/res/res/drawable/stat_sys_signal_cdma_0.png diff --git a/core/res/res/drawable/stat_sys_signal_cdma_1.png b/core/res/res/drawable/stat_sys_signal_cdma_1.png Binary files differnew file mode 100755 index 0000000..f4839d4 --- /dev/null +++ b/core/res/res/drawable/stat_sys_signal_cdma_1.png diff --git a/core/res/res/drawable/stat_sys_signal_cdma_2.png b/core/res/res/drawable/stat_sys_signal_cdma_2.png Binary files differnew file mode 100755 index 0000000..e25a99c --- /dev/null +++ b/core/res/res/drawable/stat_sys_signal_cdma_2.png diff --git a/core/res/res/drawable/stat_sys_signal_cdma_3.png b/core/res/res/drawable/stat_sys_signal_cdma_3.png Binary files differnew file mode 100755 index 0000000..d828d99 --- /dev/null +++ b/core/res/res/drawable/stat_sys_signal_cdma_3.png diff --git a/core/res/res/drawable/stat_sys_signal_cdma_4.png b/core/res/res/drawable/stat_sys_signal_cdma_4.png Binary files differnew file mode 100755 index 0000000..53a31ea --- /dev/null +++ b/core/res/res/drawable/stat_sys_signal_cdma_4.png diff --git a/core/res/res/drawable/stat_sys_signal_evdo_0.png b/core/res/res/drawable/stat_sys_signal_evdo_0.png Binary files differnew file mode 100755 index 0000000..1b8aec7 --- /dev/null +++ b/core/res/res/drawable/stat_sys_signal_evdo_0.png diff --git a/core/res/res/drawable/stat_sys_signal_evdo_1.png b/core/res/res/drawable/stat_sys_signal_evdo_1.png Binary files differnew file mode 100755 index 0000000..7ce01fd --- /dev/null +++ b/core/res/res/drawable/stat_sys_signal_evdo_1.png diff --git a/core/res/res/drawable/stat_sys_signal_evdo_2.png b/core/res/res/drawable/stat_sys_signal_evdo_2.png Binary files differnew file mode 100755 index 0000000..890cd59 --- /dev/null +++ b/core/res/res/drawable/stat_sys_signal_evdo_2.png diff --git a/core/res/res/drawable/stat_sys_signal_evdo_3.png b/core/res/res/drawable/stat_sys_signal_evdo_3.png Binary files differnew file mode 100755 index 0000000..712c640 --- /dev/null +++ b/core/res/res/drawable/stat_sys_signal_evdo_3.png diff --git a/core/res/res/drawable/stat_sys_signal_evdo_4.png b/core/res/res/drawable/stat_sys_signal_evdo_4.png Binary files differnew file mode 100755 index 0000000..f0537dd --- /dev/null +++ b/core/res/res/drawable/stat_sys_signal_evdo_4.png diff --git a/core/res/res/layout/google_web_content_helper_layout.xml b/core/res/res/layout/google_web_content_helper_layout.xml index 40f84bf..546c458 100644 --- a/core/res/res/layout/google_web_content_helper_layout.xml +++ b/core/res/res/layout/google_web_content_helper_layout.xml @@ -18,10 +18,28 @@ android:foregroundGravity="center" android:measureAllChildren="false"> - <!-- Include the indeterminate progress dialog's layout. --> - <include - android:id="@+id/progressContainer" - layout="@android:layout/progress_dialog" /> + <LinearLayout android:id="@+id/progressContainer" + android:orientation="horizontal" + android:layout_gravity="center" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:baselineAligned="false" + android:paddingLeft="8dip" + android:paddingTop="10dip" + android:paddingRight="8dip" + android:paddingBottom="10dip"> + + <ProgressBar android:id="@android:id/progress" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:max="10000" + android:layout_marginRight="12dip" /> + + <TextView android:id="@+id/message" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" /> + </LinearLayout> <WebView android:id="@+id/web" diff --git a/core/res/res/layout/search_bar.xml b/core/res/res/layout/search_bar.xml index b512490..7b7f8a6 100644 --- a/core/res/res/layout/search_bar.xml +++ b/core/res/res/layout/search_bar.xml @@ -71,6 +71,7 @@ android:layout_weight="1.0" android:paddingLeft="8dip" android:paddingRight="6dip" + android:drawablePadding="2dip" android:singleLine="true" android:inputType="text|textAutoComplete" android:dropDownWidth="fill_parent" diff --git a/core/res/res/raw/latin_lowercase b/core/res/res/raw/latin_lowercase Binary files differnew file mode 100644 index 0000000..5c38b91 --- /dev/null +++ b/core/res/res/raw/latin_lowercase diff --git a/core/res/res/values-ar-rEG/donottranslate-cldr.xml b/core/res/res/values-ar-rEG/donottranslate-cldr.xml new file mode 100644 index 0000000..1bbbdca --- /dev/null +++ b/core/res/res/values-ar-rEG/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">يناير</string> + <string name="month_long_standalone_february">فبراير</string> + <string name="month_long_standalone_march">مارس</string> + <string name="month_long_standalone_april">أبريل</string> + <string name="month_long_standalone_may">مايو</string> + <string name="month_long_standalone_june">يونيو</string> + <string name="month_long_standalone_july">يوليو</string> + <string name="month_long_standalone_august">أغسطس</string> + <string name="month_long_standalone_september">سبتمبر</string> + <string name="month_long_standalone_october">أكتوبر</string> + <string name="month_long_standalone_november">نوفمبر</string> + <string name="month_long_standalone_december">ديسمبر</string> + + <string name="month_long_january">يناير</string> + <string name="month_long_february">فبراير</string> + <string name="month_long_march">مارس</string> + <string name="month_long_april">أبريل</string> + <string name="month_long_may">مايو</string> + <string name="month_long_june">يونيو</string> + <string name="month_long_july">يوليو</string> + <string name="month_long_august">أغسطس</string> + <string name="month_long_september">سبتمبر</string> + <string name="month_long_october">أكتوبر</string> + <string name="month_long_november">نوفمبر</string> + <string name="month_long_december">ديسمبر</string> + + <string name="month_medium_january">يناير</string> + <string name="month_medium_february">فبراير</string> + <string name="month_medium_march">مارس</string> + <string name="month_medium_april">أبريل</string> + <string name="month_medium_may">مايو</string> + <string name="month_medium_june">يونيو</string> + <string name="month_medium_july">يوليو</string> + <string name="month_medium_august">أغسطس</string> + <string name="month_medium_september">سبتمبر</string> + <string name="month_medium_october">أكتوبر</string> + <string name="month_medium_november">نوفمبر</string> + <string name="month_medium_december">ديسمبر</string> + + <string name="month_shortest_january">ي</string> + <string name="month_shortest_february">ف</string> + <string name="month_shortest_march">م</string> + <string name="month_shortest_april">أ</string> + <string name="month_shortest_may">و</string> + <string name="month_shortest_june">ن</string> + <string name="month_shortest_july">ل</string> + <string name="month_shortest_august">غ</string> + <string name="month_shortest_september">س</string> + <string name="month_shortest_october">ك</string> + <string name="month_shortest_november">ب</string> + <string name="month_shortest_december">د</string> + + <string name="day_of_week_long_sunday">الأحد</string> + <string name="day_of_week_long_monday">الإثنين</string> + <string name="day_of_week_long_tuesday">الثلاثاء</string> + <string name="day_of_week_long_wednesday">الأربعاء</string> + <string name="day_of_week_long_thursday">الخميس</string> + <string name="day_of_week_long_friday">الجمعة</string> + <string name="day_of_week_long_saturday">السبت</string> + + <string name="day_of_week_medium_sunday">أحد</string> + <string name="day_of_week_medium_monday">إثنين</string> + <string name="day_of_week_medium_tuesday">ثلاثاء</string> + <string name="day_of_week_medium_wednesday">أربعاء</string> + <string name="day_of_week_medium_thursday">خميس</string> + <string name="day_of_week_medium_friday">جمعة</string> + <string name="day_of_week_medium_saturday">سبت</string> + + <string name="day_of_week_short_sunday">أحد</string> + <string name="day_of_week_short_monday">إثنين</string> + <string name="day_of_week_short_tuesday">ثلاثاء</string> + <string name="day_of_week_short_wednesday">أربعاء</string> + <string name="day_of_week_short_thursday">خميس</string> + <string name="day_of_week_short_friday">جمعة</string> + <string name="day_of_week_short_saturday">سبت</string> + + <string name="day_of_week_shortest_sunday">ح</string> + <string name="day_of_week_shortest_monday">ن</string> + <string name="day_of_week_shortest_tuesday">ث</string> + <string name="day_of_week_shortest_wednesday">ر</string> + <string name="day_of_week_shortest_thursday">خ</string> + <string name="day_of_week_shortest_friday">ج</string> + <string name="day_of_week_shortest_saturday">س</string> + + <string name="am">ص</string> + <string name="pm">م</string> + <string name="yesterday">أمس</string> + <string name="today">اليوم</string> + <string name="tomorrow">غدًا</string> + + <string name="hour_minute_ampm">%-l:%M %p</string> + <string name="hour_minute_cap_ampm">%-l:%M %^p</string> + <string name="numeric_date">%-e/%-m/%Y</string> + <string name="numeric_date_format">d/M/yyyy</string> + <string name="month_day_year">%-e %B، %Y</string> + <string name="time_of_day">%-l:%M:%S %p</string> + <string name="date_and_time">%-l:%M:%S %p %d/%m/%Y</string> + <string name="abbrev_month_day_year">%d/%m/%Y</string> + <string name="month_day">%-e %B</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%-e %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-bg-rBG/donottranslate-cldr.xml b/core/res/res/values-bg-rBG/donottranslate-cldr.xml new file mode 100644 index 0000000..608b3a7 --- /dev/null +++ b/core/res/res/values-bg-rBG/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">януари</string> + <string name="month_long_standalone_february">февруари</string> + <string name="month_long_standalone_march">март</string> + <string name="month_long_standalone_april">април</string> + <string name="month_long_standalone_may">май</string> + <string name="month_long_standalone_june">юни</string> + <string name="month_long_standalone_july">юли</string> + <string name="month_long_standalone_august">август</string> + <string name="month_long_standalone_september">септември</string> + <string name="month_long_standalone_october">октомври</string> + <string name="month_long_standalone_november">ноември</string> + <string name="month_long_standalone_december">декември</string> + + <string name="month_long_january">януари</string> + <string name="month_long_february">февруари</string> + <string name="month_long_march">март</string> + <string name="month_long_april">април</string> + <string name="month_long_may">май</string> + <string name="month_long_june">юни</string> + <string name="month_long_july">юли</string> + <string name="month_long_august">август</string> + <string name="month_long_september">септември</string> + <string name="month_long_october">октомври</string> + <string name="month_long_november">ноември</string> + <string name="month_long_december">декември</string> + + <string name="month_medium_january">ян.</string> + <string name="month_medium_february">февр.</string> + <string name="month_medium_march">март</string> + <string name="month_medium_april">апр.</string> + <string name="month_medium_may">май</string> + <string name="month_medium_june">юни</string> + <string name="month_medium_july">юли</string> + <string name="month_medium_august">авг.</string> + <string name="month_medium_september">септ.</string> + <string name="month_medium_october">окт.</string> + <string name="month_medium_november">ноем.</string> + <string name="month_medium_december">дек.</string> + + <string name="month_shortest_january">я</string> + <string name="month_shortest_february">ф</string> + <string name="month_shortest_march">м</string> + <string name="month_shortest_april">а</string> + <string name="month_shortest_may">м</string> + <string name="month_shortest_june">ю</string> + <string name="month_shortest_july">ю</string> + <string name="month_shortest_august">а</string> + <string name="month_shortest_september">с</string> + <string name="month_shortest_october">о</string> + <string name="month_shortest_november">н</string> + <string name="month_shortest_december">д</string> + + <string name="day_of_week_long_sunday">неделя</string> + <string name="day_of_week_long_monday">понеделник</string> + <string name="day_of_week_long_tuesday">вторник</string> + <string name="day_of_week_long_wednesday">сряда</string> + <string name="day_of_week_long_thursday">четвъртък</string> + <string name="day_of_week_long_friday">петък</string> + <string name="day_of_week_long_saturday">събота</string> + + <string name="day_of_week_medium_sunday">нд</string> + <string name="day_of_week_medium_monday">пн</string> + <string name="day_of_week_medium_tuesday">вт</string> + <string name="day_of_week_medium_wednesday">ср</string> + <string name="day_of_week_medium_thursday">чт</string> + <string name="day_of_week_medium_friday">пт</string> + <string name="day_of_week_medium_saturday">сб</string> + + <string name="day_of_week_short_sunday">нд</string> + <string name="day_of_week_short_monday">пн</string> + <string name="day_of_week_short_tuesday">вт</string> + <string name="day_of_week_short_wednesday">ср</string> + <string name="day_of_week_short_thursday">чт</string> + <string name="day_of_week_short_friday">пт</string> + <string name="day_of_week_short_saturday">сб</string> + + <string name="day_of_week_shortest_sunday">н</string> + <string name="day_of_week_shortest_monday">п</string> + <string name="day_of_week_shortest_tuesday">в</string> + <string name="day_of_week_shortest_wednesday">с</string> + <string name="day_of_week_shortest_thursday">ч</string> + <string name="day_of_week_shortest_friday">п</string> + <string name="day_of_week_shortest_saturday">с</string> + + <string name="am">пр. об.</string> + <string name="pm">сл. об.</string> + <string name="yesterday">Вчера</string> + <string name="today">Днес</string> + <string name="tomorrow">Утре</string> + + <string name="hour_minute_ampm">%H:%M</string> + <string name="hour_minute_cap_ampm">%H:%M</string> + <string name="numeric_date">%d.%m.%Y</string> + <string name="numeric_date_format">dd.MM.yyyy</string> + <string name="month_day_year">%d %B %Y</string> + <string name="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%H:%M:%S %d.%m.%Y</string> + <string name="abbrev_month_day_year">%d.%m.%Y</string> + <string name="month_day">%-e %B</string> + <string name="month">%-B</string> + <string name="month_year">%Y %B</string> + <string name="abbrev_month_day">%b %-e</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%Y %b</string> +</resources> diff --git a/core/res/res/values-ca-rES/donottranslate-cldr.xml b/core/res/res/values-ca-rES/donottranslate-cldr.xml new file mode 100644 index 0000000..6ed2a88 --- /dev/null +++ b/core/res/res/values-ca-rES/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">gener</string> + <string name="month_long_standalone_february">febrer</string> + <string name="month_long_standalone_march">març</string> + <string name="month_long_standalone_april">abril</string> + <string name="month_long_standalone_may">maig</string> + <string name="month_long_standalone_june">juny</string> + <string name="month_long_standalone_july">juliol</string> + <string name="month_long_standalone_august">agost</string> + <string name="month_long_standalone_september">setembre</string> + <string name="month_long_standalone_october">octubre</string> + <string name="month_long_standalone_november">novembre</string> + <string name="month_long_standalone_december">desembre</string> + + <string name="month_long_january">gener</string> + <string name="month_long_february">febrer</string> + <string name="month_long_march">març</string> + <string name="month_long_april">abril</string> + <string name="month_long_may">maig</string> + <string name="month_long_june">juny</string> + <string name="month_long_july">juliol</string> + <string name="month_long_august">agost</string> + <string name="month_long_september">setembre</string> + <string name="month_long_october">octubre</string> + <string name="month_long_november">novembre</string> + <string name="month_long_december">desembre</string> + + <string name="month_medium_january">gen.</string> + <string name="month_medium_february">febr.</string> + <string name="month_medium_march">març</string> + <string name="month_medium_april">abr.</string> + <string name="month_medium_may">maig</string> + <string name="month_medium_june">juny</string> + <string name="month_medium_july">jul.</string> + <string name="month_medium_august">ag.</string> + <string name="month_medium_september">set.</string> + <string name="month_medium_october">oct.</string> + <string name="month_medium_november">nov.</string> + <string name="month_medium_december">des.</string> + + <string name="month_shortest_january">g</string> + <string name="month_shortest_february">f</string> + <string name="month_shortest_march">m</string> + <string name="month_shortest_april">a</string> + <string name="month_shortest_may">m</string> + <string name="month_shortest_june">j</string> + <string name="month_shortest_july">j</string> + <string name="month_shortest_august">a</string> + <string name="month_shortest_september">s</string> + <string name="month_shortest_october">o</string> + <string name="month_shortest_november">n</string> + <string name="month_shortest_december">d</string> + + <string name="day_of_week_long_sunday">diumenge</string> + <string name="day_of_week_long_monday">dilluns</string> + <string name="day_of_week_long_tuesday">dimarts</string> + <string name="day_of_week_long_wednesday">dimecres</string> + <string name="day_of_week_long_thursday">dijous</string> + <string name="day_of_week_long_friday">divendres</string> + <string name="day_of_week_long_saturday">dissabte</string> + + <string name="day_of_week_medium_sunday">dg.</string> + <string name="day_of_week_medium_monday">dl.</string> + <string name="day_of_week_medium_tuesday">dt.</string> + <string name="day_of_week_medium_wednesday">dc.</string> + <string name="day_of_week_medium_thursday">dj.</string> + <string name="day_of_week_medium_friday">dv.</string> + <string name="day_of_week_medium_saturday">ds.</string> + + <string name="day_of_week_short_sunday">dg.</string> + <string name="day_of_week_short_monday">dl.</string> + <string name="day_of_week_short_tuesday">dt.</string> + <string name="day_of_week_short_wednesday">dc.</string> + <string name="day_of_week_short_thursday">dj.</string> + <string name="day_of_week_short_friday">dv.</string> + <string name="day_of_week_short_saturday">ds.</string> + + <string name="day_of_week_shortest_sunday">g</string> + <string name="day_of_week_shortest_monday">l</string> + <string name="day_of_week_shortest_tuesday">t</string> + <string name="day_of_week_shortest_wednesday">c</string> + <string name="day_of_week_shortest_thursday">j</string> + <string name="day_of_week_shortest_friday">v</string> + <string name="day_of_week_shortest_saturday">s</string> + + <string name="am">a.m.</string> + <string name="pm">p.m.</string> + <string name="yesterday">ahir</string> + <string name="today">avui</string> + <string name="tomorrow">demà</string> + + <string name="hour_minute_ampm">%-k:%M</string> + <string name="hour_minute_cap_ampm">%-k:%M</string> + <string name="numeric_date">%d/%m/%Y</string> + <string name="numeric_date_format">dd/MM/yyyy</string> + <string name="month_day_year">%-e de %B de %Y</string> + <string name="time_of_day">%-k:%M:%S</string> + <string name="date_and_time">%-k:%M:%S %d/%m/%Y</string> + <string name="abbrev_month_day_year">%d/%m/%Y</string> + <string name="month_day">%-e de %B</string> + <string name="month">%-B</string> + <string name="month_year">%-B del %Y</string> + <string name="abbrev_month_day">%-e %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-cs-rCZ/donottranslate-cldr.xml b/core/res/res/values-cs-rCZ/donottranslate-cldr.xml new file mode 100644 index 0000000..f477d56 --- /dev/null +++ b/core/res/res/values-cs-rCZ/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">leden</string> + <string name="month_long_standalone_february">únor</string> + <string name="month_long_standalone_march">březen</string> + <string name="month_long_standalone_april">duben</string> + <string name="month_long_standalone_may">květen</string> + <string name="month_long_standalone_june">červen</string> + <string name="month_long_standalone_july">červenec</string> + <string name="month_long_standalone_august">srpen</string> + <string name="month_long_standalone_september">září</string> + <string name="month_long_standalone_october">říjen</string> + <string name="month_long_standalone_november">listopad</string> + <string name="month_long_standalone_december">prosinec</string> + + <string name="month_long_january">ledna</string> + <string name="month_long_february">února</string> + <string name="month_long_march">března</string> + <string name="month_long_april">dubna</string> + <string name="month_long_may">května</string> + <string name="month_long_june">června</string> + <string name="month_long_july">července</string> + <string name="month_long_august">srpna</string> + <string name="month_long_september">září</string> + <string name="month_long_october">října</string> + <string name="month_long_november">listopadu</string> + <string name="month_long_december">prosince</string> + + <string name="month_medium_january">1</string> + <string name="month_medium_february">2</string> + <string name="month_medium_march">3</string> + <string name="month_medium_april">4</string> + <string name="month_medium_may">5</string> + <string name="month_medium_june">6</string> + <string name="month_medium_july">7</string> + <string name="month_medium_august">8</string> + <string name="month_medium_september">9</string> + <string name="month_medium_october">10</string> + <string name="month_medium_november">11</string> + <string name="month_medium_december">12</string> + + <string name="month_shortest_january">l</string> + <string name="month_shortest_february">ú</string> + <string name="month_shortest_march">b</string> + <string name="month_shortest_april">d</string> + <string name="month_shortest_may">k</string> + <string name="month_shortest_june">č</string> + <string name="month_shortest_july">č</string> + <string name="month_shortest_august">s</string> + <string name="month_shortest_september">z</string> + <string name="month_shortest_october">ř</string> + <string name="month_shortest_november">l</string> + <string name="month_shortest_december">p</string> + + <string name="day_of_week_long_sunday">neděle</string> + <string name="day_of_week_long_monday">pondělí</string> + <string name="day_of_week_long_tuesday">úterý</string> + <string name="day_of_week_long_wednesday">středa</string> + <string name="day_of_week_long_thursday">čtvrtek</string> + <string name="day_of_week_long_friday">pátek</string> + <string name="day_of_week_long_saturday">sobota</string> + + <string name="day_of_week_medium_sunday">ne</string> + <string name="day_of_week_medium_monday">po</string> + <string name="day_of_week_medium_tuesday">út</string> + <string name="day_of_week_medium_wednesday">st</string> + <string name="day_of_week_medium_thursday">čt</string> + <string name="day_of_week_medium_friday">pá</string> + <string name="day_of_week_medium_saturday">so</string> + + <string name="day_of_week_short_sunday">ne</string> + <string name="day_of_week_short_monday">po</string> + <string name="day_of_week_short_tuesday">út</string> + <string name="day_of_week_short_wednesday">st</string> + <string name="day_of_week_short_thursday">čt</string> + <string name="day_of_week_short_friday">pá</string> + <string name="day_of_week_short_saturday">so</string> + + <string name="day_of_week_shortest_sunday">N</string> + <string name="day_of_week_shortest_monday">P</string> + <string name="day_of_week_shortest_tuesday">Ú</string> + <string name="day_of_week_shortest_wednesday">S</string> + <string name="day_of_week_shortest_thursday">Č</string> + <string name="day_of_week_shortest_friday">P</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">dop.</string> + <string name="pm">odp.</string> + <string name="yesterday">Včera</string> + <string name="today">Dnes</string> + <string name="tomorrow">Zítra</string> + + <string name="hour_minute_ampm">%-k:%M</string> + <string name="hour_minute_cap_ampm">%-k:%M</string> + <string name="numeric_date">%-e.%-m.%Y</string> + <string name="numeric_date_format">d.M.yyyy</string> + <string name="month_day_year">%-e. %B %Y</string> + <string name="time_of_day">%-k:%M:%S</string> + <string name="date_and_time">%-k:%M:%S %-e.%-m.%Y</string> + <string name="abbrev_month_day_year">%-e.%-m.%Y</string> + <string name="month_day">%-e. %B</string> + <string name="month">%-B</string> + <string name="month_year">%Y %B</string> + <string name="abbrev_month_day">%b %-e</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%Y %b</string> +</resources> diff --git a/core/res/res/values-cs/donottranslate-cldr.xml b/core/res/res/values-cs/donottranslate-cldr.xml new file mode 100644 index 0000000..f477d56 --- /dev/null +++ b/core/res/res/values-cs/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">leden</string> + <string name="month_long_standalone_february">únor</string> + <string name="month_long_standalone_march">březen</string> + <string name="month_long_standalone_april">duben</string> + <string name="month_long_standalone_may">květen</string> + <string name="month_long_standalone_june">červen</string> + <string name="month_long_standalone_july">červenec</string> + <string name="month_long_standalone_august">srpen</string> + <string name="month_long_standalone_september">září</string> + <string name="month_long_standalone_october">říjen</string> + <string name="month_long_standalone_november">listopad</string> + <string name="month_long_standalone_december">prosinec</string> + + <string name="month_long_january">ledna</string> + <string name="month_long_february">února</string> + <string name="month_long_march">března</string> + <string name="month_long_april">dubna</string> + <string name="month_long_may">května</string> + <string name="month_long_june">června</string> + <string name="month_long_july">července</string> + <string name="month_long_august">srpna</string> + <string name="month_long_september">září</string> + <string name="month_long_october">října</string> + <string name="month_long_november">listopadu</string> + <string name="month_long_december">prosince</string> + + <string name="month_medium_january">1</string> + <string name="month_medium_february">2</string> + <string name="month_medium_march">3</string> + <string name="month_medium_april">4</string> + <string name="month_medium_may">5</string> + <string name="month_medium_june">6</string> + <string name="month_medium_july">7</string> + <string name="month_medium_august">8</string> + <string name="month_medium_september">9</string> + <string name="month_medium_october">10</string> + <string name="month_medium_november">11</string> + <string name="month_medium_december">12</string> + + <string name="month_shortest_january">l</string> + <string name="month_shortest_february">ú</string> + <string name="month_shortest_march">b</string> + <string name="month_shortest_april">d</string> + <string name="month_shortest_may">k</string> + <string name="month_shortest_june">č</string> + <string name="month_shortest_july">č</string> + <string name="month_shortest_august">s</string> + <string name="month_shortest_september">z</string> + <string name="month_shortest_october">ř</string> + <string name="month_shortest_november">l</string> + <string name="month_shortest_december">p</string> + + <string name="day_of_week_long_sunday">neděle</string> + <string name="day_of_week_long_monday">pondělí</string> + <string name="day_of_week_long_tuesday">úterý</string> + <string name="day_of_week_long_wednesday">středa</string> + <string name="day_of_week_long_thursday">čtvrtek</string> + <string name="day_of_week_long_friday">pátek</string> + <string name="day_of_week_long_saturday">sobota</string> + + <string name="day_of_week_medium_sunday">ne</string> + <string name="day_of_week_medium_monday">po</string> + <string name="day_of_week_medium_tuesday">út</string> + <string name="day_of_week_medium_wednesday">st</string> + <string name="day_of_week_medium_thursday">čt</string> + <string name="day_of_week_medium_friday">pá</string> + <string name="day_of_week_medium_saturday">so</string> + + <string name="day_of_week_short_sunday">ne</string> + <string name="day_of_week_short_monday">po</string> + <string name="day_of_week_short_tuesday">út</string> + <string name="day_of_week_short_wednesday">st</string> + <string name="day_of_week_short_thursday">čt</string> + <string name="day_of_week_short_friday">pá</string> + <string name="day_of_week_short_saturday">so</string> + + <string name="day_of_week_shortest_sunday">N</string> + <string name="day_of_week_shortest_monday">P</string> + <string name="day_of_week_shortest_tuesday">Ú</string> + <string name="day_of_week_shortest_wednesday">S</string> + <string name="day_of_week_shortest_thursday">Č</string> + <string name="day_of_week_shortest_friday">P</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">dop.</string> + <string name="pm">odp.</string> + <string name="yesterday">Včera</string> + <string name="today">Dnes</string> + <string name="tomorrow">Zítra</string> + + <string name="hour_minute_ampm">%-k:%M</string> + <string name="hour_minute_cap_ampm">%-k:%M</string> + <string name="numeric_date">%-e.%-m.%Y</string> + <string name="numeric_date_format">d.M.yyyy</string> + <string name="month_day_year">%-e. %B %Y</string> + <string name="time_of_day">%-k:%M:%S</string> + <string name="date_and_time">%-k:%M:%S %-e.%-m.%Y</string> + <string name="abbrev_month_day_year">%-e.%-m.%Y</string> + <string name="month_day">%-e. %B</string> + <string name="month">%-B</string> + <string name="month_year">%Y %B</string> + <string name="abbrev_month_day">%b %-e</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%Y %b</string> +</resources> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 35a3f9a..c3860d4 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -418,9 +418,6 @@ <string name="lockscreen_glogin_password_hint">"Heslo"</string> <string name="lockscreen_glogin_submit_button">"Přihlásit se"</string> <string name="lockscreen_glogin_invalid_input">"Neplatné uživatelské jméno nebo heslo."</string> - <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string> - <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string> - <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string> <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string> <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string> <string name="status_bar_clear_all_button">"Vymazat oznámení"</string> @@ -452,9 +449,6 @@ <string name="menu_enter_shortcut_label">"enter"</string> <string name="menu_delete_shortcut_label">"smazat"</string> <string name="search_go">"Hledat"</string> - <string name="today">"Dnes"</string> - <string name="yesterday">"Včera"</string> - <string name="tomorrow">"Zítra"</string> <string name="oneMonthDurationPast">"před 1 měsícem"</string> <string name="beforeOneMonthDurationPast">"Déle než před 1 měsícem"</string> <plurals name="num_seconds_ago"> @@ -536,13 +530,6 @@ <string name="weeks">"týd."</string> <string name="year">"rokem"</string> <string name="years">"lety"</string> - <string name="sunday">"neděle"</string> - <string name="monday">"pondělí"</string> - <string name="tuesday">"úterý"</string> - <string name="wednesday">"středa"</string> - <string name="thursday">"čtvrtek"</string> - <string name="friday">"pátek"</string> - <string name="saturday">"sobota"</string> <string name="every_weekday">"Každý pracovní den (Po – Pá)"</string> <string name="daily">"Denně"</string> <string name="weekly">"Každý týden v <xliff:g id="DAY">%s</xliff:g>"</string> @@ -552,9 +539,6 @@ <string name="VideoView_error_text_invalid_progressive_playback">"Omlouváme se, ale toto video nelze přenášet datovým proudem do tohoto zařízení."</string> <string name="VideoView_error_text_unknown">"Toto video bohužel nelze přehrát."</string> <string name="VideoView_error_button">"OK"</string> - <string name="am">"dop."</string> - <string name="pm">"odp."</string> - <string name="numeric_date">"<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="DAY">%d</xliff:g>/<xliff:g id="YEAR">%Y</xliff:g>"</string> <string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string> <string name="wday1_date1_wday2_date2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>"</string> <string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string> @@ -566,23 +550,12 @@ <string name="date_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="time_wday">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>"</string> - <string name="full_date_month_first" format="date">"<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="DAY">d</xliff:g>', '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="full_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>'. '<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="medium_date_month_first" format="date">"<xliff:g id="DAY">d</xliff:g>'. '<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="medium_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>'. '<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="twelve_hour_time_format" format="date">"<xliff:g id="HOUR">h</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>' '<xliff:g id="AMPM">a</xliff:g>"</string> - <string name="twenty_four_hour_time_format" format="date">"<xliff:g id="HOUR">HH</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>"</string> <string name="noon">"poledne"</string> <string name="Noon">"Poledne"</string> <string name="midnight">"půlnoc"</string> <string name="Midnight">"Půlnoc"</string> - <string name="month_day">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>"</string> <!-- no translation found for month (7026169712234774086) --> <skip /> - <string name="month_day_year">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>, <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="month_year">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string> - <string name="date_and_time">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g> <xliff:g id="DAY">%-d</xliff:g>. <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> <string name="same_year_md1_md2">"<xliff:g id="DAY1">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g>"</string> <string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g>"</string> <string name="same_year_mdy1_mdy2">"<xliff:g id="DAY1">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR">%9$s</xliff:g>"</string> @@ -607,82 +580,8 @@ <string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="TIME2">%10$s</xliff:g>"</string> <string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string> <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string> - <string name="abbrev_month_day_year">"<xliff:g id="DAY">%-d</xliff:g>. <xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="abbrev_month_year">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="abbrev_month_day">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="DAY">%-d</xliff:g>"</string> <!-- no translation found for abbrev_month (3131032032850777433) --> <skip /> - <string name="day_of_week_long_sunday">"neděle"</string> - <string name="day_of_week_long_monday">"pondělí"</string> - <string name="day_of_week_long_tuesday">"úterý"</string> - <string name="day_of_week_long_wednesday">"středa"</string> - <string name="day_of_week_long_thursday">"čtvrtek"</string> - <string name="day_of_week_long_friday">"pátek"</string> - <string name="day_of_week_long_saturday">"sobota"</string> - <string name="day_of_week_medium_sunday">"Ne"</string> - <string name="day_of_week_medium_monday">"Po"</string> - <string name="day_of_week_medium_tuesday">"Út"</string> - <string name="day_of_week_medium_wednesday">"St"</string> - <string name="day_of_week_medium_thursday">"Čt"</string> - <string name="day_of_week_medium_friday">"Pá"</string> - <string name="day_of_week_medium_saturday">"So"</string> - <string name="day_of_week_short_sunday">"Ne"</string> - <string name="day_of_week_short_monday">"Po"</string> - <string name="day_of_week_short_tuesday">"Út"</string> - <string name="day_of_week_short_wednesday">"St"</string> - <string name="day_of_week_short_thursday">"Čt"</string> - <string name="day_of_week_short_friday">"Pá"</string> - <string name="day_of_week_short_saturday">"So"</string> - <string name="day_of_week_shorter_sunday">"Ne"</string> - <string name="day_of_week_shorter_monday">"Po"</string> - <string name="day_of_week_shorter_tuesday">"Út"</string> - <string name="day_of_week_shorter_wednesday">"St"</string> - <string name="day_of_week_shorter_thursday">"Čt"</string> - <string name="day_of_week_shorter_friday">"Pá"</string> - <string name="day_of_week_shorter_saturday">"So"</string> - <string name="day_of_week_shortest_sunday">"Ne"</string> - <string name="day_of_week_shortest_monday">"Po"</string> - <string name="day_of_week_shortest_tuesday">"Čt"</string> - <string name="day_of_week_shortest_wednesday">"St"</string> - <string name="day_of_week_shortest_thursday">"Čt"</string> - <string name="day_of_week_shortest_friday">"Pá"</string> - <string name="day_of_week_shortest_saturday">"So"</string> - <string name="month_long_january">"leden"</string> - <string name="month_long_february">"únor"</string> - <string name="month_long_march">"březen"</string> - <string name="month_long_april">"duben"</string> - <string name="month_long_may">"květen"</string> - <string name="month_long_june">"červen"</string> - <string name="month_long_july">"červenec"</string> - <string name="month_long_august">"srpen"</string> - <string name="month_long_september">"září"</string> - <string name="month_long_october">"říjen"</string> - <string name="month_long_november">"listopad"</string> - <string name="month_long_december">"prosinec"</string> - <string name="month_medium_january">"leden"</string> - <string name="month_medium_february">"únor"</string> - <string name="month_medium_march">"březen"</string> - <string name="month_medium_april">"duben"</string> - <string name="month_medium_may">"květen"</string> - <string name="month_medium_june">"červen"</string> - <string name="month_medium_july">"červenec"</string> - <string name="month_medium_august">"srpen"</string> - <string name="month_medium_september">"září"</string> - <string name="month_medium_october">"říjen"</string> - <string name="month_medium_november">"listopad"</string> - <string name="month_medium_december">"prosinec"</string> - <string name="month_shortest_january">"1."</string> - <string name="month_shortest_february">"2."</string> - <string name="month_shortest_march">"Po"</string> - <string name="month_shortest_april">"4."</string> - <string name="month_shortest_may">"5."</string> - <string name="month_shortest_june">"6."</string> - <string name="month_shortest_july">"7."</string> - <string name="month_shortest_august">"8."</string> - <string name="month_shortest_september">"9."</string> - <string name="month_shortest_october">"10."</string> - <string name="month_shortest_november">"11."</string> - <string name="month_shortest_december">"12."</string> <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string> <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string> <string name="selectAll">"Vybrat vše"</string> diff --git a/core/res/res/values-da-rDK/donottranslate-cldr.xml b/core/res/res/values-da-rDK/donottranslate-cldr.xml new file mode 100644 index 0000000..38097bd --- /dev/null +++ b/core/res/res/values-da-rDK/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">januar</string> + <string name="month_long_standalone_february">februar</string> + <string name="month_long_standalone_march">marts</string> + <string name="month_long_standalone_april">april</string> + <string name="month_long_standalone_may">maj</string> + <string name="month_long_standalone_june">juni</string> + <string name="month_long_standalone_july">juli</string> + <string name="month_long_standalone_august">august</string> + <string name="month_long_standalone_september">september</string> + <string name="month_long_standalone_october">oktober</string> + <string name="month_long_standalone_november">november</string> + <string name="month_long_standalone_december">december</string> + + <string name="month_long_january">januar</string> + <string name="month_long_february">februar</string> + <string name="month_long_march">marts</string> + <string name="month_long_april">april</string> + <string name="month_long_may">maj</string> + <string name="month_long_june">juni</string> + <string name="month_long_july">juli</string> + <string name="month_long_august">august</string> + <string name="month_long_september">september</string> + <string name="month_long_october">oktober</string> + <string name="month_long_november">november</string> + <string name="month_long_december">december</string> + + <string name="month_medium_january">jan.</string> + <string name="month_medium_february">feb.</string> + <string name="month_medium_march">mar.</string> + <string name="month_medium_april">apr.</string> + <string name="month_medium_may">maj</string> + <string name="month_medium_june">jun.</string> + <string name="month_medium_july">jul.</string> + <string name="month_medium_august">aug.</string> + <string name="month_medium_september">sep.</string> + <string name="month_medium_october">okt.</string> + <string name="month_medium_november">nov.</string> + <string name="month_medium_december">dec.</string> + + <string name="month_shortest_january">J</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">søndag</string> + <string name="day_of_week_long_monday">mandag</string> + <string name="day_of_week_long_tuesday">tirsdag</string> + <string name="day_of_week_long_wednesday">onsdag</string> + <string name="day_of_week_long_thursday">torsdag</string> + <string name="day_of_week_long_friday">fredag</string> + <string name="day_of_week_long_saturday">lørdag</string> + + <string name="day_of_week_medium_sunday">søn</string> + <string name="day_of_week_medium_monday">man</string> + <string name="day_of_week_medium_tuesday">tir</string> + <string name="day_of_week_medium_wednesday">ons</string> + <string name="day_of_week_medium_thursday">tor</string> + <string name="day_of_week_medium_friday">fre</string> + <string name="day_of_week_medium_saturday">lør</string> + + <string name="day_of_week_short_sunday">søn</string> + <string name="day_of_week_short_monday">man</string> + <string name="day_of_week_short_tuesday">tir</string> + <string name="day_of_week_short_wednesday">ons</string> + <string name="day_of_week_short_thursday">tor</string> + <string name="day_of_week_short_friday">fre</string> + <string name="day_of_week_short_saturday">lør</string> + + <string name="day_of_week_shortest_sunday">S</string> + <string name="day_of_week_shortest_monday">M</string> + <string name="day_of_week_shortest_tuesday">T</string> + <string name="day_of_week_shortest_wednesday">O</string> + <string name="day_of_week_shortest_thursday">T</string> + <string name="day_of_week_shortest_friday">F</string> + <string name="day_of_week_shortest_saturday">L</string> + + <string name="am">f.m.</string> + <string name="pm">e.m.</string> + <string name="yesterday">i går</string> + <string name="today">i dag</string> + <string name="tomorrow">i morgen</string> + + <string name="hour_minute_ampm">%H.%M</string> + <string name="hour_minute_cap_ampm">%H.%M</string> + <string name="numeric_date">%d/%m/%Y</string> + <string name="numeric_date_format">dd/MM/yyyy</string> + <string name="month_day_year">%-e. %b %Y</string> + <string name="time_of_day">%H.%M.%S</string> + <string name="date_and_time">%H.%M.%S %d/%m/%Y</string> + <string name="abbrev_month_day_year">%d/%m/%Y</string> + <string name="month_day">%-e. %B</string> + <string name="month">%b</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%-e. %b</string> + <string name="abbrev_month">%b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-de-rAT/donottranslate-cldr.xml b/core/res/res/values-de-rAT/donottranslate-cldr.xml new file mode 100644 index 0000000..ad35fee --- /dev/null +++ b/core/res/res/values-de-rAT/donottranslate-cldr.xml @@ -0,0 +1,75 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">Jänner</string> + + <string name="month_long_january">Jänner</string> + + <string name="month_medium_january">Jän</string> + + <string name="month_shortest_january">J</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">Sonntag</string> + <string name="day_of_week_long_monday">Montag</string> + <string name="day_of_week_long_tuesday">Dienstag</string> + <string name="day_of_week_long_wednesday">Mittwoch</string> + <string name="day_of_week_long_thursday">Donnerstag</string> + <string name="day_of_week_long_friday">Freitag</string> + <string name="day_of_week_long_saturday">Samstag</string> + + <string name="day_of_week_medium_sunday">So.</string> + <string name="day_of_week_medium_monday">Mo.</string> + <string name="day_of_week_medium_tuesday">Di.</string> + <string name="day_of_week_medium_wednesday">Mi.</string> + <string name="day_of_week_medium_thursday">Do.</string> + <string name="day_of_week_medium_friday">Fr.</string> + <string name="day_of_week_medium_saturday">Sa.</string> + + <string name="day_of_week_short_sunday">So.</string> + <string name="day_of_week_short_monday">Mo.</string> + <string name="day_of_week_short_tuesday">Di.</string> + <string name="day_of_week_short_wednesday">Mi.</string> + <string name="day_of_week_short_thursday">Do.</string> + <string name="day_of_week_short_friday">Fr.</string> + <string name="day_of_week_short_saturday">Sa.</string> + + <string name="day_of_week_shortest_sunday">S</string> + <string name="day_of_week_shortest_monday">M</string> + <string name="day_of_week_shortest_tuesday">D</string> + <string name="day_of_week_shortest_wednesday">M</string> + <string name="day_of_week_shortest_thursday">D</string> + <string name="day_of_week_shortest_friday">F</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">vorm.</string> + <string name="pm">nachm.</string> + <string name="yesterday">Gestern</string> + <string name="today">Heute</string> + <string name="tomorrow">Morgen</string> + + <string name="hour_minute_ampm">%H:%M</string> + <string name="hour_minute_cap_ampm">%H:%M</string> + <string name="numeric_date">%d.%m.%Y</string> + <string name="numeric_date_format">dd.MM.yyyy</string> + <string name="month_day_year">%d. %B %Y</string> + <string name="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%H:%M:%S %d.%m.%Y</string> + <string name="abbrev_month_day_year">%d.%m.%Y</string> + <string name="month_day">%-e. %B</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%-e. %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-de-rCH/donottranslate-cldr.xml b/core/res/res/values-de-rCH/donottranslate-cldr.xml new file mode 100644 index 0000000..c8e0de8 --- /dev/null +++ b/core/res/res/values-de-rCH/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">Januar</string> + <string name="month_long_standalone_february">Februar</string> + <string name="month_long_standalone_march">März</string> + <string name="month_long_standalone_april">April</string> + <string name="month_long_standalone_may">Mai</string> + <string name="month_long_standalone_june">Juni</string> + <string name="month_long_standalone_july">Juli</string> + <string name="month_long_standalone_august">August</string> + <string name="month_long_standalone_september">September</string> + <string name="month_long_standalone_october">Oktober</string> + <string name="month_long_standalone_november">November</string> + <string name="month_long_standalone_december">Dezember</string> + + <string name="month_long_january">Januar</string> + <string name="month_long_february">Februar</string> + <string name="month_long_march">März</string> + <string name="month_long_april">April</string> + <string name="month_long_may">Mai</string> + <string name="month_long_june">Juni</string> + <string name="month_long_july">Juli</string> + <string name="month_long_august">August</string> + <string name="month_long_september">September</string> + <string name="month_long_october">Oktober</string> + <string name="month_long_november">November</string> + <string name="month_long_december">Dezember</string> + + <string name="month_medium_january">Jan</string> + <string name="month_medium_february">Feb</string> + <string name="month_medium_march">Mär</string> + <string name="month_medium_april">Apr</string> + <string name="month_medium_may">Mai</string> + <string name="month_medium_june">Jun</string> + <string name="month_medium_july">Jul</string> + <string name="month_medium_august">Aug</string> + <string name="month_medium_september">Sep</string> + <string name="month_medium_october">Okt</string> + <string name="month_medium_november">Nov</string> + <string name="month_medium_december">Dez</string> + + <string name="month_shortest_january">J</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">Sonntag</string> + <string name="day_of_week_long_monday">Montag</string> + <string name="day_of_week_long_tuesday">Dienstag</string> + <string name="day_of_week_long_wednesday">Mittwoch</string> + <string name="day_of_week_long_thursday">Donnerstag</string> + <string name="day_of_week_long_friday">Freitag</string> + <string name="day_of_week_long_saturday">Samstag</string> + + <string name="day_of_week_medium_sunday">So.</string> + <string name="day_of_week_medium_monday">Mo.</string> + <string name="day_of_week_medium_tuesday">Di.</string> + <string name="day_of_week_medium_wednesday">Mi.</string> + <string name="day_of_week_medium_thursday">Do.</string> + <string name="day_of_week_medium_friday">Fr.</string> + <string name="day_of_week_medium_saturday">Sa.</string> + + <string name="day_of_week_short_sunday">So.</string> + <string name="day_of_week_short_monday">Mo.</string> + <string name="day_of_week_short_tuesday">Di.</string> + <string name="day_of_week_short_wednesday">Mi.</string> + <string name="day_of_week_short_thursday">Do.</string> + <string name="day_of_week_short_friday">Fr.</string> + <string name="day_of_week_short_saturday">Sa.</string> + + <string name="day_of_week_shortest_sunday">S</string> + <string name="day_of_week_shortest_monday">M</string> + <string name="day_of_week_shortest_tuesday">D</string> + <string name="day_of_week_shortest_wednesday">M</string> + <string name="day_of_week_shortest_thursday">D</string> + <string name="day_of_week_shortest_friday">F</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">vorm.</string> + <string name="pm">nachm.</string> + <string name="yesterday">Gestern</string> + <string name="today">Heute</string> + <string name="tomorrow">Morgen</string> + + <string name="hour_minute_ampm">%H:%M</string> + <string name="hour_minute_cap_ampm">%H:%M</string> + <string name="numeric_date">%d.%m.%Y</string> + <string name="numeric_date_format">dd.MM.yyyy</string> + <string name="month_day_year">%-e. %B %Y</string> + <string name="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%H:%M:%S %d.%m.%Y</string> + <string name="abbrev_month_day_year">%d.%m.%Y</string> + <string name="month_day">%-e. %B</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%-e. %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-de-rDE/donottranslate-cldr.xml b/core/res/res/values-de-rDE/donottranslate-cldr.xml new file mode 100644 index 0000000..c8e0de8 --- /dev/null +++ b/core/res/res/values-de-rDE/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">Januar</string> + <string name="month_long_standalone_february">Februar</string> + <string name="month_long_standalone_march">März</string> + <string name="month_long_standalone_april">April</string> + <string name="month_long_standalone_may">Mai</string> + <string name="month_long_standalone_june">Juni</string> + <string name="month_long_standalone_july">Juli</string> + <string name="month_long_standalone_august">August</string> + <string name="month_long_standalone_september">September</string> + <string name="month_long_standalone_october">Oktober</string> + <string name="month_long_standalone_november">November</string> + <string name="month_long_standalone_december">Dezember</string> + + <string name="month_long_january">Januar</string> + <string name="month_long_february">Februar</string> + <string name="month_long_march">März</string> + <string name="month_long_april">April</string> + <string name="month_long_may">Mai</string> + <string name="month_long_june">Juni</string> + <string name="month_long_july">Juli</string> + <string name="month_long_august">August</string> + <string name="month_long_september">September</string> + <string name="month_long_october">Oktober</string> + <string name="month_long_november">November</string> + <string name="month_long_december">Dezember</string> + + <string name="month_medium_january">Jan</string> + <string name="month_medium_february">Feb</string> + <string name="month_medium_march">Mär</string> + <string name="month_medium_april">Apr</string> + <string name="month_medium_may">Mai</string> + <string name="month_medium_june">Jun</string> + <string name="month_medium_july">Jul</string> + <string name="month_medium_august">Aug</string> + <string name="month_medium_september">Sep</string> + <string name="month_medium_october">Okt</string> + <string name="month_medium_november">Nov</string> + <string name="month_medium_december">Dez</string> + + <string name="month_shortest_january">J</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">Sonntag</string> + <string name="day_of_week_long_monday">Montag</string> + <string name="day_of_week_long_tuesday">Dienstag</string> + <string name="day_of_week_long_wednesday">Mittwoch</string> + <string name="day_of_week_long_thursday">Donnerstag</string> + <string name="day_of_week_long_friday">Freitag</string> + <string name="day_of_week_long_saturday">Samstag</string> + + <string name="day_of_week_medium_sunday">So.</string> + <string name="day_of_week_medium_monday">Mo.</string> + <string name="day_of_week_medium_tuesday">Di.</string> + <string name="day_of_week_medium_wednesday">Mi.</string> + <string name="day_of_week_medium_thursday">Do.</string> + <string name="day_of_week_medium_friday">Fr.</string> + <string name="day_of_week_medium_saturday">Sa.</string> + + <string name="day_of_week_short_sunday">So.</string> + <string name="day_of_week_short_monday">Mo.</string> + <string name="day_of_week_short_tuesday">Di.</string> + <string name="day_of_week_short_wednesday">Mi.</string> + <string name="day_of_week_short_thursday">Do.</string> + <string name="day_of_week_short_friday">Fr.</string> + <string name="day_of_week_short_saturday">Sa.</string> + + <string name="day_of_week_shortest_sunday">S</string> + <string name="day_of_week_shortest_monday">M</string> + <string name="day_of_week_shortest_tuesday">D</string> + <string name="day_of_week_shortest_wednesday">M</string> + <string name="day_of_week_shortest_thursday">D</string> + <string name="day_of_week_shortest_friday">F</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">vorm.</string> + <string name="pm">nachm.</string> + <string name="yesterday">Gestern</string> + <string name="today">Heute</string> + <string name="tomorrow">Morgen</string> + + <string name="hour_minute_ampm">%H:%M</string> + <string name="hour_minute_cap_ampm">%H:%M</string> + <string name="numeric_date">%d.%m.%Y</string> + <string name="numeric_date_format">dd.MM.yyyy</string> + <string name="month_day_year">%-e. %B %Y</string> + <string name="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%H:%M:%S %d.%m.%Y</string> + <string name="abbrev_month_day_year">%d.%m.%Y</string> + <string name="month_day">%-e. %B</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%-e. %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-de-rLI/donottranslate-cldr.xml b/core/res/res/values-de-rLI/donottranslate-cldr.xml new file mode 100644 index 0000000..c8e0de8 --- /dev/null +++ b/core/res/res/values-de-rLI/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">Januar</string> + <string name="month_long_standalone_february">Februar</string> + <string name="month_long_standalone_march">März</string> + <string name="month_long_standalone_april">April</string> + <string name="month_long_standalone_may">Mai</string> + <string name="month_long_standalone_june">Juni</string> + <string name="month_long_standalone_july">Juli</string> + <string name="month_long_standalone_august">August</string> + <string name="month_long_standalone_september">September</string> + <string name="month_long_standalone_october">Oktober</string> + <string name="month_long_standalone_november">November</string> + <string name="month_long_standalone_december">Dezember</string> + + <string name="month_long_january">Januar</string> + <string name="month_long_february">Februar</string> + <string name="month_long_march">März</string> + <string name="month_long_april">April</string> + <string name="month_long_may">Mai</string> + <string name="month_long_june">Juni</string> + <string name="month_long_july">Juli</string> + <string name="month_long_august">August</string> + <string name="month_long_september">September</string> + <string name="month_long_october">Oktober</string> + <string name="month_long_november">November</string> + <string name="month_long_december">Dezember</string> + + <string name="month_medium_january">Jan</string> + <string name="month_medium_february">Feb</string> + <string name="month_medium_march">Mär</string> + <string name="month_medium_april">Apr</string> + <string name="month_medium_may">Mai</string> + <string name="month_medium_june">Jun</string> + <string name="month_medium_july">Jul</string> + <string name="month_medium_august">Aug</string> + <string name="month_medium_september">Sep</string> + <string name="month_medium_october">Okt</string> + <string name="month_medium_november">Nov</string> + <string name="month_medium_december">Dez</string> + + <string name="month_shortest_january">J</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">Sonntag</string> + <string name="day_of_week_long_monday">Montag</string> + <string name="day_of_week_long_tuesday">Dienstag</string> + <string name="day_of_week_long_wednesday">Mittwoch</string> + <string name="day_of_week_long_thursday">Donnerstag</string> + <string name="day_of_week_long_friday">Freitag</string> + <string name="day_of_week_long_saturday">Samstag</string> + + <string name="day_of_week_medium_sunday">So.</string> + <string name="day_of_week_medium_monday">Mo.</string> + <string name="day_of_week_medium_tuesday">Di.</string> + <string name="day_of_week_medium_wednesday">Mi.</string> + <string name="day_of_week_medium_thursday">Do.</string> + <string name="day_of_week_medium_friday">Fr.</string> + <string name="day_of_week_medium_saturday">Sa.</string> + + <string name="day_of_week_short_sunday">So.</string> + <string name="day_of_week_short_monday">Mo.</string> + <string name="day_of_week_short_tuesday">Di.</string> + <string name="day_of_week_short_wednesday">Mi.</string> + <string name="day_of_week_short_thursday">Do.</string> + <string name="day_of_week_short_friday">Fr.</string> + <string name="day_of_week_short_saturday">Sa.</string> + + <string name="day_of_week_shortest_sunday">S</string> + <string name="day_of_week_shortest_monday">M</string> + <string name="day_of_week_shortest_tuesday">D</string> + <string name="day_of_week_shortest_wednesday">M</string> + <string name="day_of_week_shortest_thursday">D</string> + <string name="day_of_week_shortest_friday">F</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">vorm.</string> + <string name="pm">nachm.</string> + <string name="yesterday">Gestern</string> + <string name="today">Heute</string> + <string name="tomorrow">Morgen</string> + + <string name="hour_minute_ampm">%H:%M</string> + <string name="hour_minute_cap_ampm">%H:%M</string> + <string name="numeric_date">%d.%m.%Y</string> + <string name="numeric_date_format">dd.MM.yyyy</string> + <string name="month_day_year">%-e. %B %Y</string> + <string name="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%H:%M:%S %d.%m.%Y</string> + <string name="abbrev_month_day_year">%d.%m.%Y</string> + <string name="month_day">%-e. %B</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%-e. %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-de/donottranslate-cldr.xml b/core/res/res/values-de/donottranslate-cldr.xml new file mode 100644 index 0000000..c8e0de8 --- /dev/null +++ b/core/res/res/values-de/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">Januar</string> + <string name="month_long_standalone_february">Februar</string> + <string name="month_long_standalone_march">März</string> + <string name="month_long_standalone_april">April</string> + <string name="month_long_standalone_may">Mai</string> + <string name="month_long_standalone_june">Juni</string> + <string name="month_long_standalone_july">Juli</string> + <string name="month_long_standalone_august">August</string> + <string name="month_long_standalone_september">September</string> + <string name="month_long_standalone_october">Oktober</string> + <string name="month_long_standalone_november">November</string> + <string name="month_long_standalone_december">Dezember</string> + + <string name="month_long_january">Januar</string> + <string name="month_long_february">Februar</string> + <string name="month_long_march">März</string> + <string name="month_long_april">April</string> + <string name="month_long_may">Mai</string> + <string name="month_long_june">Juni</string> + <string name="month_long_july">Juli</string> + <string name="month_long_august">August</string> + <string name="month_long_september">September</string> + <string name="month_long_october">Oktober</string> + <string name="month_long_november">November</string> + <string name="month_long_december">Dezember</string> + + <string name="month_medium_january">Jan</string> + <string name="month_medium_february">Feb</string> + <string name="month_medium_march">Mär</string> + <string name="month_medium_april">Apr</string> + <string name="month_medium_may">Mai</string> + <string name="month_medium_june">Jun</string> + <string name="month_medium_july">Jul</string> + <string name="month_medium_august">Aug</string> + <string name="month_medium_september">Sep</string> + <string name="month_medium_october">Okt</string> + <string name="month_medium_november">Nov</string> + <string name="month_medium_december">Dez</string> + + <string name="month_shortest_january">J</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">Sonntag</string> + <string name="day_of_week_long_monday">Montag</string> + <string name="day_of_week_long_tuesday">Dienstag</string> + <string name="day_of_week_long_wednesday">Mittwoch</string> + <string name="day_of_week_long_thursday">Donnerstag</string> + <string name="day_of_week_long_friday">Freitag</string> + <string name="day_of_week_long_saturday">Samstag</string> + + <string name="day_of_week_medium_sunday">So.</string> + <string name="day_of_week_medium_monday">Mo.</string> + <string name="day_of_week_medium_tuesday">Di.</string> + <string name="day_of_week_medium_wednesday">Mi.</string> + <string name="day_of_week_medium_thursday">Do.</string> + <string name="day_of_week_medium_friday">Fr.</string> + <string name="day_of_week_medium_saturday">Sa.</string> + + <string name="day_of_week_short_sunday">So.</string> + <string name="day_of_week_short_monday">Mo.</string> + <string name="day_of_week_short_tuesday">Di.</string> + <string name="day_of_week_short_wednesday">Mi.</string> + <string name="day_of_week_short_thursday">Do.</string> + <string name="day_of_week_short_friday">Fr.</string> + <string name="day_of_week_short_saturday">Sa.</string> + + <string name="day_of_week_shortest_sunday">S</string> + <string name="day_of_week_shortest_monday">M</string> + <string name="day_of_week_shortest_tuesday">D</string> + <string name="day_of_week_shortest_wednesday">M</string> + <string name="day_of_week_shortest_thursday">D</string> + <string name="day_of_week_shortest_friday">F</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">vorm.</string> + <string name="pm">nachm.</string> + <string name="yesterday">Gestern</string> + <string name="today">Heute</string> + <string name="tomorrow">Morgen</string> + + <string name="hour_minute_ampm">%H:%M</string> + <string name="hour_minute_cap_ampm">%H:%M</string> + <string name="numeric_date">%d.%m.%Y</string> + <string name="numeric_date_format">dd.MM.yyyy</string> + <string name="month_day_year">%-e. %B %Y</string> + <string name="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%H:%M:%S %d.%m.%Y</string> + <string name="abbrev_month_day_year">%d.%m.%Y</string> + <string name="month_day">%-e. %B</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%-e. %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 674c64b..d121801 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -418,9 +418,6 @@ <string name="lockscreen_glogin_password_hint">"Passwort"</string> <string name="lockscreen_glogin_submit_button">"Anmelden"</string> <string name="lockscreen_glogin_invalid_input">"Ungültiger Nutzername oder ungültiges Passwort."</string> - <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string> - <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string> - <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string> <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string> <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string> <string name="status_bar_clear_all_button">"Benachrichtigungen löschen"</string> @@ -452,9 +449,6 @@ <string name="menu_enter_shortcut_label">"Enter"</string> <string name="menu_delete_shortcut_label">"löschen"</string> <string name="search_go">"Suche"</string> - <string name="today">"Heute"</string> - <string name="yesterday">"Gestern"</string> - <string name="tomorrow">"Morgen"</string> <string name="oneMonthDurationPast">"Vor 1 Monat"</string> <string name="beforeOneMonthDurationPast">"Vor mehr als 1 Monat"</string> <plurals name="num_seconds_ago"> @@ -536,13 +530,6 @@ <string name="weeks">"Wochen"</string> <string name="year">"Jahr"</string> <string name="years">"Jahre"</string> - <string name="sunday">"Sonntag"</string> - <string name="monday">"Montag"</string> - <string name="tuesday">"Dienstag"</string> - <string name="wednesday">"Mittwoch"</string> - <string name="thursday">"Donnerstag"</string> - <string name="friday">"Freitag"</string> - <string name="saturday">"Samstag"</string> <string name="every_weekday">"Jeden Wochentag (Mo-Fr)"</string> <string name="daily">"Täglich"</string> <string name="weekly">"Jede Woche am <xliff:g id="DAY">%s</xliff:g>"</string> @@ -552,9 +539,6 @@ <string name="VideoView_error_text_invalid_progressive_playback">"Leider ist dieses Video nicht für Streaming auf diesem Gerät gültig."</string> <string name="VideoView_error_text_unknown">"Dieses Video kann leider nicht abgespielt werden."</string> <string name="VideoView_error_button">"OK"</string> - <string name="am">"AM"</string> - <string name="pm">".."</string> - <string name="numeric_date">"<xliff:g id="DAY">%d</xliff:g>/<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="YEAR">%Y</xliff:g>"</string> <string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string> <string name="wday1_date1_wday2_date2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>"</string> <string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string> @@ -566,23 +550,12 @@ <string name="date_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="time_wday">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>"</string> - <string name="full_date_month_first" format="date">"<xliff:g id="DAY">d</xliff:g>'. '<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="full_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>'. '<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="medium_date_month_first" format="date">"<xliff:g id="DAY">d</xliff:g>'. '<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="medium_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>'. '<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="twelve_hour_time_format" format="date">"<xliff:g id="HOUR">h</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>' '<xliff:g id="AMPM">a</xliff:g>"</string> - <string name="twenty_four_hour_time_format" format="date">"<xliff:g id="HOUR">HH</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>"</string> <string name="noon">"Mittag"</string> <string name="Noon">"Mittag"</string> <string name="midnight">"Mitternacht"</string> <string name="Midnight">"Mitternacht"</string> - <string name="month_day">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>"</string> <!-- no translation found for month (7026169712234774086) --> <skip /> - <string name="month_day_year">"<xliff:g id="DAY">%-d</xliff:g>. <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="month_year">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string> - <string name="date_and_time">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g> <xliff:g id="DAY">%-d</xliff:g>. <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> <string name="same_year_md1_md2">"<xliff:g id="DAY1">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g>"</string> <string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g>"</string> <string name="same_year_mdy1_mdy2">"<xliff:g id="DAY1">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR">%9$s</xliff:g>"</string> @@ -607,82 +580,8 @@ <string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string> <string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="DAY1">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string> <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string> - <string name="abbrev_month_day_year">"<xliff:g id="DAY">%-d</xliff:g>. <xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="abbrev_month_year">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="abbrev_month_day">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="DAY">%-d</xliff:g>"</string> <!-- no translation found for abbrev_month (3131032032850777433) --> <skip /> - <string name="day_of_week_long_sunday">"Sonntag"</string> - <string name="day_of_week_long_monday">"Montag"</string> - <string name="day_of_week_long_tuesday">"Dienstag"</string> - <string name="day_of_week_long_wednesday">"Mittwoch"</string> - <string name="day_of_week_long_thursday">"Donnerstag"</string> - <string name="day_of_week_long_friday">"Freitag"</string> - <string name="day_of_week_long_saturday">"Samstag"</string> - <string name="day_of_week_medium_sunday">"So"</string> - <string name="day_of_week_medium_monday">"Mo"</string> - <string name="day_of_week_medium_tuesday">"Di"</string> - <string name="day_of_week_medium_wednesday">"Mi"</string> - <string name="day_of_week_medium_thursday">"Do"</string> - <string name="day_of_week_medium_friday">"Fr"</string> - <string name="day_of_week_medium_saturday">"Sa"</string> - <string name="day_of_week_short_sunday">"So"</string> - <string name="day_of_week_short_monday">"Mo"</string> - <string name="day_of_week_short_tuesday">"Di"</string> - <string name="day_of_week_short_wednesday">"Mi"</string> - <string name="day_of_week_short_thursday">"Do"</string> - <string name="day_of_week_short_friday">"Fr"</string> - <string name="day_of_week_short_saturday">"Sa"</string> - <string name="day_of_week_shorter_sunday">"So"</string> - <string name="day_of_week_shorter_monday">"März"</string> - <string name="day_of_week_shorter_tuesday">"Di"</string> - <string name="day_of_week_shorter_wednesday">"Mi"</string> - <string name="day_of_week_shorter_thursday">"Do"</string> - <string name="day_of_week_shorter_friday">"Fr"</string> - <string name="day_of_week_shorter_saturday">"Sa"</string> - <string name="day_of_week_shortest_sunday">"Sep"</string> - <string name="day_of_week_shortest_monday">"Mo"</string> - <string name="day_of_week_shortest_tuesday">"Do"</string> - <string name="day_of_week_shortest_wednesday">"Mi"</string> - <string name="day_of_week_shortest_thursday">"Do"</string> - <string name="day_of_week_shortest_friday">"Fr"</string> - <string name="day_of_week_shortest_saturday">"Sa"</string> - <string name="month_long_january">"Januar"</string> - <string name="month_long_february">"Februar"</string> - <string name="month_long_march">"März"</string> - <string name="month_long_april">"April"</string> - <string name="month_long_may">"Mai"</string> - <string name="month_long_june">"Juni"</string> - <string name="month_long_july">"Juli"</string> - <string name="month_long_august">"August"</string> - <string name="month_long_september">"September"</string> - <string name="month_long_october">"Oktober"</string> - <string name="month_long_november">"November"</string> - <string name="month_long_december">"Dezember"</string> - <string name="month_medium_january">"Jan."</string> - <string name="month_medium_february">"Feb."</string> - <string name="month_medium_march">"März"</string> - <string name="month_medium_april">"Apr."</string> - <string name="month_medium_may">"Mai"</string> - <string name="month_medium_june">"Juni"</string> - <string name="month_medium_july">"Juli"</string> - <string name="month_medium_august">"Aug"</string> - <string name="month_medium_september">"Sep."</string> - <string name="month_medium_october">"Okt."</string> - <string name="month_medium_november">"Nov."</string> - <string name="month_medium_december">"Dez."</string> - <string name="month_shortest_january">"Juli"</string> - <string name="month_shortest_february">"Fr"</string> - <string name="month_shortest_march">"März"</string> - <string name="month_shortest_april">"Apr"</string> - <string name="month_shortest_may">"Mo"</string> - <string name="month_shortest_june">"Juni"</string> - <string name="month_shortest_july">"Juli"</string> - <string name="month_shortest_august">"Aug."</string> - <string name="month_shortest_september">"Sep"</string> - <string name="month_shortest_october">"Okt."</string> - <string name="month_shortest_november">"No"</string> - <string name="month_shortest_december">"Dez."</string> <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string> <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string> <string name="selectAll">"Alles auswählen"</string> diff --git a/core/res/res/values-el-rGR/donottranslate-cldr.xml b/core/res/res/values-el-rGR/donottranslate-cldr.xml new file mode 100644 index 0000000..9d2a0aa --- /dev/null +++ b/core/res/res/values-el-rGR/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">Ιανουάριος</string> + <string name="month_long_standalone_february">Φεβρουάριος</string> + <string name="month_long_standalone_march">Μάρτιος</string> + <string name="month_long_standalone_april">Απρίλιος</string> + <string name="month_long_standalone_may">Μάιος</string> + <string name="month_long_standalone_june">Ιούνιος</string> + <string name="month_long_standalone_july">Ιούλιος</string> + <string name="month_long_standalone_august">Αύγουστος</string> + <string name="month_long_standalone_september">Σεπτέμβριος</string> + <string name="month_long_standalone_october">Οκτώβριος</string> + <string name="month_long_standalone_november">Νοέμβριος</string> + <string name="month_long_standalone_december">Δεκέμβριος</string> + + <string name="month_long_january">Ιανουαρίου</string> + <string name="month_long_february">Φεβρουαρίου</string> + <string name="month_long_march">Μαρτίου</string> + <string name="month_long_april">Απριλίου</string> + <string name="month_long_may">Μαΐου</string> + <string name="month_long_june">Ιουνίου</string> + <string name="month_long_july">Ιουλίου</string> + <string name="month_long_august">Αυγούστου</string> + <string name="month_long_september">Σεπτεμβρίου</string> + <string name="month_long_october">Οκτωβρίου</string> + <string name="month_long_november">Νοεμβρίου</string> + <string name="month_long_december">Δεκεμβρίου</string> + + <string name="month_medium_january">Ιαν</string> + <string name="month_medium_february">Φεβ</string> + <string name="month_medium_march">Μαρ</string> + <string name="month_medium_april">Απρ</string> + <string name="month_medium_may">Μαϊ</string> + <string name="month_medium_june">Ιουν</string> + <string name="month_medium_july">Ιουλ</string> + <string name="month_medium_august">Αυγ</string> + <string name="month_medium_september">Σεπ</string> + <string name="month_medium_october">Οκτ</string> + <string name="month_medium_november">Νοε</string> + <string name="month_medium_december">Δεκ</string> + + <string name="month_shortest_january">Ι</string> + <string name="month_shortest_february">Φ</string> + <string name="month_shortest_march">Μ</string> + <string name="month_shortest_april">Α</string> + <string name="month_shortest_may">Μ</string> + <string name="month_shortest_june">Ι</string> + <string name="month_shortest_july">Ι</string> + <string name="month_shortest_august">Α</string> + <string name="month_shortest_september">Σ</string> + <string name="month_shortest_october">Ο</string> + <string name="month_shortest_november">Ν</string> + <string name="month_shortest_december">Δ</string> + + <string name="day_of_week_long_sunday">Κυριακή</string> + <string name="day_of_week_long_monday">Δευτέρα</string> + <string name="day_of_week_long_tuesday">Τρίτη</string> + <string name="day_of_week_long_wednesday">Τετάρτη</string> + <string name="day_of_week_long_thursday">Πέμπτη</string> + <string name="day_of_week_long_friday">Παρασκευή</string> + <string name="day_of_week_long_saturday">Σάββατο</string> + + <string name="day_of_week_medium_sunday">Κυρ</string> + <string name="day_of_week_medium_monday">Δευ</string> + <string name="day_of_week_medium_tuesday">Τρι</string> + <string name="day_of_week_medium_wednesday">Τετ</string> + <string name="day_of_week_medium_thursday">Πεμ</string> + <string name="day_of_week_medium_friday">Παρ</string> + <string name="day_of_week_medium_saturday">Σαβ</string> + + <string name="day_of_week_short_sunday">Κυρ</string> + <string name="day_of_week_short_monday">Δευ</string> + <string name="day_of_week_short_tuesday">Τρι</string> + <string name="day_of_week_short_wednesday">Τετ</string> + <string name="day_of_week_short_thursday">Πεμ</string> + <string name="day_of_week_short_friday">Παρ</string> + <string name="day_of_week_short_saturday">Σαβ</string> + + <string name="day_of_week_shortest_sunday">Κ</string> + <string name="day_of_week_shortest_monday">Δ</string> + <string name="day_of_week_shortest_tuesday">Τ</string> + <string name="day_of_week_shortest_wednesday">Τ</string> + <string name="day_of_week_shortest_thursday">Π</string> + <string name="day_of_week_shortest_friday">Π</string> + <string name="day_of_week_shortest_saturday">Σ</string> + + <string name="am">π.μ.</string> + <string name="pm">μ.μ.</string> + <string name="yesterday">Χτες</string> + <string name="today">Σήμερα</string> + <string name="tomorrow">Αύριο</string> + + <string name="hour_minute_ampm">%-l:%M %p</string> + <string name="hour_minute_cap_ampm">%-l:%M %^p</string> + <string name="numeric_date">%d/%m/%Y</string> + <string name="numeric_date_format">dd/MM/yyyy</string> + <string name="month_day_year">%d %B %Y</string> + <string name="time_of_day">%-l:%M:%S %p</string> + <string name="date_and_time">%-l:%M:%S %p %d %b %Y</string> + <string name="abbrev_month_day_year">%d %b %Y</string> + <string name="month_day">%-e %B</string> + <string name="month">%-B</string> + <string name="month_year">%-B %Y</string> + <string name="abbrev_month_day">%-e %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-en-rAU/donottranslate-cldr.xml b/core/res/res/values-en-rAU/donottranslate-cldr.xml new file mode 100644 index 0000000..7ed029c --- /dev/null +++ b/core/res/res/values-en-rAU/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">January</string> + <string name="month_long_standalone_february">February</string> + <string name="month_long_standalone_march">March</string> + <string name="month_long_standalone_april">April</string> + <string name="month_long_standalone_may">May</string> + <string name="month_long_standalone_june">June</string> + <string name="month_long_standalone_july">July</string> + <string name="month_long_standalone_august">August</string> + <string name="month_long_standalone_september">September</string> + <string name="month_long_standalone_october">October</string> + <string name="month_long_standalone_november">November</string> + <string name="month_long_standalone_december">December</string> + + <string name="month_long_january">January</string> + <string name="month_long_february">February</string> + <string name="month_long_march">March</string> + <string name="month_long_april">April</string> + <string name="month_long_may">May</string> + <string name="month_long_june">June</string> + <string name="month_long_july">July</string> + <string name="month_long_august">August</string> + <string name="month_long_september">September</string> + <string name="month_long_october">October</string> + <string name="month_long_november">November</string> + <string name="month_long_december">December</string> + + <string name="month_medium_january">Jan</string> + <string name="month_medium_february">Feb</string> + <string name="month_medium_march">Mar</string> + <string name="month_medium_april">Apr</string> + <string name="month_medium_may">May</string> + <string name="month_medium_june">Jun</string> + <string name="month_medium_july">Jul</string> + <string name="month_medium_august">Aug</string> + <string name="month_medium_september">Sep</string> + <string name="month_medium_october">Oct</string> + <string name="month_medium_november">Nov</string> + <string name="month_medium_december">Dec</string> + + <string name="month_shortest_january">J</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">Sunday</string> + <string name="day_of_week_long_monday">Monday</string> + <string name="day_of_week_long_tuesday">Tuesday</string> + <string name="day_of_week_long_wednesday">Wednesday</string> + <string name="day_of_week_long_thursday">Thursday</string> + <string name="day_of_week_long_friday">Friday</string> + <string name="day_of_week_long_saturday">Saturday</string> + + <string name="day_of_week_medium_sunday">Sun</string> + <string name="day_of_week_medium_monday">Mon</string> + <string name="day_of_week_medium_tuesday">Tue</string> + <string name="day_of_week_medium_wednesday">Wed</string> + <string name="day_of_week_medium_thursday">Thu</string> + <string name="day_of_week_medium_friday">Fri</string> + <string name="day_of_week_medium_saturday">Sat</string> + + <string name="day_of_week_short_sunday">Su</string> + <string name="day_of_week_short_monday">Mo</string> + <string name="day_of_week_short_tuesday">Tu</string> + <string name="day_of_week_short_wednesday">We</string> + <string name="day_of_week_short_thursday">Th</string> + <string name="day_of_week_short_friday">Fr</string> + <string name="day_of_week_short_saturday">Sa</string> + + <string name="day_of_week_shortest_sunday">S</string> + <string name="day_of_week_shortest_monday">M</string> + <string name="day_of_week_shortest_tuesday">T</string> + <string name="day_of_week_shortest_wednesday">W</string> + <string name="day_of_week_shortest_thursday">T</string> + <string name="day_of_week_shortest_friday">F</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">a.m.</string> + <string name="pm">p.m.</string> + <string name="yesterday">Yesterday</string> + <string name="today">Today</string> + <string name="tomorrow">Tomorrow</string> + + <string name="hour_minute_ampm">%-l:%M %p</string> + <string name="hour_minute_cap_ampm">%-l:%M %^p</string> + <string name="numeric_date">%-e/%m/%Y</string> + <string name="numeric_date_format">d/MM/yyyy</string> + <string name="month_day_year">%-e %B %Y</string> + <string name="time_of_day">%-l:%M:%S %p</string> + <string name="date_and_time">%-l:%M:%S %p %d/%m/%Y</string> + <string name="abbrev_month_day_year">%d/%m/%Y</string> + <string name="month_day">%-e %B</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%b %-e</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 9da879b..d482222 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -710,7 +710,6 @@ <!-- no translation found for lockscreen_glogin_invalid_input (4881057177478491580) --> <skip /> <!-- no translation found for status_bar_time_format (2168573805413119180) --> - <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string> <!-- no translation found for hour_minute_ampm (1850330605794978742) --> <skip /> <!-- no translation found for hour_minute_cap_ampm (1122840227537374196) --> @@ -864,7 +863,6 @@ <!-- from values-de/strings.xml and removal of all the german craziyness--> <skip /> <!-- no translation found for numeric_date (5120078478872821100) --> - <string name="numeric_date">"<xliff:g id="DAY">%d</xliff:g>/<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="YEAR">%Y</xliff:g>"</string> <!-- no translation found for wday1_date1_time1_wday2_date2_time2 (7066878981949584861) --> <string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string> <!-- no translation found for wday1_date1_wday2_date2 (8671068747172261907) --> @@ -888,11 +886,9 @@ <!-- no translation found for full_date_month_first (6011143962222283357) --> <skip /> <!-- no translation found for full_date_day_first (8621594762705478189) --> - <string name="full_date_day_first">"<xliff:g id="DAY">dd</xliff:g> <xliff:g id="MONTH">MMMM</xliff:g> <xliff:g id="YEAR">yyyy</xliff:g>"</string> <!-- no translation found for medium_date_month_first (48990963718825728) --> <skip /> <!-- no translation found for medium_date_day_first (2898992016440387123) --> - <string name="medium_date_day_first">"<xliff:g id="DAY">dd</xliff:g> <xliff:g id="MONTH">MMM</xliff:g> <xliff:g id="YEAR">yyyy</xliff:g>"</string> <!-- no translation found for twelve_hour_time_format (6015557937879492156) --> <skip /> <!-- no translation found for twenty_four_hour_time_format (5176807998669709535) --> @@ -906,15 +902,12 @@ <!-- no translation found for Midnight (1260172107848123187) --> <skip /> <!-- no translation found for month_day (3356633704511426364) --> - <string name="month_day">"<xliff:g id="day" example="9">%-d</xliff:g> <xliff:g id="month" example="October">%B</xliff:g>"</string> <!-- no translation found for month (3017405760734206414) --> <skip /> <!-- no translation found for month_day_year (2435948225709176752) --> - <string name="month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> <!-- no translation found for month_year (6228414124777343135) --> <skip /> <!-- no translation found for time_of_day (8375993139317154157) --> - <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string> <!-- no translation found for date_and_time (9197690194373107109) --> <skip /> <!-- no translation found for same_year_md1_md2 (9199324363135981317) --> @@ -922,7 +915,6 @@ <!-- no translation found for same_year_wday1_md1_wday2_md2 (6006392413355305178) --> <string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>"</string> <!-- no translation found for date_and_time (353898423108629694) --> - <string name="date_and_time">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g> <xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> <!-- no translation found for same_year_mdy1_mdy2 (1576657593937827090) --> <string name="same_year_mdy1_mdy2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR">%9$s</xliff:g>"</string> <!-- no translation found for same_year_wday1_mdy1_wday2_mdy2 (9135935796468891580) --> @@ -968,11 +960,9 @@ <!-- no translation found for same_month_wday1_mdy1_time1_wday2_mdy2_time2 (1332950588774239228) --> <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string> <!-- no translation found for abbrev_month_day_year (5767271534015320250) --> - <string name="abbrev_month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> <!-- no translation found for abbrev_month_year (8058929633673942490) --> <skip /> <!-- no translation found for abbrev_month_day (458867920693482757) --> - <string name="abbrev_month_day">"<xliff:g id="day" example="31">%-d</xliff:g> <xliff:g id="month" example="Oct">%b</xliff:g>"</string> <!-- no translation found for abbrev_month (1674509986330181349) --> <skip /> <!-- no translation found for day_of_week_long_sunday (9057662850446501884) --> diff --git a/core/res/res/values-en-rCA/donottranslate-cldr.xml b/core/res/res/values-en-rCA/donottranslate-cldr.xml new file mode 100644 index 0000000..2fb3ef6 --- /dev/null +++ b/core/res/res/values-en-rCA/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">January</string> + <string name="month_long_standalone_february">February</string> + <string name="month_long_standalone_march">March</string> + <string name="month_long_standalone_april">April</string> + <string name="month_long_standalone_may">May</string> + <string name="month_long_standalone_june">June</string> + <string name="month_long_standalone_july">July</string> + <string name="month_long_standalone_august">August</string> + <string name="month_long_standalone_september">September</string> + <string name="month_long_standalone_october">October</string> + <string name="month_long_standalone_november">November</string> + <string name="month_long_standalone_december">December</string> + + <string name="month_long_january">January</string> + <string name="month_long_february">February</string> + <string name="month_long_march">March</string> + <string name="month_long_april">April</string> + <string name="month_long_may">May</string> + <string name="month_long_june">June</string> + <string name="month_long_july">July</string> + <string name="month_long_august">August</string> + <string name="month_long_september">September</string> + <string name="month_long_october">October</string> + <string name="month_long_november">November</string> + <string name="month_long_december">December</string> + + <string name="month_medium_january">Jan</string> + <string name="month_medium_february">Feb</string> + <string name="month_medium_march">Mar</string> + <string name="month_medium_april">Apr</string> + <string name="month_medium_may">May</string> + <string name="month_medium_june">Jun</string> + <string name="month_medium_july">Jul</string> + <string name="month_medium_august">Aug</string> + <string name="month_medium_september">Sep</string> + <string name="month_medium_october">Oct</string> + <string name="month_medium_november">Nov</string> + <string name="month_medium_december">Dec</string> + + <string name="month_shortest_january">J</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">Sunday</string> + <string name="day_of_week_long_monday">Monday</string> + <string name="day_of_week_long_tuesday">Tuesday</string> + <string name="day_of_week_long_wednesday">Wednesday</string> + <string name="day_of_week_long_thursday">Thursday</string> + <string name="day_of_week_long_friday">Friday</string> + <string name="day_of_week_long_saturday">Saturday</string> + + <string name="day_of_week_medium_sunday">Sun</string> + <string name="day_of_week_medium_monday">Mon</string> + <string name="day_of_week_medium_tuesday">Tue</string> + <string name="day_of_week_medium_wednesday">Wed</string> + <string name="day_of_week_medium_thursday">Thu</string> + <string name="day_of_week_medium_friday">Fri</string> + <string name="day_of_week_medium_saturday">Sat</string> + + <string name="day_of_week_short_sunday">Su</string> + <string name="day_of_week_short_monday">Mo</string> + <string name="day_of_week_short_tuesday">Tu</string> + <string name="day_of_week_short_wednesday">We</string> + <string name="day_of_week_short_thursday">Th</string> + <string name="day_of_week_short_friday">Fr</string> + <string name="day_of_week_short_saturday">Sa</string> + + <string name="day_of_week_shortest_sunday">S</string> + <string name="day_of_week_shortest_monday">M</string> + <string name="day_of_week_shortest_tuesday">T</string> + <string name="day_of_week_shortest_wednesday">W</string> + <string name="day_of_week_shortest_thursday">T</string> + <string name="day_of_week_shortest_friday">F</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">a.m.</string> + <string name="pm">p.m.</string> + <string name="yesterday">Yesterday</string> + <string name="today">Today</string> + <string name="tomorrow">Tomorrow</string> + + <string name="hour_minute_ampm">%-l:%M %p</string> + <string name="hour_minute_cap_ampm">%-l:%M %^p</string> + <string name="numeric_date">%Y-%m-%d</string> + <string name="numeric_date_format">yyyy-MM-dd</string> + <string name="month_day_year">%B %-e, %Y</string> + <string name="time_of_day">%-l:%M:%S %p</string> + <string name="date_and_time">%-l:%M:%S %p %Y-%m-%d</string> + <string name="abbrev_month_day_year">%Y-%m-%d</string> + <string name="month_day">%B %-e</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%b %-e</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-en-rGB/donottranslate-cldr.xml b/core/res/res/values-en-rGB/donottranslate-cldr.xml new file mode 100644 index 0000000..0c544af --- /dev/null +++ b/core/res/res/values-en-rGB/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">January</string> + <string name="month_long_standalone_february">February</string> + <string name="month_long_standalone_march">March</string> + <string name="month_long_standalone_april">April</string> + <string name="month_long_standalone_may">May</string> + <string name="month_long_standalone_june">June</string> + <string name="month_long_standalone_july">July</string> + <string name="month_long_standalone_august">August</string> + <string name="month_long_standalone_september">September</string> + <string name="month_long_standalone_october">October</string> + <string name="month_long_standalone_november">November</string> + <string name="month_long_standalone_december">December</string> + + <string name="month_long_january">January</string> + <string name="month_long_february">February</string> + <string name="month_long_march">March</string> + <string name="month_long_april">April</string> + <string name="month_long_may">May</string> + <string name="month_long_june">June</string> + <string name="month_long_july">July</string> + <string name="month_long_august">August</string> + <string name="month_long_september">September</string> + <string name="month_long_october">October</string> + <string name="month_long_november">November</string> + <string name="month_long_december">December</string> + + <string name="month_medium_january">Jan</string> + <string name="month_medium_february">Feb</string> + <string name="month_medium_march">Mar</string> + <string name="month_medium_april">Apr</string> + <string name="month_medium_may">May</string> + <string name="month_medium_june">Jun</string> + <string name="month_medium_july">Jul</string> + <string name="month_medium_august">Aug</string> + <string name="month_medium_september">Sep</string> + <string name="month_medium_october">Oct</string> + <string name="month_medium_november">Nov</string> + <string name="month_medium_december">Dec</string> + + <string name="month_shortest_january">J</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">Sunday</string> + <string name="day_of_week_long_monday">Monday</string> + <string name="day_of_week_long_tuesday">Tuesday</string> + <string name="day_of_week_long_wednesday">Wednesday</string> + <string name="day_of_week_long_thursday">Thursday</string> + <string name="day_of_week_long_friday">Friday</string> + <string name="day_of_week_long_saturday">Saturday</string> + + <string name="day_of_week_medium_sunday">Sun</string> + <string name="day_of_week_medium_monday">Mon</string> + <string name="day_of_week_medium_tuesday">Tue</string> + <string name="day_of_week_medium_wednesday">Wed</string> + <string name="day_of_week_medium_thursday">Thu</string> + <string name="day_of_week_medium_friday">Fri</string> + <string name="day_of_week_medium_saturday">Sat</string> + + <string name="day_of_week_short_sunday">Su</string> + <string name="day_of_week_short_monday">Mo</string> + <string name="day_of_week_short_tuesday">Tu</string> + <string name="day_of_week_short_wednesday">We</string> + <string name="day_of_week_short_thursday">Th</string> + <string name="day_of_week_short_friday">Fr</string> + <string name="day_of_week_short_saturday">Sa</string> + + <string name="day_of_week_shortest_sunday">S</string> + <string name="day_of_week_shortest_monday">M</string> + <string name="day_of_week_shortest_tuesday">T</string> + <string name="day_of_week_shortest_wednesday">W</string> + <string name="day_of_week_shortest_thursday">T</string> + <string name="day_of_week_shortest_friday">F</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">a.m.</string> + <string name="pm">p.m.</string> + <string name="yesterday">Yesterday</string> + <string name="today">Today</string> + <string name="tomorrow">Tomorrow</string> + + <string name="hour_minute_ampm">%H:%M</string> + <string name="hour_minute_cap_ampm">%H:%M</string> + <string name="numeric_date">%d/%m/%Y</string> + <string name="numeric_date_format">dd/MM/yyyy</string> + <string name="month_day_year">%-e %B %Y</string> + <string name="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%H:%M:%S %-e %b %Y</string> + <string name="abbrev_month_day_year">%-e %b %Y</string> + <string name="month_day">%-e %B</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%b %-e</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-en-rIE/donottranslate-cldr.xml b/core/res/res/values-en-rIE/donottranslate-cldr.xml new file mode 100644 index 0000000..0c544af --- /dev/null +++ b/core/res/res/values-en-rIE/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">January</string> + <string name="month_long_standalone_february">February</string> + <string name="month_long_standalone_march">March</string> + <string name="month_long_standalone_april">April</string> + <string name="month_long_standalone_may">May</string> + <string name="month_long_standalone_june">June</string> + <string name="month_long_standalone_july">July</string> + <string name="month_long_standalone_august">August</string> + <string name="month_long_standalone_september">September</string> + <string name="month_long_standalone_october">October</string> + <string name="month_long_standalone_november">November</string> + <string name="month_long_standalone_december">December</string> + + <string name="month_long_january">January</string> + <string name="month_long_february">February</string> + <string name="month_long_march">March</string> + <string name="month_long_april">April</string> + <string name="month_long_may">May</string> + <string name="month_long_june">June</string> + <string name="month_long_july">July</string> + <string name="month_long_august">August</string> + <string name="month_long_september">September</string> + <string name="month_long_october">October</string> + <string name="month_long_november">November</string> + <string name="month_long_december">December</string> + + <string name="month_medium_january">Jan</string> + <string name="month_medium_february">Feb</string> + <string name="month_medium_march">Mar</string> + <string name="month_medium_april">Apr</string> + <string name="month_medium_may">May</string> + <string name="month_medium_june">Jun</string> + <string name="month_medium_july">Jul</string> + <string name="month_medium_august">Aug</string> + <string name="month_medium_september">Sep</string> + <string name="month_medium_october">Oct</string> + <string name="month_medium_november">Nov</string> + <string name="month_medium_december">Dec</string> + + <string name="month_shortest_january">J</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">Sunday</string> + <string name="day_of_week_long_monday">Monday</string> + <string name="day_of_week_long_tuesday">Tuesday</string> + <string name="day_of_week_long_wednesday">Wednesday</string> + <string name="day_of_week_long_thursday">Thursday</string> + <string name="day_of_week_long_friday">Friday</string> + <string name="day_of_week_long_saturday">Saturday</string> + + <string name="day_of_week_medium_sunday">Sun</string> + <string name="day_of_week_medium_monday">Mon</string> + <string name="day_of_week_medium_tuesday">Tue</string> + <string name="day_of_week_medium_wednesday">Wed</string> + <string name="day_of_week_medium_thursday">Thu</string> + <string name="day_of_week_medium_friday">Fri</string> + <string name="day_of_week_medium_saturday">Sat</string> + + <string name="day_of_week_short_sunday">Su</string> + <string name="day_of_week_short_monday">Mo</string> + <string name="day_of_week_short_tuesday">Tu</string> + <string name="day_of_week_short_wednesday">We</string> + <string name="day_of_week_short_thursday">Th</string> + <string name="day_of_week_short_friday">Fr</string> + <string name="day_of_week_short_saturday">Sa</string> + + <string name="day_of_week_shortest_sunday">S</string> + <string name="day_of_week_shortest_monday">M</string> + <string name="day_of_week_shortest_tuesday">T</string> + <string name="day_of_week_shortest_wednesday">W</string> + <string name="day_of_week_shortest_thursday">T</string> + <string name="day_of_week_shortest_friday">F</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">a.m.</string> + <string name="pm">p.m.</string> + <string name="yesterday">Yesterday</string> + <string name="today">Today</string> + <string name="tomorrow">Tomorrow</string> + + <string name="hour_minute_ampm">%H:%M</string> + <string name="hour_minute_cap_ampm">%H:%M</string> + <string name="numeric_date">%d/%m/%Y</string> + <string name="numeric_date_format">dd/MM/yyyy</string> + <string name="month_day_year">%-e %B %Y</string> + <string name="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%H:%M:%S %-e %b %Y</string> + <string name="abbrev_month_day_year">%-e %b %Y</string> + <string name="month_day">%-e %B</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%b %-e</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-en-rIN/donottranslate-cldr.xml b/core/res/res/values-en-rIN/donottranslate-cldr.xml new file mode 100644 index 0000000..823c3c1 --- /dev/null +++ b/core/res/res/values-en-rIN/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">January</string> + <string name="month_long_standalone_february">February</string> + <string name="month_long_standalone_march">March</string> + <string name="month_long_standalone_april">April</string> + <string name="month_long_standalone_may">May</string> + <string name="month_long_standalone_june">June</string> + <string name="month_long_standalone_july">July</string> + <string name="month_long_standalone_august">August</string> + <string name="month_long_standalone_september">September</string> + <string name="month_long_standalone_october">October</string> + <string name="month_long_standalone_november">November</string> + <string name="month_long_standalone_december">December</string> + + <string name="month_long_january">January</string> + <string name="month_long_february">February</string> + <string name="month_long_march">March</string> + <string name="month_long_april">April</string> + <string name="month_long_may">May</string> + <string name="month_long_june">June</string> + <string name="month_long_july">July</string> + <string name="month_long_august">August</string> + <string name="month_long_september">September</string> + <string name="month_long_october">October</string> + <string name="month_long_november">November</string> + <string name="month_long_december">December</string> + + <string name="month_medium_january">Jan</string> + <string name="month_medium_february">Feb</string> + <string name="month_medium_march">Mar</string> + <string name="month_medium_april">Apr</string> + <string name="month_medium_may">May</string> + <string name="month_medium_june">Jun</string> + <string name="month_medium_july">Jul</string> + <string name="month_medium_august">Aug</string> + <string name="month_medium_september">Sep</string> + <string name="month_medium_october">Oct</string> + <string name="month_medium_november">Nov</string> + <string name="month_medium_december">Dec</string> + + <string name="month_shortest_january">J</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">Sunday</string> + <string name="day_of_week_long_monday">Monday</string> + <string name="day_of_week_long_tuesday">Tuesday</string> + <string name="day_of_week_long_wednesday">Wednesday</string> + <string name="day_of_week_long_thursday">Thursday</string> + <string name="day_of_week_long_friday">Friday</string> + <string name="day_of_week_long_saturday">Saturday</string> + + <string name="day_of_week_medium_sunday">Sun</string> + <string name="day_of_week_medium_monday">Mon</string> + <string name="day_of_week_medium_tuesday">Tue</string> + <string name="day_of_week_medium_wednesday">Wed</string> + <string name="day_of_week_medium_thursday">Thu</string> + <string name="day_of_week_medium_friday">Fri</string> + <string name="day_of_week_medium_saturday">Sat</string> + + <string name="day_of_week_short_sunday">Su</string> + <string name="day_of_week_short_monday">Mo</string> + <string name="day_of_week_short_tuesday">Tu</string> + <string name="day_of_week_short_wednesday">We</string> + <string name="day_of_week_short_thursday">Th</string> + <string name="day_of_week_short_friday">Fr</string> + <string name="day_of_week_short_saturday">Sa</string> + + <string name="day_of_week_shortest_sunday">S</string> + <string name="day_of_week_shortest_monday">M</string> + <string name="day_of_week_shortest_tuesday">T</string> + <string name="day_of_week_shortest_wednesday">W</string> + <string name="day_of_week_shortest_thursday">T</string> + <string name="day_of_week_shortest_friday">F</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">a.m.</string> + <string name="pm">p.m.</string> + <string name="yesterday">Yesterday</string> + <string name="today">Today</string> + <string name="tomorrow">Tomorrow</string> + + <string name="hour_minute_ampm">%-l:%M %p</string> + <string name="hour_minute_cap_ampm">%-l:%M %^p</string> + <string name="numeric_date">%d/%m/%Y</string> + <string name="numeric_date_format">dd/MM/yyyy</string> + <string name="month_day_year">%-e %B %Y</string> + <string name="time_of_day">%-l:%M:%S %p</string> + <string name="date_and_time">%-l:%M:%S %p %d-%b-%Y</string> + <string name="abbrev_month_day_year">%d-%b-%Y</string> + <string name="month_day">%-e %B</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%b %-e</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-en-rNZ/donottranslate-cldr.xml b/core/res/res/values-en-rNZ/donottranslate-cldr.xml new file mode 100644 index 0000000..bcd976c --- /dev/null +++ b/core/res/res/values-en-rNZ/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">January</string> + <string name="month_long_standalone_february">February</string> + <string name="month_long_standalone_march">March</string> + <string name="month_long_standalone_april">April</string> + <string name="month_long_standalone_may">May</string> + <string name="month_long_standalone_june">June</string> + <string name="month_long_standalone_july">July</string> + <string name="month_long_standalone_august">August</string> + <string name="month_long_standalone_september">September</string> + <string name="month_long_standalone_october">October</string> + <string name="month_long_standalone_november">November</string> + <string name="month_long_standalone_december">December</string> + + <string name="month_long_january">January</string> + <string name="month_long_february">February</string> + <string name="month_long_march">March</string> + <string name="month_long_april">April</string> + <string name="month_long_may">May</string> + <string name="month_long_june">June</string> + <string name="month_long_july">July</string> + <string name="month_long_august">August</string> + <string name="month_long_september">September</string> + <string name="month_long_october">October</string> + <string name="month_long_november">November</string> + <string name="month_long_december">December</string> + + <string name="month_medium_january">Jan</string> + <string name="month_medium_february">Feb</string> + <string name="month_medium_march">Mar</string> + <string name="month_medium_april">Apr</string> + <string name="month_medium_may">May</string> + <string name="month_medium_june">Jun</string> + <string name="month_medium_july">Jul</string> + <string name="month_medium_august">Aug</string> + <string name="month_medium_september">Sep</string> + <string name="month_medium_october">Oct</string> + <string name="month_medium_november">Nov</string> + <string name="month_medium_december">Dec</string> + + <string name="month_shortest_january">J</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">Sunday</string> + <string name="day_of_week_long_monday">Monday</string> + <string name="day_of_week_long_tuesday">Tuesday</string> + <string name="day_of_week_long_wednesday">Wednesday</string> + <string name="day_of_week_long_thursday">Thursday</string> + <string name="day_of_week_long_friday">Friday</string> + <string name="day_of_week_long_saturday">Saturday</string> + + <string name="day_of_week_medium_sunday">Sun</string> + <string name="day_of_week_medium_monday">Mon</string> + <string name="day_of_week_medium_tuesday">Tue</string> + <string name="day_of_week_medium_wednesday">Wed</string> + <string name="day_of_week_medium_thursday">Thu</string> + <string name="day_of_week_medium_friday">Fri</string> + <string name="day_of_week_medium_saturday">Sat</string> + + <string name="day_of_week_short_sunday">Su</string> + <string name="day_of_week_short_monday">Mo</string> + <string name="day_of_week_short_tuesday">Tu</string> + <string name="day_of_week_short_wednesday">We</string> + <string name="day_of_week_short_thursday">Th</string> + <string name="day_of_week_short_friday">Fr</string> + <string name="day_of_week_short_saturday">Sa</string> + + <string name="day_of_week_shortest_sunday">S</string> + <string name="day_of_week_shortest_monday">M</string> + <string name="day_of_week_shortest_tuesday">T</string> + <string name="day_of_week_shortest_wednesday">W</string> + <string name="day_of_week_shortest_thursday">T</string> + <string name="day_of_week_shortest_friday">F</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">a.m.</string> + <string name="pm">p.m.</string> + <string name="yesterday">Yesterday</string> + <string name="today">Today</string> + <string name="tomorrow">Tomorrow</string> + + <string name="hour_minute_ampm">%-l:%M %p</string> + <string name="hour_minute_cap_ampm">%-l:%M %^p</string> + <string name="numeric_date">%-e/%m/%Y</string> + <string name="numeric_date_format">d/MM/yyyy</string> + <string name="month_day_year">%-e %B %Y</string> + <string name="time_of_day">%-l:%M:%S %p</string> + <string name="date_and_time">%-l:%M:%S %p %-e/%m/%Y</string> + <string name="abbrev_month_day_year">%-e/%m/%Y</string> + <string name="month_day">%-e %B</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%b %-e</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-en-rSG/donottranslate-cldr.xml b/core/res/res/values-en-rSG/donottranslate-cldr.xml new file mode 100644 index 0000000..f305948 --- /dev/null +++ b/core/res/res/values-en-rSG/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">January</string> + <string name="month_long_standalone_february">February</string> + <string name="month_long_standalone_march">March</string> + <string name="month_long_standalone_april">April</string> + <string name="month_long_standalone_may">May</string> + <string name="month_long_standalone_june">June</string> + <string name="month_long_standalone_july">July</string> + <string name="month_long_standalone_august">August</string> + <string name="month_long_standalone_september">September</string> + <string name="month_long_standalone_october">October</string> + <string name="month_long_standalone_november">November</string> + <string name="month_long_standalone_december">December</string> + + <string name="month_long_january">January</string> + <string name="month_long_february">February</string> + <string name="month_long_march">March</string> + <string name="month_long_april">April</string> + <string name="month_long_may">May</string> + <string name="month_long_june">June</string> + <string name="month_long_july">July</string> + <string name="month_long_august">August</string> + <string name="month_long_september">September</string> + <string name="month_long_october">October</string> + <string name="month_long_november">November</string> + <string name="month_long_december">December</string> + + <string name="month_medium_january">Jan</string> + <string name="month_medium_february">Feb</string> + <string name="month_medium_march">Mar</string> + <string name="month_medium_april">Apr</string> + <string name="month_medium_may">May</string> + <string name="month_medium_june">Jun</string> + <string name="month_medium_july">Jul</string> + <string name="month_medium_august">Aug</string> + <string name="month_medium_september">Sep</string> + <string name="month_medium_october">Oct</string> + <string name="month_medium_november">Nov</string> + <string name="month_medium_december">Dec</string> + + <string name="month_shortest_january">J</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">Sunday</string> + <string name="day_of_week_long_monday">Monday</string> + <string name="day_of_week_long_tuesday">Tuesday</string> + <string name="day_of_week_long_wednesday">Wednesday</string> + <string name="day_of_week_long_thursday">Thursday</string> + <string name="day_of_week_long_friday">Friday</string> + <string name="day_of_week_long_saturday">Saturday</string> + + <string name="day_of_week_medium_sunday">Sun</string> + <string name="day_of_week_medium_monday">Mon</string> + <string name="day_of_week_medium_tuesday">Tue</string> + <string name="day_of_week_medium_wednesday">Wed</string> + <string name="day_of_week_medium_thursday">Thu</string> + <string name="day_of_week_medium_friday">Fri</string> + <string name="day_of_week_medium_saturday">Sat</string> + + <string name="day_of_week_short_sunday">Su</string> + <string name="day_of_week_short_monday">Mo</string> + <string name="day_of_week_short_tuesday">Tu</string> + <string name="day_of_week_short_wednesday">We</string> + <string name="day_of_week_short_thursday">Th</string> + <string name="day_of_week_short_friday">Fr</string> + <string name="day_of_week_short_saturday">Sa</string> + + <string name="day_of_week_shortest_sunday">S</string> + <string name="day_of_week_shortest_monday">M</string> + <string name="day_of_week_shortest_tuesday">T</string> + <string name="day_of_week_shortest_wednesday">W</string> + <string name="day_of_week_shortest_thursday">T</string> + <string name="day_of_week_shortest_friday">F</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">a.m.</string> + <string name="pm">p.m.</string> + <string name="yesterday">Yesterday</string> + <string name="today">Today</string> + <string name="tomorrow">Tomorrow</string> + + <string name="hour_minute_ampm">%-l:%M %p</string> + <string name="hour_minute_cap_ampm">%-l:%M %^p</string> + <string name="numeric_date">%-m/%-e/%Y</string> + <string name="numeric_date_format">M/d/yyyy</string> + <string name="month_day_year">%B %-e, %Y</string> + <string name="time_of_day">%-l:%M:%S %p</string> + <string name="date_and_time">%-l:%M:%S %p %b %-e, %Y</string> + <string name="abbrev_month_day_year">%b %-e, %Y</string> + <string name="month_day">%B %-e</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%b %-e</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-en-rSG/strings.xml b/core/res/res/values-en-rSG/strings.xml index 6850a5d..1c6eda2 100644 --- a/core/res/res/values-en-rSG/strings.xml +++ b/core/res/res/values-en-rSG/strings.xml @@ -710,7 +710,6 @@ <!-- no translation found for lockscreen_glogin_invalid_input (4881057177478491580) --> <skip /> <!-- no translation found for status_bar_time_format (2168573805413119180) --> - <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string> <!-- no translation found for hour_minute_ampm (1850330605794978742) --> <skip /> <!-- no translation found for hour_minute_cap_ampm (1122840227537374196) --> @@ -867,7 +866,6 @@ <!-- no translation found for wday1_date1_wday2_date2 (8671068747172261907) --> <string name="wday1_date1_wday2_date2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>"</string> <!-- no translation found for numeric_date (5537215108967329745) --> - <string name="numeric_date">"<xliff:g id="DAY">%d</xliff:g>/<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="YEAR">%Y</xliff:g>"</string> <!-- no translation found for date1_time1_date2_time2 (3645498975775629615) --> <string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string> <!-- no translation found for date1_date2 (377057563556488062) --> @@ -885,11 +883,9 @@ <!-- no translation found for full_date_month_first (6011143962222283357) --> <skip /> <!-- no translation found for full_date_day_first (8621594762705478189) --> - <string name="full_date_day_first">"<xliff:g id="DAY">dd</xliff:g> <xliff:g id="MONTH">MMMM</xliff:g> <xliff:g id="YEAR">yyyy</xliff:g>"</string> <!-- no translation found for medium_date_month_first (48990963718825728) --> <skip /> <!-- no translation found for medium_date_day_first (2898992016440387123) --> - <string name="medium_date_day_first">"<xliff:g id="DAY">dd</xliff:g> <xliff:g id="MONTH">MMM</xliff:g> <xliff:g id="YEAR">yyyy</xliff:g>"</string> <!-- no translation found for twelve_hour_time_format (6015557937879492156) --> <skip /> <!-- no translation found for twenty_four_hour_time_format (5176807998669709535) --> @@ -903,17 +899,13 @@ <!-- no translation found for Midnight (1260172107848123187) --> <skip /> <!-- no translation found for month_day (3356633704511426364) --> - <string name="month_day">"<xliff:g id="day" example="9">%-d</xliff:g> <xliff:g id="month" example="October">%B</xliff:g>"</string> <!-- no translation found for month (3017405760734206414) --> <skip /> <!-- no translation found for month_day_year (2435948225709176752) --> - <string name="month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> <!-- no translation found for month_year (6228414124777343135) --> <skip /> <!-- no translation found for time_of_day (8375993139317154157) --> - <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string> <!-- no translation found for date_and_time (9197690194373107109) --> - <string name="date_and_time">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g> <xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> <!-- no translation found for same_year_md1_md2 (9199324363135981317) --> <string name="same_year_md1_md2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>"</string> <!-- no translation found for same_year_wday1_md1_wday2_md2 (6006392413355305178) --> @@ -963,11 +955,9 @@ <!-- no translation found for same_month_wday1_mdy1_time1_wday2_mdy2_time2 (1332950588774239228) --> <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string> <!-- no translation found for abbrev_month_day_year (5767271534015320250) --> - <string name="abbrev_month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> <!-- no translation found for abbrev_month_year (8058929633673942490) --> <skip /> <!-- no translation found for abbrev_month_day (458867920693482757) --> - <string name="abbrev_month_day">"<xliff:g id="day" example="31">%-d</xliff:g> <xliff:g id="month" example="Oct">%b</xliff:g>"</string> <!-- no translation found for abbrev_month (1674509986330181349) --> <skip /> <!-- no translation found for day_of_week_long_sunday (9057662850446501884) --> diff --git a/core/res/res/values-en-rUS/donottranslate-cldr.xml b/core/res/res/values-en-rUS/donottranslate-cldr.xml new file mode 100644 index 0000000..f305948 --- /dev/null +++ b/core/res/res/values-en-rUS/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">January</string> + <string name="month_long_standalone_february">February</string> + <string name="month_long_standalone_march">March</string> + <string name="month_long_standalone_april">April</string> + <string name="month_long_standalone_may">May</string> + <string name="month_long_standalone_june">June</string> + <string name="month_long_standalone_july">July</string> + <string name="month_long_standalone_august">August</string> + <string name="month_long_standalone_september">September</string> + <string name="month_long_standalone_october">October</string> + <string name="month_long_standalone_november">November</string> + <string name="month_long_standalone_december">December</string> + + <string name="month_long_january">January</string> + <string name="month_long_february">February</string> + <string name="month_long_march">March</string> + <string name="month_long_april">April</string> + <string name="month_long_may">May</string> + <string name="month_long_june">June</string> + <string name="month_long_july">July</string> + <string name="month_long_august">August</string> + <string name="month_long_september">September</string> + <string name="month_long_october">October</string> + <string name="month_long_november">November</string> + <string name="month_long_december">December</string> + + <string name="month_medium_january">Jan</string> + <string name="month_medium_february">Feb</string> + <string name="month_medium_march">Mar</string> + <string name="month_medium_april">Apr</string> + <string name="month_medium_may">May</string> + <string name="month_medium_june">Jun</string> + <string name="month_medium_july">Jul</string> + <string name="month_medium_august">Aug</string> + <string name="month_medium_september">Sep</string> + <string name="month_medium_october">Oct</string> + <string name="month_medium_november">Nov</string> + <string name="month_medium_december">Dec</string> + + <string name="month_shortest_january">J</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">Sunday</string> + <string name="day_of_week_long_monday">Monday</string> + <string name="day_of_week_long_tuesday">Tuesday</string> + <string name="day_of_week_long_wednesday">Wednesday</string> + <string name="day_of_week_long_thursday">Thursday</string> + <string name="day_of_week_long_friday">Friday</string> + <string name="day_of_week_long_saturday">Saturday</string> + + <string name="day_of_week_medium_sunday">Sun</string> + <string name="day_of_week_medium_monday">Mon</string> + <string name="day_of_week_medium_tuesday">Tue</string> + <string name="day_of_week_medium_wednesday">Wed</string> + <string name="day_of_week_medium_thursday">Thu</string> + <string name="day_of_week_medium_friday">Fri</string> + <string name="day_of_week_medium_saturday">Sat</string> + + <string name="day_of_week_short_sunday">Su</string> + <string name="day_of_week_short_monday">Mo</string> + <string name="day_of_week_short_tuesday">Tu</string> + <string name="day_of_week_short_wednesday">We</string> + <string name="day_of_week_short_thursday">Th</string> + <string name="day_of_week_short_friday">Fr</string> + <string name="day_of_week_short_saturday">Sa</string> + + <string name="day_of_week_shortest_sunday">S</string> + <string name="day_of_week_shortest_monday">M</string> + <string name="day_of_week_shortest_tuesday">T</string> + <string name="day_of_week_shortest_wednesday">W</string> + <string name="day_of_week_shortest_thursday">T</string> + <string name="day_of_week_shortest_friday">F</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">a.m.</string> + <string name="pm">p.m.</string> + <string name="yesterday">Yesterday</string> + <string name="today">Today</string> + <string name="tomorrow">Tomorrow</string> + + <string name="hour_minute_ampm">%-l:%M %p</string> + <string name="hour_minute_cap_ampm">%-l:%M %^p</string> + <string name="numeric_date">%-m/%-e/%Y</string> + <string name="numeric_date_format">M/d/yyyy</string> + <string name="month_day_year">%B %-e, %Y</string> + <string name="time_of_day">%-l:%M:%S %p</string> + <string name="date_and_time">%-l:%M:%S %p %b %-e, %Y</string> + <string name="abbrev_month_day_year">%b %-e, %Y</string> + <string name="month_day">%B %-e</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%b %-e</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-en-rZA/donottranslate-cldr.xml b/core/res/res/values-en-rZA/donottranslate-cldr.xml new file mode 100644 index 0000000..633c761 --- /dev/null +++ b/core/res/res/values-en-rZA/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">January</string> + <string name="month_long_standalone_february">February</string> + <string name="month_long_standalone_march">March</string> + <string name="month_long_standalone_april">April</string> + <string name="month_long_standalone_may">May</string> + <string name="month_long_standalone_june">June</string> + <string name="month_long_standalone_july">July</string> + <string name="month_long_standalone_august">August</string> + <string name="month_long_standalone_september">September</string> + <string name="month_long_standalone_october">October</string> + <string name="month_long_standalone_november">November</string> + <string name="month_long_standalone_december">December</string> + + <string name="month_long_january">January</string> + <string name="month_long_february">February</string> + <string name="month_long_march">March</string> + <string name="month_long_april">April</string> + <string name="month_long_may">May</string> + <string name="month_long_june">June</string> + <string name="month_long_july">July</string> + <string name="month_long_august">August</string> + <string name="month_long_september">September</string> + <string name="month_long_october">October</string> + <string name="month_long_november">November</string> + <string name="month_long_december">December</string> + + <string name="month_medium_january">Jan</string> + <string name="month_medium_february">Feb</string> + <string name="month_medium_march">Mar</string> + <string name="month_medium_april">Apr</string> + <string name="month_medium_may">May</string> + <string name="month_medium_june">Jun</string> + <string name="month_medium_july">Jul</string> + <string name="month_medium_august">Aug</string> + <string name="month_medium_september">Sep</string> + <string name="month_medium_october">Oct</string> + <string name="month_medium_november">Nov</string> + <string name="month_medium_december">Dec</string> + + <string name="month_shortest_january">J</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">Sunday</string> + <string name="day_of_week_long_monday">Monday</string> + <string name="day_of_week_long_tuesday">Tuesday</string> + <string name="day_of_week_long_wednesday">Wednesday</string> + <string name="day_of_week_long_thursday">Thursday</string> + <string name="day_of_week_long_friday">Friday</string> + <string name="day_of_week_long_saturday">Saturday</string> + + <string name="day_of_week_medium_sunday">Sun</string> + <string name="day_of_week_medium_monday">Mon</string> + <string name="day_of_week_medium_tuesday">Tue</string> + <string name="day_of_week_medium_wednesday">Wed</string> + <string name="day_of_week_medium_thursday">Thu</string> + <string name="day_of_week_medium_friday">Fri</string> + <string name="day_of_week_medium_saturday">Sat</string> + + <string name="day_of_week_short_sunday">Su</string> + <string name="day_of_week_short_monday">Mo</string> + <string name="day_of_week_short_tuesday">Tu</string> + <string name="day_of_week_short_wednesday">We</string> + <string name="day_of_week_short_thursday">Th</string> + <string name="day_of_week_short_friday">Fr</string> + <string name="day_of_week_short_saturday">Sa</string> + + <string name="day_of_week_shortest_sunday">S</string> + <string name="day_of_week_shortest_monday">M</string> + <string name="day_of_week_shortest_tuesday">T</string> + <string name="day_of_week_shortest_wednesday">W</string> + <string name="day_of_week_shortest_thursday">T</string> + <string name="day_of_week_shortest_friday">F</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">a.m.</string> + <string name="pm">p.m.</string> + <string name="yesterday">Yesterday</string> + <string name="today">Today</string> + <string name="tomorrow">Tomorrow</string> + + <string name="hour_minute_ampm">%-l:%M %p</string> + <string name="hour_minute_cap_ampm">%-l:%M %^p</string> + <string name="numeric_date">%Y/%m/%d</string> + <string name="numeric_date_format">yyyy/MM/dd</string> + <string name="month_day_year">%d %B %Y</string> + <string name="time_of_day">%-l:%M:%S %p</string> + <string name="date_and_time">%-l:%M:%S %p %d %b %Y</string> + <string name="abbrev_month_day_year">%d %b %Y</string> + <string name="month_day">%B %-e</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%b %-e</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-es-rES/donottranslate-cldr.xml b/core/res/res/values-es-rES/donottranslate-cldr.xml new file mode 100644 index 0000000..967a639 --- /dev/null +++ b/core/res/res/values-es-rES/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">enero</string> + <string name="month_long_standalone_february">febrero</string> + <string name="month_long_standalone_march">marzo</string> + <string name="month_long_standalone_april">abril</string> + <string name="month_long_standalone_may">mayo</string> + <string name="month_long_standalone_june">junio</string> + <string name="month_long_standalone_july">julio</string> + <string name="month_long_standalone_august">agosto</string> + <string name="month_long_standalone_september">septiembre</string> + <string name="month_long_standalone_october">octubre</string> + <string name="month_long_standalone_november">noviembre</string> + <string name="month_long_standalone_december">diciembre</string> + + <string name="month_long_january">enero</string> + <string name="month_long_february">febrero</string> + <string name="month_long_march">marzo</string> + <string name="month_long_april">abril</string> + <string name="month_long_may">mayo</string> + <string name="month_long_june">junio</string> + <string name="month_long_july">julio</string> + <string name="month_long_august">agosto</string> + <string name="month_long_september">septiembre</string> + <string name="month_long_october">octubre</string> + <string name="month_long_november">noviembre</string> + <string name="month_long_december">diciembre</string> + + <string name="month_medium_january">ene</string> + <string name="month_medium_february">feb</string> + <string name="month_medium_march">mar</string> + <string name="month_medium_april">abr</string> + <string name="month_medium_may">may</string> + <string name="month_medium_june">jun</string> + <string name="month_medium_july">jul</string> + <string name="month_medium_august">ago</string> + <string name="month_medium_september">sep</string> + <string name="month_medium_october">oct</string> + <string name="month_medium_november">nov</string> + <string name="month_medium_december">dic</string> + + <string name="month_shortest_january">E</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">domingo</string> + <string name="day_of_week_long_monday">lunes</string> + <string name="day_of_week_long_tuesday">martes</string> + <string name="day_of_week_long_wednesday">miércoles</string> + <string name="day_of_week_long_thursday">jueves</string> + <string name="day_of_week_long_friday">viernes</string> + <string name="day_of_week_long_saturday">sábado</string> + + <string name="day_of_week_medium_sunday">dom</string> + <string name="day_of_week_medium_monday">lun</string> + <string name="day_of_week_medium_tuesday">mar</string> + <string name="day_of_week_medium_wednesday">mié</string> + <string name="day_of_week_medium_thursday">jue</string> + <string name="day_of_week_medium_friday">vie</string> + <string name="day_of_week_medium_saturday">sáb</string> + + <string name="day_of_week_short_sunday">dom</string> + <string name="day_of_week_short_monday">lun</string> + <string name="day_of_week_short_tuesday">mar</string> + <string name="day_of_week_short_wednesday">mié</string> + <string name="day_of_week_short_thursday">jue</string> + <string name="day_of_week_short_friday">vie</string> + <string name="day_of_week_short_saturday">sáb</string> + + <string name="day_of_week_shortest_sunday">D</string> + <string name="day_of_week_shortest_monday">L</string> + <string name="day_of_week_shortest_tuesday">M</string> + <string name="day_of_week_shortest_wednesday">M</string> + <string name="day_of_week_shortest_thursday">J</string> + <string name="day_of_week_shortest_friday">V</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">a.m.</string> + <string name="pm">p.m.</string> + <string name="yesterday">ayer</string> + <string name="today">hoy</string> + <string name="tomorrow">mañana</string> + + <string name="hour_minute_ampm">%H:%M</string> + <string name="hour_minute_cap_ampm">%H:%M</string> + <string name="numeric_date">%d/%m/%Y</string> + <string name="numeric_date_format">dd/MM/yyyy</string> + <string name="month_day_year">%-e de %B de %Y</string> + <string name="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%H:%M:%S %d/%m/%Y</string> + <string name="abbrev_month_day_year">%d/%m/%Y</string> + <string name="month_day">%-e de %B</string> + <string name="month">%-B</string> + <string name="month_year">%B de %Y</string> + <string name="abbrev_month_day">%-e %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-es-rUS/donottranslate-cldr.xml b/core/res/res/values-es-rUS/donottranslate-cldr.xml new file mode 100644 index 0000000..8668fda --- /dev/null +++ b/core/res/res/values-es-rUS/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">enero</string> + <string name="month_long_standalone_february">febrero</string> + <string name="month_long_standalone_march">marzo</string> + <string name="month_long_standalone_april">abril</string> + <string name="month_long_standalone_may">mayo</string> + <string name="month_long_standalone_june">junio</string> + <string name="month_long_standalone_july">julio</string> + <string name="month_long_standalone_august">agosto</string> + <string name="month_long_standalone_september">septiembre</string> + <string name="month_long_standalone_october">octubre</string> + <string name="month_long_standalone_november">noviembre</string> + <string name="month_long_standalone_december">diciembre</string> + + <string name="month_long_january">enero</string> + <string name="month_long_february">febrero</string> + <string name="month_long_march">marzo</string> + <string name="month_long_april">abril</string> + <string name="month_long_may">mayo</string> + <string name="month_long_june">junio</string> + <string name="month_long_july">julio</string> + <string name="month_long_august">agosto</string> + <string name="month_long_september">septiembre</string> + <string name="month_long_october">octubre</string> + <string name="month_long_november">noviembre</string> + <string name="month_long_december">diciembre</string> + + <string name="month_medium_january">ene</string> + <string name="month_medium_february">feb</string> + <string name="month_medium_march">mar</string> + <string name="month_medium_april">abr</string> + <string name="month_medium_may">may</string> + <string name="month_medium_june">jun</string> + <string name="month_medium_july">jul</string> + <string name="month_medium_august">ago</string> + <string name="month_medium_september">sep</string> + <string name="month_medium_october">oct</string> + <string name="month_medium_november">nov</string> + <string name="month_medium_december">dic</string> + + <string name="month_shortest_january">E</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">domingo</string> + <string name="day_of_week_long_monday">lunes</string> + <string name="day_of_week_long_tuesday">martes</string> + <string name="day_of_week_long_wednesday">miércoles</string> + <string name="day_of_week_long_thursday">jueves</string> + <string name="day_of_week_long_friday">viernes</string> + <string name="day_of_week_long_saturday">sábado</string> + + <string name="day_of_week_medium_sunday">dom</string> + <string name="day_of_week_medium_monday">lun</string> + <string name="day_of_week_medium_tuesday">mar</string> + <string name="day_of_week_medium_wednesday">mié</string> + <string name="day_of_week_medium_thursday">jue</string> + <string name="day_of_week_medium_friday">vie</string> + <string name="day_of_week_medium_saturday">sáb</string> + + <string name="day_of_week_short_sunday">dom</string> + <string name="day_of_week_short_monday">lun</string> + <string name="day_of_week_short_tuesday">mar</string> + <string name="day_of_week_short_wednesday">mié</string> + <string name="day_of_week_short_thursday">jue</string> + <string name="day_of_week_short_friday">vie</string> + <string name="day_of_week_short_saturday">sáb</string> + + <string name="day_of_week_shortest_sunday">D</string> + <string name="day_of_week_shortest_monday">L</string> + <string name="day_of_week_shortest_tuesday">M</string> + <string name="day_of_week_shortest_wednesday">M</string> + <string name="day_of_week_shortest_thursday">J</string> + <string name="day_of_week_shortest_friday">V</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">a.m.</string> + <string name="pm">p.m.</string> + <string name="yesterday">ayer</string> + <string name="today">hoy</string> + <string name="tomorrow">mañana</string> + + <string name="hour_minute_ampm">%-l:%M %p</string> + <string name="hour_minute_cap_ampm">%-l:%M %^p</string> + <string name="numeric_date">%-m/%-e/%Y</string> + <string name="numeric_date_format">M/d/yyyy</string> + <string name="month_day_year">%-e de %B de %Y</string> + <string name="time_of_day">%-l:%M:%S %p</string> + <string name="date_and_time">%-l:%M:%S %p %b %-e, %Y</string> + <string name="abbrev_month_day_year">%b %-e, %Y</string> + <string name="month_day">%-e de %B</string> + <string name="month">%-B</string> + <string name="month_year">%B de %Y</string> + <string name="abbrev_month_day">%-e %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 7b60a39..6032321 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -436,9 +436,6 @@ <string name="lockscreen_glogin_password_hint">"Contraseña"</string> <string name="lockscreen_glogin_submit_button">"Inicia sesión"</string> <string name="lockscreen_glogin_invalid_input">"Nombre de usuario o contraseña incorrecta."</string> - <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string> - <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string> - <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string> <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string> <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string> <string name="status_bar_clear_all_button">"Borrar notificaciones"</string> @@ -470,9 +467,6 @@ <string name="menu_enter_shortcut_label">"ingresar"</string> <string name="menu_delete_shortcut_label">"borrar"</string> <string name="search_go">"Buscar"</string> - <string name="today">"Hoy"</string> - <string name="yesterday">"Ayer"</string> - <string name="tomorrow">"Mañana"</string> <string name="oneMonthDurationPast">"hace 1 mes"</string> <string name="beforeOneMonthDurationPast">"Anterior a 1 mes atrás"</string> <plurals name="num_seconds_ago"> @@ -554,13 +548,6 @@ <string name="weeks">"semanas"</string> <string name="year">"año"</string> <string name="years">"años"</string> - <string name="sunday">"Domingo"</string> - <string name="monday">"Lunes"</string> - <string name="tuesday">"Martes"</string> - <string name="wednesday">"Miércoles"</string> - <string name="thursday">"Jueves"</string> - <string name="friday">"Viernes"</string> - <string name="saturday">"Sábado"</string> <string name="every_weekday">"Los días de semana (lunes a viernes)"</string> <string name="daily">"Diariamente"</string> <string name="weekly">"Semanalmente el día <xliff:g id="DAY">%s</xliff:g>"</string> @@ -570,9 +557,6 @@ <string name="VideoView_error_text_invalid_progressive_playback">"Lo sentimos, este video no es válido para las transmisiones a este dispositivo."</string> <string name="VideoView_error_text_unknown">"Lo sentimos, no se puede reproducir este video."</string> <string name="VideoView_error_button">"Aceptar"</string> - <string name="am">"AM"</string> - <string name="pm">"PM"</string> - <string name="numeric_date">"<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="DAY">%d</xliff:g>/<xliff:g id="YEAR">%Y</xliff:g>"</string> <string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string> <string name="wday1_date1_wday2_date2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>"</string> <string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string> @@ -584,23 +568,12 @@ <string name="date_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="time_wday">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>"</string> - <string name="full_date_month_first" format="date">"<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="DAY">d</xliff:g>', '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="full_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMMM</xliff:g>', '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="medium_date_month_first" format="date">"<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="DAY">d</xliff:g>', '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="medium_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMM</xliff:g>', '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="twelve_hour_time_format" format="date">"<xliff:g id="HOUR">h</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>' '<xliff:g id="AMPM">a</xliff:g>"</string> - <string name="twenty_four_hour_time_format" format="date">"<xliff:g id="HOUR">HH</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>"</string> <string name="noon">"mediodía"</string> <string name="Noon">"Mediodía"</string> <string name="midnight">"medianoche"</string> <string name="Midnight">"Medianoche"</string> - <string name="month_day">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>"</string> <!-- no translation found for month (7026169712234774086) --> <skip /> - <string name="month_day_year">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>, <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="month_year">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string> - <string name="date_and_time">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>, <xliff:g id="YEAR">%Y</xliff:g>"</string> <string name="same_year_md1_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>"</string> <string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>"</string> <string name="same_year_mdy1_mdy2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="YEAR">%9$s</xliff:g>"</string> @@ -625,82 +598,8 @@ <string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string> <string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string> <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string> - <string name="abbrev_month_day_year">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="DAY">%-d</xliff:g>, <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="abbrev_month_year">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="abbrev_month_day">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="DAY">%-d</xliff:g>"</string> <!-- no translation found for abbrev_month (3131032032850777433) --> <skip /> - <string name="day_of_week_long_sunday">"Domingo"</string> - <string name="day_of_week_long_monday">"Lunes"</string> - <string name="day_of_week_long_tuesday">"Martes"</string> - <string name="day_of_week_long_wednesday">"Miércoles"</string> - <string name="day_of_week_long_thursday">"Jueves"</string> - <string name="day_of_week_long_friday">"Viernes"</string> - <string name="day_of_week_long_saturday">"Sábado"</string> - <string name="day_of_week_medium_sunday">"Dom."</string> - <string name="day_of_week_medium_monday">"Lun."</string> - <string name="day_of_week_medium_tuesday">"Mar."</string> - <string name="day_of_week_medium_wednesday">"Mié."</string> - <string name="day_of_week_medium_thursday">"Jue."</string> - <string name="day_of_week_medium_friday">"Vie."</string> - <string name="day_of_week_medium_saturday">"Sáb."</string> - <string name="day_of_week_short_sunday">"Dom."</string> - <string name="day_of_week_short_monday">"Lun."</string> - <string name="day_of_week_short_tuesday">"Mar."</string> - <string name="day_of_week_short_wednesday">"Nosotros"</string> - <string name="day_of_week_short_thursday">"Jue."</string> - <string name="day_of_week_short_friday">"V"</string> - <string name="day_of_week_short_saturday">"Sáb."</string> - <string name="day_of_week_shorter_sunday">"Dom."</string> - <string name="day_of_week_shorter_monday">"L"</string> - <string name="day_of_week_shorter_tuesday">"Mar."</string> - <string name="day_of_week_shorter_wednesday">"M"</string> - <string name="day_of_week_shorter_thursday">"Jue."</string> - <string name="day_of_week_shorter_friday">"V"</string> - <string name="day_of_week_shorter_saturday">"Sáb."</string> - <string name="day_of_week_shortest_sunday">"D"</string> - <string name="day_of_week_shortest_monday">"L"</string> - <string name="day_of_week_shortest_tuesday">"Mar."</string> - <string name="day_of_week_shortest_wednesday">"M"</string> - <string name="day_of_week_shortest_thursday">"Jue."</string> - <string name="day_of_week_shortest_friday">"V"</string> - <string name="day_of_week_shortest_saturday">"D"</string> - <string name="month_long_january">"Enero"</string> - <string name="month_long_february">"Febrero"</string> - <string name="month_long_march">"Marzo"</string> - <string name="month_long_april">"Abril"</string> - <string name="month_long_may">"Mayo"</string> - <string name="month_long_june">"Junio"</string> - <string name="month_long_july">"Julio"</string> - <string name="month_long_august">"Agosto"</string> - <string name="month_long_september">"Septiembre"</string> - <string name="month_long_october">"Octubre"</string> - <string name="month_long_november">"Noviembre"</string> - <string name="month_long_december">"Diciembre"</string> - <string name="month_medium_january">"Ene."</string> - <string name="month_medium_february">"Feb."</string> - <string name="month_medium_march">"Mar."</string> - <string name="month_medium_april">"Abr."</string> - <string name="month_medium_may">"Mayo"</string> - <string name="month_medium_june">"Jun."</string> - <string name="month_medium_july">"Jul."</string> - <string name="month_medium_august">"Ago."</string> - <string name="month_medium_september">"Sep."</string> - <string name="month_medium_october">"Oct."</string> - <string name="month_medium_november">"Nov."</string> - <string name="month_medium_december">"Dic."</string> - <string name="month_shortest_january">"E"</string> - <string name="month_shortest_february">"V"</string> - <string name="month_shortest_march">"M"</string> - <string name="month_shortest_april">"A"</string> - <string name="month_shortest_may">"M"</string> - <string name="month_shortest_june">"E"</string> - <string name="month_shortest_july">"J"</string> - <string name="month_shortest_august">"Ago."</string> - <string name="month_shortest_september">"D"</string> - <string name="month_shortest_october">"O"</string> - <string name="month_shortest_november">"N"</string> - <string name="month_shortest_december">"Dic."</string> <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string> <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string> <string name="selectAll">"Seleccionar todos"</string> diff --git a/core/res/res/values-es/donottranslate-cldr.xml b/core/res/res/values-es/donottranslate-cldr.xml new file mode 100644 index 0000000..967a639 --- /dev/null +++ b/core/res/res/values-es/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">enero</string> + <string name="month_long_standalone_february">febrero</string> + <string name="month_long_standalone_march">marzo</string> + <string name="month_long_standalone_april">abril</string> + <string name="month_long_standalone_may">mayo</string> + <string name="month_long_standalone_june">junio</string> + <string name="month_long_standalone_july">julio</string> + <string name="month_long_standalone_august">agosto</string> + <string name="month_long_standalone_september">septiembre</string> + <string name="month_long_standalone_october">octubre</string> + <string name="month_long_standalone_november">noviembre</string> + <string name="month_long_standalone_december">diciembre</string> + + <string name="month_long_january">enero</string> + <string name="month_long_february">febrero</string> + <string name="month_long_march">marzo</string> + <string name="month_long_april">abril</string> + <string name="month_long_may">mayo</string> + <string name="month_long_june">junio</string> + <string name="month_long_july">julio</string> + <string name="month_long_august">agosto</string> + <string name="month_long_september">septiembre</string> + <string name="month_long_october">octubre</string> + <string name="month_long_november">noviembre</string> + <string name="month_long_december">diciembre</string> + + <string name="month_medium_january">ene</string> + <string name="month_medium_february">feb</string> + <string name="month_medium_march">mar</string> + <string name="month_medium_april">abr</string> + <string name="month_medium_may">may</string> + <string name="month_medium_june">jun</string> + <string name="month_medium_july">jul</string> + <string name="month_medium_august">ago</string> + <string name="month_medium_september">sep</string> + <string name="month_medium_october">oct</string> + <string name="month_medium_november">nov</string> + <string name="month_medium_december">dic</string> + + <string name="month_shortest_january">E</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">domingo</string> + <string name="day_of_week_long_monday">lunes</string> + <string name="day_of_week_long_tuesday">martes</string> + <string name="day_of_week_long_wednesday">miércoles</string> + <string name="day_of_week_long_thursday">jueves</string> + <string name="day_of_week_long_friday">viernes</string> + <string name="day_of_week_long_saturday">sábado</string> + + <string name="day_of_week_medium_sunday">dom</string> + <string name="day_of_week_medium_monday">lun</string> + <string name="day_of_week_medium_tuesday">mar</string> + <string name="day_of_week_medium_wednesday">mié</string> + <string name="day_of_week_medium_thursday">jue</string> + <string name="day_of_week_medium_friday">vie</string> + <string name="day_of_week_medium_saturday">sáb</string> + + <string name="day_of_week_short_sunday">dom</string> + <string name="day_of_week_short_monday">lun</string> + <string name="day_of_week_short_tuesday">mar</string> + <string name="day_of_week_short_wednesday">mié</string> + <string name="day_of_week_short_thursday">jue</string> + <string name="day_of_week_short_friday">vie</string> + <string name="day_of_week_short_saturday">sáb</string> + + <string name="day_of_week_shortest_sunday">D</string> + <string name="day_of_week_shortest_monday">L</string> + <string name="day_of_week_shortest_tuesday">M</string> + <string name="day_of_week_shortest_wednesday">M</string> + <string name="day_of_week_shortest_thursday">J</string> + <string name="day_of_week_shortest_friday">V</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">a.m.</string> + <string name="pm">p.m.</string> + <string name="yesterday">ayer</string> + <string name="today">hoy</string> + <string name="tomorrow">mañana</string> + + <string name="hour_minute_ampm">%H:%M</string> + <string name="hour_minute_cap_ampm">%H:%M</string> + <string name="numeric_date">%d/%m/%Y</string> + <string name="numeric_date_format">dd/MM/yyyy</string> + <string name="month_day_year">%-e de %B de %Y</string> + <string name="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%H:%M:%S %d/%m/%Y</string> + <string name="abbrev_month_day_year">%d/%m/%Y</string> + <string name="month_day">%-e de %B</string> + <string name="month">%-B</string> + <string name="month_year">%B de %Y</string> + <string name="abbrev_month_day">%-e %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index a9f267a..c55e0ed 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -418,9 +418,6 @@ <string name="lockscreen_glogin_password_hint">"Contraseña"</string> <string name="lockscreen_glogin_submit_button">"Acceder"</string> <string name="lockscreen_glogin_invalid_input">"Nombre de usuario o contraseña no válido"</string> - <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string> - <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string> - <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string> <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string> <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string> <string name="status_bar_clear_all_button">"Cerrar notificaciones"</string> @@ -452,9 +449,6 @@ <string name="menu_enter_shortcut_label">"intro"</string> <string name="menu_delete_shortcut_label">"suprimir"</string> <string name="search_go">"Buscar"</string> - <string name="today">"Hoy"</string> - <string name="yesterday">"Ayer"</string> - <string name="tomorrow">"Mañana"</string> <string name="oneMonthDurationPast">"Hace un mes"</string> <string name="beforeOneMonthDurationPast">"Hace más de un mes"</string> <plurals name="num_seconds_ago"> @@ -536,13 +530,6 @@ <string name="weeks">"semanas"</string> <string name="year">"año"</string> <string name="years">"años"</string> - <string name="sunday">"Domingo"</string> - <string name="monday">"Lunes"</string> - <string name="tuesday">"Martes"</string> - <string name="wednesday">"Miércoles"</string> - <string name="thursday">"Jueves"</string> - <string name="friday">"Viernes"</string> - <string name="saturday">"Sábado"</string> <string name="every_weekday">"Todos los días laborables (Lun-Vie)"</string> <string name="daily">"Diariamente"</string> <string name="weekly">"Semanalmente, el <xliff:g id="DAY">%s</xliff:g>"</string> @@ -552,9 +539,6 @@ <string name="VideoView_error_text_invalid_progressive_playback">"Este vídeo no se puede transmitir al dispositivo."</string> <string name="VideoView_error_text_unknown">"Este vídeo no se puede reproducir."</string> <string name="VideoView_error_button">"Aceptar"</string> - <string name="am">"a.m."</string> - <string name="pm">"p.m."</string> - <string name="numeric_date">"<xliff:g id="DAY">%d</xliff:g>/<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="YEAR">%Y</xliff:g>"</string> <string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string> <string name="wday1_date1_wday2_date2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>"</string> <string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string> @@ -566,23 +550,12 @@ <string name="date_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="time_wday">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>"</string> - <string name="full_date_month_first" format="date">"<xliff:g id="DAY">d</xliff:g>' de '<xliff:g id="MONTH">MMMM</xliff:g>' de '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="full_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>' de '<xliff:g id="MONTH">MMMM</xliff:g>' de '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="medium_date_month_first" format="date">"<xliff:g id="DAY">d</xliff:g>' de '<xliff:g id="MONTH">MMM</xliff:g>' de '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="medium_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMM</xliff:g>', '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="twelve_hour_time_format" format="date">"<xliff:g id="HOUR">h</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>' '<xliff:g id="AMPM">a</xliff:g>"</string> - <string name="twenty_four_hour_time_format" format="date">"<xliff:g id="HOUR">HH</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>"</string> <string name="noon">"mediodía"</string> <string name="Noon">"Mediodía"</string> <string name="midnight">"medianoche"</string> <string name="Midnight">"Medianoche"</string> - <string name="month_day">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g>"</string> <!-- no translation found for month (7026169712234774086) --> <skip /> - <string name="month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g>, <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="month_year">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string> - <string name="date_and_time">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>, <xliff:g id="YEAR">%Y</xliff:g>"</string> <string name="same_year_md1_md2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>"</string> <string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>"</string> <string name="same_year_mdy1_mdy2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="YEAR">%9$s</xliff:g>"</string> @@ -607,82 +580,8 @@ <string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string> <string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string> <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string> - <string name="abbrev_month_day_year">"<xliff:g id="DAY">%-d</xliff:g> de <xliff:g id="MONTH">%b</xliff:g> de <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="abbrev_month_year">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="abbrev_month_day">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="DAY">%-d</xliff:g>"</string> <!-- no translation found for abbrev_month (3131032032850777433) --> <skip /> - <string name="day_of_week_long_sunday">"Domingo"</string> - <string name="day_of_week_long_monday">"Lunes"</string> - <string name="day_of_week_long_tuesday">"Martes"</string> - <string name="day_of_week_long_wednesday">"Miércoles"</string> - <string name="day_of_week_long_thursday">"Jueves"</string> - <string name="day_of_week_long_friday">"Viernes"</string> - <string name="day_of_week_long_saturday">"Sábado"</string> - <string name="day_of_week_medium_sunday">"Dom"</string> - <string name="day_of_week_medium_monday">"Lun"</string> - <string name="day_of_week_medium_tuesday">"Mar"</string> - <string name="day_of_week_medium_wednesday">"Mié"</string> - <string name="day_of_week_medium_thursday">"Jue"</string> - <string name="day_of_week_medium_friday">"Vie"</string> - <string name="day_of_week_medium_saturday">"Sáb"</string> - <string name="day_of_week_short_sunday">"Do"</string> - <string name="day_of_week_short_monday">"Lu"</string> - <string name="day_of_week_short_tuesday">"Ma"</string> - <string name="day_of_week_short_wednesday">"Mi"</string> - <string name="day_of_week_short_thursday">"Ju"</string> - <string name="day_of_week_short_friday">"Vi"</string> - <string name="day_of_week_short_saturday">"Sá"</string> - <string name="day_of_week_shorter_sunday">"Do"</string> - <string name="day_of_week_shorter_monday">"L"</string> - <string name="day_of_week_shorter_tuesday">"Ma"</string> - <string name="day_of_week_shorter_wednesday">"Mi"</string> - <string name="day_of_week_shorter_thursday">"Ju"</string> - <string name="day_of_week_shorter_friday">"V"</string> - <string name="day_of_week_shorter_saturday">"S"</string> - <string name="day_of_week_shortest_sunday">"D"</string> - <string name="day_of_week_shortest_monday">"Mz"</string> - <string name="day_of_week_shortest_tuesday">"M"</string> - <string name="day_of_week_shortest_wednesday">"Mi"</string> - <string name="day_of_week_shortest_thursday">"M"</string> - <string name="day_of_week_shortest_friday">"V"</string> - <string name="day_of_week_shortest_saturday">"D"</string> - <string name="month_long_january">"Enero"</string> - <string name="month_long_february">"Febrero"</string> - <string name="month_long_march">"Marzo"</string> - <string name="month_long_april">"Abril"</string> - <string name="month_long_may">"Mayo"</string> - <string name="month_long_june">"Junio"</string> - <string name="month_long_july">"Julio"</string> - <string name="month_long_august">"Agosto"</string> - <string name="month_long_september">"Septiembre"</string> - <string name="month_long_october">"Octubre"</string> - <string name="month_long_november">"Noviembre"</string> - <string name="month_long_december">"Diciembre"</string> - <string name="month_medium_january">"Ene"</string> - <string name="month_medium_february">"Feb"</string> - <string name="month_medium_march">"Mar"</string> - <string name="month_medium_april">"Abr"</string> - <string name="month_medium_may">"May"</string> - <string name="month_medium_june">"Jun"</string> - <string name="month_medium_july">"Jul"</string> - <string name="month_medium_august">"Ago"</string> - <string name="month_medium_september">"Sep"</string> - <string name="month_medium_october">"Oct"</string> - <string name="month_medium_november">"Nov"</string> - <string name="month_medium_december">"Dic"</string> - <string name="month_shortest_january">"E"</string> - <string name="month_shortest_february">"V"</string> - <string name="month_shortest_march">"Mz"</string> - <string name="month_shortest_april">"A"</string> - <string name="month_shortest_may">"My"</string> - <string name="month_shortest_june">"J"</string> - <string name="month_shortest_july">"E"</string> - <string name="month_shortest_august">"Ag"</string> - <string name="month_shortest_september">"S"</string> - <string name="month_shortest_october">"O"</string> - <string name="month_shortest_november">"N"</string> - <string name="month_shortest_december">"D"</string> <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string> <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string> <string name="selectAll">"Seleccionar todo"</string> diff --git a/core/res/res/values-fi-rFI/donottranslate-cldr.xml b/core/res/res/values-fi-rFI/donottranslate-cldr.xml new file mode 100644 index 0000000..ae28635 --- /dev/null +++ b/core/res/res/values-fi-rFI/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">tammikuu</string> + <string name="month_long_standalone_february">helmikuu</string> + <string name="month_long_standalone_march">maaliskuu</string> + <string name="month_long_standalone_april">huhtikuu</string> + <string name="month_long_standalone_may">toukokuu</string> + <string name="month_long_standalone_june">kesäkuu</string> + <string name="month_long_standalone_july">heinäkuu</string> + <string name="month_long_standalone_august">elokuu</string> + <string name="month_long_standalone_september">syyskuu</string> + <string name="month_long_standalone_october">lokakuu</string> + <string name="month_long_standalone_november">marraskuu</string> + <string name="month_long_standalone_december">joulukuu</string> + + <string name="month_long_january">tammikuuta</string> + <string name="month_long_february">helmikuuta</string> + <string name="month_long_march">maaliskuuta</string> + <string name="month_long_april">huhtikuuta</string> + <string name="month_long_may">toukokuuta</string> + <string name="month_long_june">kesäkuuta</string> + <string name="month_long_july">heinäkuuta</string> + <string name="month_long_august">elokuuta</string> + <string name="month_long_september">syyskuuta</string> + <string name="month_long_october">lokakuuta</string> + <string name="month_long_november">marraskuuta</string> + <string name="month_long_december">joulukuuta</string> + + <string name="month_medium_january">tammikuuta</string> + <string name="month_medium_february">helmikuuta</string> + <string name="month_medium_march">maaliskuuta</string> + <string name="month_medium_april">huhtikuuta</string> + <string name="month_medium_may">toukokuuta</string> + <string name="month_medium_june">kesäkuuta</string> + <string name="month_medium_july">heinäkuuta</string> + <string name="month_medium_august">elokuuta</string> + <string name="month_medium_september">syyskuuta</string> + <string name="month_medium_october">lokakuuta</string> + <string name="month_medium_november">marraskuuta</string> + <string name="month_medium_december">joulukuuta</string> + + <string name="month_shortest_january">T</string> + <string name="month_shortest_february">H</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">H</string> + <string name="month_shortest_may">T</string> + <string name="month_shortest_june">K</string> + <string name="month_shortest_july">H</string> + <string name="month_shortest_august">E</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">L</string> + <string name="month_shortest_november">M</string> + <string name="month_shortest_december">J</string> + + <string name="day_of_week_long_sunday">sunnuntaina</string> + <string name="day_of_week_long_monday">maanantaina</string> + <string name="day_of_week_long_tuesday">tiistaina</string> + <string name="day_of_week_long_wednesday">keskiviikkona</string> + <string name="day_of_week_long_thursday">torstaina</string> + <string name="day_of_week_long_friday">perjantaina</string> + <string name="day_of_week_long_saturday">lauantaina</string> + + <string name="day_of_week_medium_sunday">su</string> + <string name="day_of_week_medium_monday">ma</string> + <string name="day_of_week_medium_tuesday">ti</string> + <string name="day_of_week_medium_wednesday">ke</string> + <string name="day_of_week_medium_thursday">to</string> + <string name="day_of_week_medium_friday">pe</string> + <string name="day_of_week_medium_saturday">la</string> + + <string name="day_of_week_short_sunday">su</string> + <string name="day_of_week_short_monday">ma</string> + <string name="day_of_week_short_tuesday">ti</string> + <string name="day_of_week_short_wednesday">ke</string> + <string name="day_of_week_short_thursday">to</string> + <string name="day_of_week_short_friday">pe</string> + <string name="day_of_week_short_saturday">la</string> + + <string name="day_of_week_shortest_sunday">S</string> + <string name="day_of_week_shortest_monday">M</string> + <string name="day_of_week_shortest_tuesday">T</string> + <string name="day_of_week_shortest_wednesday">K</string> + <string name="day_of_week_shortest_thursday">T</string> + <string name="day_of_week_shortest_friday">P</string> + <string name="day_of_week_shortest_saturday">L</string> + + <string name="am">ap.</string> + <string name="pm">ip.</string> + <string name="yesterday">eilen</string> + <string name="today">tänään</string> + <string name="tomorrow">huomenna</string> + + <string name="hour_minute_ampm">%-k.%M</string> + <string name="hour_minute_cap_ampm">%-k.%M</string> + <string name="numeric_date">%-e.%-m.%Y</string> + <string name="numeric_date_format">d.M.yyyy</string> + <string name="month_day_year">%-e. %B %Y</string> + <string name="time_of_day">%-k.%M.%S</string> + <string name="date_and_time">%-k.%M.%S %-e.%-m.%Y</string> + <string name="abbrev_month_day_year">%-e.%-m.%Y</string> + <string name="month_day">%-e. %B</string> + <string name="month">%-B</string> + <string name="month_year">%-B %Y</string> + <string name="abbrev_month_day">%-e. %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%-b %Y</string> +</resources> diff --git a/core/res/res/values-fr-rBE/donottranslate-cldr.xml b/core/res/res/values-fr-rBE/donottranslate-cldr.xml new file mode 100644 index 0000000..b540336 --- /dev/null +++ b/core/res/res/values-fr-rBE/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">janvier</string> + <string name="month_long_standalone_february">février</string> + <string name="month_long_standalone_march">mars</string> + <string name="month_long_standalone_april">avril</string> + <string name="month_long_standalone_may">mai</string> + <string name="month_long_standalone_june">juin</string> + <string name="month_long_standalone_july">juillet</string> + <string name="month_long_standalone_august">août</string> + <string name="month_long_standalone_september">septembre</string> + <string name="month_long_standalone_october">octobre</string> + <string name="month_long_standalone_november">novembre</string> + <string name="month_long_standalone_december">décembre</string> + + <string name="month_long_january">janvier</string> + <string name="month_long_february">février</string> + <string name="month_long_march">mars</string> + <string name="month_long_april">avril</string> + <string name="month_long_may">mai</string> + <string name="month_long_june">juin</string> + <string name="month_long_july">juillet</string> + <string name="month_long_august">août</string> + <string name="month_long_september">septembre</string> + <string name="month_long_october">octobre</string> + <string name="month_long_november">novembre</string> + <string name="month_long_december">décembre</string> + + <string name="month_medium_january">janv.</string> + <string name="month_medium_february">févr.</string> + <string name="month_medium_march">mars</string> + <string name="month_medium_april">avr.</string> + <string name="month_medium_may">mai</string> + <string name="month_medium_june">juin</string> + <string name="month_medium_july">juil.</string> + <string name="month_medium_august">août</string> + <string name="month_medium_september">sept.</string> + <string name="month_medium_october">oct.</string> + <string name="month_medium_november">nov.</string> + <string name="month_medium_december">déc.</string> + + <string name="month_shortest_january">J</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">dimanche</string> + <string name="day_of_week_long_monday">lundi</string> + <string name="day_of_week_long_tuesday">mardi</string> + <string name="day_of_week_long_wednesday">mercredi</string> + <string name="day_of_week_long_thursday">jeudi</string> + <string name="day_of_week_long_friday">vendredi</string> + <string name="day_of_week_long_saturday">samedi</string> + + <string name="day_of_week_medium_sunday">dim.</string> + <string name="day_of_week_medium_monday">lun.</string> + <string name="day_of_week_medium_tuesday">mar.</string> + <string name="day_of_week_medium_wednesday">mer.</string> + <string name="day_of_week_medium_thursday">jeu.</string> + <string name="day_of_week_medium_friday">ven.</string> + <string name="day_of_week_medium_saturday">sam.</string> + + <string name="day_of_week_short_sunday">dim.</string> + <string name="day_of_week_short_monday">lun.</string> + <string name="day_of_week_short_tuesday">mar.</string> + <string name="day_of_week_short_wednesday">mer.</string> + <string name="day_of_week_short_thursday">jeu.</string> + <string name="day_of_week_short_friday">ven.</string> + <string name="day_of_week_short_saturday">sam.</string> + + <string name="day_of_week_shortest_sunday">D</string> + <string name="day_of_week_shortest_monday">L</string> + <string name="day_of_week_shortest_tuesday">M</string> + <string name="day_of_week_shortest_wednesday">M</string> + <string name="day_of_week_shortest_thursday">J</string> + <string name="day_of_week_shortest_friday">V</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">matin</string> + <string name="pm">soir</string> + <string name="yesterday">hier</string> + <string name="today">aujourd’hui</string> + <string name="tomorrow">demain</string> + + <string name="hour_minute_ampm">%H:%M</string> + <string name="hour_minute_cap_ampm">%H:%M</string> + <string name="numeric_date">%-e/%m/%Y</string> + <string name="numeric_date_format">d/MM/yyyy</string> + <string name="month_day_year">%-e %B %Y</string> + <string name="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%H:%M:%S %-e %b %Y</string> + <string name="abbrev_month_day_year">%-e %b %Y</string> + <string name="month_day">%-e %B</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%-e %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-fr-rCA/donottranslate-cldr.xml b/core/res/res/values-fr-rCA/donottranslate-cldr.xml new file mode 100644 index 0000000..5fa5d54 --- /dev/null +++ b/core/res/res/values-fr-rCA/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">janvier</string> + <string name="month_long_standalone_february">février</string> + <string name="month_long_standalone_march">mars</string> + <string name="month_long_standalone_april">avril</string> + <string name="month_long_standalone_may">mai</string> + <string name="month_long_standalone_june">juin</string> + <string name="month_long_standalone_july">juillet</string> + <string name="month_long_standalone_august">août</string> + <string name="month_long_standalone_september">septembre</string> + <string name="month_long_standalone_october">octobre</string> + <string name="month_long_standalone_november">novembre</string> + <string name="month_long_standalone_december">décembre</string> + + <string name="month_long_january">janvier</string> + <string name="month_long_february">février</string> + <string name="month_long_march">mars</string> + <string name="month_long_april">avril</string> + <string name="month_long_may">mai</string> + <string name="month_long_june">juin</string> + <string name="month_long_july">juillet</string> + <string name="month_long_august">août</string> + <string name="month_long_september">septembre</string> + <string name="month_long_october">octobre</string> + <string name="month_long_november">novembre</string> + <string name="month_long_december">décembre</string> + + <string name="month_medium_january">janv.</string> + <string name="month_medium_february">févr.</string> + <string name="month_medium_march">mars</string> + <string name="month_medium_april">avr.</string> + <string name="month_medium_may">mai</string> + <string name="month_medium_june">juin</string> + <string name="month_medium_july">juil.</string> + <string name="month_medium_august">août</string> + <string name="month_medium_september">sept.</string> + <string name="month_medium_october">oct.</string> + <string name="month_medium_november">nov.</string> + <string name="month_medium_december">déc.</string> + + <string name="month_shortest_january">J</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">dimanche</string> + <string name="day_of_week_long_monday">lundi</string> + <string name="day_of_week_long_tuesday">mardi</string> + <string name="day_of_week_long_wednesday">mercredi</string> + <string name="day_of_week_long_thursday">jeudi</string> + <string name="day_of_week_long_friday">vendredi</string> + <string name="day_of_week_long_saturday">samedi</string> + + <string name="day_of_week_medium_sunday">dim.</string> + <string name="day_of_week_medium_monday">lun.</string> + <string name="day_of_week_medium_tuesday">mar.</string> + <string name="day_of_week_medium_wednesday">mer.</string> + <string name="day_of_week_medium_thursday">jeu.</string> + <string name="day_of_week_medium_friday">ven.</string> + <string name="day_of_week_medium_saturday">sam.</string> + + <string name="day_of_week_short_sunday">dim.</string> + <string name="day_of_week_short_monday">lun.</string> + <string name="day_of_week_short_tuesday">mar.</string> + <string name="day_of_week_short_wednesday">mer.</string> + <string name="day_of_week_short_thursday">jeu.</string> + <string name="day_of_week_short_friday">ven.</string> + <string name="day_of_week_short_saturday">sam.</string> + + <string name="day_of_week_shortest_sunday">D</string> + <string name="day_of_week_shortest_monday">L</string> + <string name="day_of_week_shortest_tuesday">M</string> + <string name="day_of_week_shortest_wednesday">M</string> + <string name="day_of_week_shortest_thursday">J</string> + <string name="day_of_week_shortest_friday">V</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">matin</string> + <string name="pm">soir</string> + <string name="yesterday">hier</string> + <string name="today">aujourd’hui</string> + <string name="tomorrow">demain</string> + + <string name="hour_minute_ampm">%H:%M</string> + <string name="hour_minute_cap_ampm">%H:%M</string> + <string name="numeric_date">%Y-%m-%d</string> + <string name="numeric_date_format">yyyy-MM-dd</string> + <string name="month_day_year">%-e %B %Y</string> + <string name="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%H:%M:%S %Y-%m-%d</string> + <string name="abbrev_month_day_year">%Y-%m-%d</string> + <string name="month_day">%-e %B</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%-e %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-fr-rCH/donottranslate-cldr.xml b/core/res/res/values-fr-rCH/donottranslate-cldr.xml new file mode 100644 index 0000000..589c801 --- /dev/null +++ b/core/res/res/values-fr-rCH/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">janvier</string> + <string name="month_long_standalone_february">février</string> + <string name="month_long_standalone_march">mars</string> + <string name="month_long_standalone_april">avril</string> + <string name="month_long_standalone_may">mai</string> + <string name="month_long_standalone_june">juin</string> + <string name="month_long_standalone_july">juillet</string> + <string name="month_long_standalone_august">août</string> + <string name="month_long_standalone_september">septembre</string> + <string name="month_long_standalone_october">octobre</string> + <string name="month_long_standalone_november">novembre</string> + <string name="month_long_standalone_december">décembre</string> + + <string name="month_long_january">janvier</string> + <string name="month_long_february">février</string> + <string name="month_long_march">mars</string> + <string name="month_long_april">avril</string> + <string name="month_long_may">mai</string> + <string name="month_long_june">juin</string> + <string name="month_long_july">juillet</string> + <string name="month_long_august">août</string> + <string name="month_long_september">septembre</string> + <string name="month_long_october">octobre</string> + <string name="month_long_november">novembre</string> + <string name="month_long_december">décembre</string> + + <string name="month_medium_january">janv.</string> + <string name="month_medium_february">févr.</string> + <string name="month_medium_march">mars</string> + <string name="month_medium_april">avr.</string> + <string name="month_medium_may">mai</string> + <string name="month_medium_june">juin</string> + <string name="month_medium_july">juil.</string> + <string name="month_medium_august">août</string> + <string name="month_medium_september">sept.</string> + <string name="month_medium_october">oct.</string> + <string name="month_medium_november">nov.</string> + <string name="month_medium_december">déc.</string> + + <string name="month_shortest_january">J</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">dimanche</string> + <string name="day_of_week_long_monday">lundi</string> + <string name="day_of_week_long_tuesday">mardi</string> + <string name="day_of_week_long_wednesday">mercredi</string> + <string name="day_of_week_long_thursday">jeudi</string> + <string name="day_of_week_long_friday">vendredi</string> + <string name="day_of_week_long_saturday">samedi</string> + + <string name="day_of_week_medium_sunday">dim.</string> + <string name="day_of_week_medium_monday">lun.</string> + <string name="day_of_week_medium_tuesday">mar.</string> + <string name="day_of_week_medium_wednesday">mer.</string> + <string name="day_of_week_medium_thursday">jeu.</string> + <string name="day_of_week_medium_friday">ven.</string> + <string name="day_of_week_medium_saturday">sam.</string> + + <string name="day_of_week_short_sunday">dim.</string> + <string name="day_of_week_short_monday">lun.</string> + <string name="day_of_week_short_tuesday">mar.</string> + <string name="day_of_week_short_wednesday">mer.</string> + <string name="day_of_week_short_thursday">jeu.</string> + <string name="day_of_week_short_friday">ven.</string> + <string name="day_of_week_short_saturday">sam.</string> + + <string name="day_of_week_shortest_sunday">D</string> + <string name="day_of_week_shortest_monday">L</string> + <string name="day_of_week_shortest_tuesday">M</string> + <string name="day_of_week_shortest_wednesday">M</string> + <string name="day_of_week_shortest_thursday">J</string> + <string name="day_of_week_shortest_friday">V</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">matin</string> + <string name="pm">soir</string> + <string name="yesterday">hier</string> + <string name="today">aujourd’hui</string> + <string name="tomorrow">demain</string> + + <string name="hour_minute_ampm">%H:%M</string> + <string name="hour_minute_cap_ampm">%H:%M</string> + <string name="numeric_date">%d.%m.%Y</string> + <string name="numeric_date_format">dd.MM.yyyy</string> + <string name="month_day_year">%-e %B %Y</string> + <string name="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%H:%M:%S %-e %b %Y</string> + <string name="abbrev_month_day_year">%-e %b %Y</string> + <string name="month_day">%-e %B</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%-e %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-fr-rFR/donottranslate-cldr.xml b/core/res/res/values-fr-rFR/donottranslate-cldr.xml new file mode 100644 index 0000000..1213ed8 --- /dev/null +++ b/core/res/res/values-fr-rFR/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">janvier</string> + <string name="month_long_standalone_february">février</string> + <string name="month_long_standalone_march">mars</string> + <string name="month_long_standalone_april">avril</string> + <string name="month_long_standalone_may">mai</string> + <string name="month_long_standalone_june">juin</string> + <string name="month_long_standalone_july">juillet</string> + <string name="month_long_standalone_august">août</string> + <string name="month_long_standalone_september">septembre</string> + <string name="month_long_standalone_october">octobre</string> + <string name="month_long_standalone_november">novembre</string> + <string name="month_long_standalone_december">décembre</string> + + <string name="month_long_january">janvier</string> + <string name="month_long_february">février</string> + <string name="month_long_march">mars</string> + <string name="month_long_april">avril</string> + <string name="month_long_may">mai</string> + <string name="month_long_june">juin</string> + <string name="month_long_july">juillet</string> + <string name="month_long_august">août</string> + <string name="month_long_september">septembre</string> + <string name="month_long_october">octobre</string> + <string name="month_long_november">novembre</string> + <string name="month_long_december">décembre</string> + + <string name="month_medium_january">janv.</string> + <string name="month_medium_february">févr.</string> + <string name="month_medium_march">mars</string> + <string name="month_medium_april">avr.</string> + <string name="month_medium_may">mai</string> + <string name="month_medium_june">juin</string> + <string name="month_medium_july">juil.</string> + <string name="month_medium_august">août</string> + <string name="month_medium_september">sept.</string> + <string name="month_medium_october">oct.</string> + <string name="month_medium_november">nov.</string> + <string name="month_medium_december">déc.</string> + + <string name="month_shortest_january">J</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">dimanche</string> + <string name="day_of_week_long_monday">lundi</string> + <string name="day_of_week_long_tuesday">mardi</string> + <string name="day_of_week_long_wednesday">mercredi</string> + <string name="day_of_week_long_thursday">jeudi</string> + <string name="day_of_week_long_friday">vendredi</string> + <string name="day_of_week_long_saturday">samedi</string> + + <string name="day_of_week_medium_sunday">dim.</string> + <string name="day_of_week_medium_monday">lun.</string> + <string name="day_of_week_medium_tuesday">mar.</string> + <string name="day_of_week_medium_wednesday">mer.</string> + <string name="day_of_week_medium_thursday">jeu.</string> + <string name="day_of_week_medium_friday">ven.</string> + <string name="day_of_week_medium_saturday">sam.</string> + + <string name="day_of_week_short_sunday">dim.</string> + <string name="day_of_week_short_monday">lun.</string> + <string name="day_of_week_short_tuesday">mar.</string> + <string name="day_of_week_short_wednesday">mer.</string> + <string name="day_of_week_short_thursday">jeu.</string> + <string name="day_of_week_short_friday">ven.</string> + <string name="day_of_week_short_saturday">sam.</string> + + <string name="day_of_week_shortest_sunday">D</string> + <string name="day_of_week_shortest_monday">L</string> + <string name="day_of_week_shortest_tuesday">M</string> + <string name="day_of_week_shortest_wednesday">M</string> + <string name="day_of_week_shortest_thursday">J</string> + <string name="day_of_week_shortest_friday">V</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">matin</string> + <string name="pm">soir</string> + <string name="yesterday">hier</string> + <string name="today">aujourd’hui</string> + <string name="tomorrow">demain</string> + + <string name="hour_minute_ampm">%H:%M</string> + <string name="hour_minute_cap_ampm">%H:%M</string> + <string name="numeric_date">%d/%m/%Y</string> + <string name="numeric_date_format">dd/MM/yyyy</string> + <string name="month_day_year">%-e %B %Y</string> + <string name="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%H:%M:%S %-e %b %Y</string> + <string name="abbrev_month_day_year">%-e %b %Y</string> + <string name="month_day">%-e %B</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%-e %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-fr/donottranslate-cldr.xml b/core/res/res/values-fr/donottranslate-cldr.xml new file mode 100644 index 0000000..1213ed8 --- /dev/null +++ b/core/res/res/values-fr/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">janvier</string> + <string name="month_long_standalone_february">février</string> + <string name="month_long_standalone_march">mars</string> + <string name="month_long_standalone_april">avril</string> + <string name="month_long_standalone_may">mai</string> + <string name="month_long_standalone_june">juin</string> + <string name="month_long_standalone_july">juillet</string> + <string name="month_long_standalone_august">août</string> + <string name="month_long_standalone_september">septembre</string> + <string name="month_long_standalone_october">octobre</string> + <string name="month_long_standalone_november">novembre</string> + <string name="month_long_standalone_december">décembre</string> + + <string name="month_long_january">janvier</string> + <string name="month_long_february">février</string> + <string name="month_long_march">mars</string> + <string name="month_long_april">avril</string> + <string name="month_long_may">mai</string> + <string name="month_long_june">juin</string> + <string name="month_long_july">juillet</string> + <string name="month_long_august">août</string> + <string name="month_long_september">septembre</string> + <string name="month_long_october">octobre</string> + <string name="month_long_november">novembre</string> + <string name="month_long_december">décembre</string> + + <string name="month_medium_january">janv.</string> + <string name="month_medium_february">févr.</string> + <string name="month_medium_march">mars</string> + <string name="month_medium_april">avr.</string> + <string name="month_medium_may">mai</string> + <string name="month_medium_june">juin</string> + <string name="month_medium_july">juil.</string> + <string name="month_medium_august">août</string> + <string name="month_medium_september">sept.</string> + <string name="month_medium_october">oct.</string> + <string name="month_medium_november">nov.</string> + <string name="month_medium_december">déc.</string> + + <string name="month_shortest_january">J</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">dimanche</string> + <string name="day_of_week_long_monday">lundi</string> + <string name="day_of_week_long_tuesday">mardi</string> + <string name="day_of_week_long_wednesday">mercredi</string> + <string name="day_of_week_long_thursday">jeudi</string> + <string name="day_of_week_long_friday">vendredi</string> + <string name="day_of_week_long_saturday">samedi</string> + + <string name="day_of_week_medium_sunday">dim.</string> + <string name="day_of_week_medium_monday">lun.</string> + <string name="day_of_week_medium_tuesday">mar.</string> + <string name="day_of_week_medium_wednesday">mer.</string> + <string name="day_of_week_medium_thursday">jeu.</string> + <string name="day_of_week_medium_friday">ven.</string> + <string name="day_of_week_medium_saturday">sam.</string> + + <string name="day_of_week_short_sunday">dim.</string> + <string name="day_of_week_short_monday">lun.</string> + <string name="day_of_week_short_tuesday">mar.</string> + <string name="day_of_week_short_wednesday">mer.</string> + <string name="day_of_week_short_thursday">jeu.</string> + <string name="day_of_week_short_friday">ven.</string> + <string name="day_of_week_short_saturday">sam.</string> + + <string name="day_of_week_shortest_sunday">D</string> + <string name="day_of_week_shortest_monday">L</string> + <string name="day_of_week_shortest_tuesday">M</string> + <string name="day_of_week_shortest_wednesday">M</string> + <string name="day_of_week_shortest_thursday">J</string> + <string name="day_of_week_shortest_friday">V</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">matin</string> + <string name="pm">soir</string> + <string name="yesterday">hier</string> + <string name="today">aujourd’hui</string> + <string name="tomorrow">demain</string> + + <string name="hour_minute_ampm">%H:%M</string> + <string name="hour_minute_cap_ampm">%H:%M</string> + <string name="numeric_date">%d/%m/%Y</string> + <string name="numeric_date_format">dd/MM/yyyy</string> + <string name="month_day_year">%-e %B %Y</string> + <string name="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%H:%M:%S %-e %b %Y</string> + <string name="abbrev_month_day_year">%-e %b %Y</string> + <string name="month_day">%-e %B</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%-e %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index c664d1a..736caf7 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -418,9 +418,6 @@ <string name="lockscreen_glogin_password_hint">"Mot de passe"</string> <string name="lockscreen_glogin_submit_button">"Se connecter"</string> <string name="lockscreen_glogin_invalid_input">"Nom d\'utilisateur ou mot de passe incorrect."</string> - <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string> - <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string> - <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string> <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string> <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string> <string name="status_bar_clear_all_button">"Effacer les notifications"</string> @@ -452,9 +449,6 @@ <string name="menu_enter_shortcut_label">"entrée"</string> <string name="menu_delete_shortcut_label">"supprimer"</string> <string name="search_go">"Rechercher"</string> - <string name="today">"Aujourd\'hui"</string> - <string name="yesterday">"Hier"</string> - <string name="tomorrow">"Demain"</string> <string name="oneMonthDurationPast">"Il y a 1 mois"</string> <string name="beforeOneMonthDurationPast">"Il y a plus d\'un mois"</string> <plurals name="num_seconds_ago"> @@ -536,13 +530,6 @@ <string name="weeks">"semaines"</string> <string name="year">"année"</string> <string name="years">"années"</string> - <string name="sunday">"dimanche"</string> - <string name="monday">"lundi"</string> - <string name="tuesday">"mardi"</string> - <string name="wednesday">"mercredi"</string> - <string name="thursday">"jeudi"</string> - <string name="friday">"vendredi"</string> - <string name="saturday">"samedi"</string> <string name="every_weekday">"Tous les jours ouvrés (lun.- ven.)"</string> <string name="daily">"Tous les jours"</string> <string name="weekly">"Toutes les semaines le <xliff:g id="DAY">%s</xliff:g>"</string> @@ -552,9 +539,6 @@ <string name="VideoView_error_text_invalid_progressive_playback">"Désolé, cette vidéo ne peut être lue sur cet appareil."</string> <string name="VideoView_error_text_unknown">"Désolé, impossible de lire cette vidéo."</string> <string name="VideoView_error_button">"OK"</string> - <string name="am">"AM"</string> - <string name="pm">"PM"</string> - <string name="numeric_date">"<xliff:g id="DAY">%d</xliff:g>/<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="YEAR">%Y</xliff:g>"</string> <string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g> <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string> <string name="wday1_date1_wday2_date2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>"</string> <string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string> @@ -566,23 +550,12 @@ <string name="date_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="time_wday">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>"</string> - <string name="full_date_month_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="full_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="medium_date_month_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="medium_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="twelve_hour_time_format" format="date">"<xliff:g id="HOUR">h</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>' '<xliff:g id="AMPM">a</xliff:g>"</string> - <string name="twenty_four_hour_time_format" format="date">"<xliff:g id="HOUR">HH</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>"</string> <string name="noon">"midi"</string> <string name="Noon">"Midi"</string> <string name="midnight">"minuit"</string> <string name="Midnight">"Minuit"</string> - <string name="month_day">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g>"</string> <!-- no translation found for month (7026169712234774086) --> <skip /> - <string name="month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="month_year">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string> - <string name="date_and_time">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g> <xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> <string name="same_year_md1_md2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>"</string> <string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>"</string> <string name="same_year_mdy1_mdy2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR">%9$s</xliff:g>"</string> @@ -607,82 +580,8 @@ <string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string> <string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string> <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string> - <string name="abbrev_month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="abbrev_month_year">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="abbrev_month_day">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="DAY">%-d</xliff:g>"</string> <!-- no translation found for abbrev_month (3131032032850777433) --> <skip /> - <string name="day_of_week_long_sunday">"dimanche"</string> - <string name="day_of_week_long_monday">"lundi"</string> - <string name="day_of_week_long_tuesday">"mardi"</string> - <string name="day_of_week_long_wednesday">"mercredi"</string> - <string name="day_of_week_long_thursday">"jeudi"</string> - <string name="day_of_week_long_friday">"vendredi"</string> - <string name="day_of_week_long_saturday">"samedi"</string> - <string name="day_of_week_medium_sunday">"dim."</string> - <string name="day_of_week_medium_monday">"Lun"</string> - <string name="day_of_week_medium_tuesday">"Mar"</string> - <string name="day_of_week_medium_wednesday">"Mer"</string> - <string name="day_of_week_medium_thursday">"Jeu"</string> - <string name="day_of_week_medium_friday">"Ven"</string> - <string name="day_of_week_medium_saturday">"Sam"</string> - <string name="day_of_week_short_sunday">"Dim"</string> - <string name="day_of_week_short_monday">"Lun"</string> - <string name="day_of_week_short_tuesday">"Mar"</string> - <string name="day_of_week_short_wednesday">"Mer"</string> - <string name="day_of_week_short_thursday">"Jeu"</string> - <string name="day_of_week_short_friday">"Ven"</string> - <string name="day_of_week_short_saturday">"Sam"</string> - <string name="day_of_week_shorter_sunday">"Dim"</string> - <string name="day_of_week_shorter_monday">"Lun"</string> - <string name="day_of_week_shorter_tuesday">"Mar"</string> - <string name="day_of_week_shorter_wednesday">"Mer"</string> - <string name="day_of_week_shorter_thursday">"Jeu"</string> - <string name="day_of_week_shorter_friday">"Ven"</string> - <string name="day_of_week_shorter_saturday">"sam."</string> - <string name="day_of_week_shortest_sunday">"Dim"</string> - <string name="day_of_week_shortest_monday">"Lun"</string> - <string name="day_of_week_shortest_tuesday">"Mar"</string> - <string name="day_of_week_shortest_wednesday">"Mer"</string> - <string name="day_of_week_shortest_thursday">"Jeu"</string> - <string name="day_of_week_shortest_friday">"Ven"</string> - <string name="day_of_week_shortest_saturday">"Sam"</string> - <string name="month_long_january">"janvier"</string> - <string name="month_long_february">"février"</string> - <string name="month_long_march">"mars"</string> - <string name="month_long_april">"avril"</string> - <string name="month_long_may">"mai"</string> - <string name="month_long_june">"juin"</string> - <string name="month_long_july">"juillet"</string> - <string name="month_long_august">"août"</string> - <string name="month_long_september">"septembre"</string> - <string name="month_long_october">"octobre"</string> - <string name="month_long_november">"novembre"</string> - <string name="month_long_december">"décembre"</string> - <string name="month_medium_january">"janv."</string> - <string name="month_medium_february">"févr."</string> - <string name="month_medium_march">"mars"</string> - <string name="month_medium_april">"avr."</string> - <string name="month_medium_may">"mai"</string> - <string name="month_medium_june">"juin"</string> - <string name="month_medium_july">"juil."</string> - <string name="month_medium_august">"août"</string> - <string name="month_medium_september">"sept."</string> - <string name="month_medium_october">"oct."</string> - <string name="month_medium_november">"nov."</string> - <string name="month_medium_december">"déc."</string> - <string name="month_shortest_january">"jan."</string> - <string name="month_shortest_february">"Ven"</string> - <string name="month_shortest_march">"mars"</string> - <string name="month_shortest_april">"avr."</string> - <string name="month_shortest_may">"mai"</string> - <string name="month_shortest_june">"juin"</string> - <string name="month_shortest_july">"juil."</string> - <string name="month_shortest_august">"août"</string> - <string name="month_shortest_september">"sept."</string> - <string name="month_shortest_october">"oct."</string> - <string name="month_shortest_november">"nov."</string> - <string name="month_shortest_december">"déc."</string> <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string> <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string> <string name="selectAll">"Tout sélectionner"</string> diff --git a/core/res/res/values-he-rIL/donottranslate-cldr.xml b/core/res/res/values-he-rIL/donottranslate-cldr.xml new file mode 100644 index 0000000..1b1aafa --- /dev/null +++ b/core/res/res/values-he-rIL/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">ינואר</string> + <string name="month_long_standalone_february">פברואר</string> + <string name="month_long_standalone_march">מרס</string> + <string name="month_long_standalone_april">אפריל</string> + <string name="month_long_standalone_may">מאי</string> + <string name="month_long_standalone_june">יוני</string> + <string name="month_long_standalone_july">יולי</string> + <string name="month_long_standalone_august">אוגוסט</string> + <string name="month_long_standalone_september">ספטמבר</string> + <string name="month_long_standalone_october">אוקטובר</string> + <string name="month_long_standalone_november">נובמבר</string> + <string name="month_long_standalone_december">דצמבר</string> + + <string name="month_long_january">ינואר</string> + <string name="month_long_february">פברואר</string> + <string name="month_long_march">מרס</string> + <string name="month_long_april">אפריל</string> + <string name="month_long_may">מאי</string> + <string name="month_long_june">יוני</string> + <string name="month_long_july">יולי</string> + <string name="month_long_august">אוגוסט</string> + <string name="month_long_september">ספטמבר</string> + <string name="month_long_october">אוקטובר</string> + <string name="month_long_november">נובמבר</string> + <string name="month_long_december">דצמבר</string> + + <string name="month_medium_january">ינו</string> + <string name="month_medium_february">פבר</string> + <string name="month_medium_march">מרס</string> + <string name="month_medium_april">אפר</string> + <string name="month_medium_may">מאי</string> + <string name="month_medium_june">יונ</string> + <string name="month_medium_july">יול</string> + <string name="month_medium_august">אוג</string> + <string name="month_medium_september">ספט</string> + <string name="month_medium_october">אוק</string> + <string name="month_medium_november">נוב</string> + <string name="month_medium_december">דצמ</string> + + <string name="month_shortest_january">1</string> + <string name="month_shortest_february">2</string> + <string name="month_shortest_march">3</string> + <string name="month_shortest_april">4</string> + <string name="month_shortest_may">5</string> + <string name="month_shortest_june">6</string> + <string name="month_shortest_july">7</string> + <string name="month_shortest_august">8</string> + <string name="month_shortest_september">9</string> + <string name="month_shortest_october">10</string> + <string name="month_shortest_november">11</string> + <string name="month_shortest_december">12</string> + + <string name="day_of_week_long_sunday">יום ראשון</string> + <string name="day_of_week_long_monday">יום שני</string> + <string name="day_of_week_long_tuesday">יום שלישי</string> + <string name="day_of_week_long_wednesday">יום רביעי</string> + <string name="day_of_week_long_thursday">יום חמישי</string> + <string name="day_of_week_long_friday">יום שישי</string> + <string name="day_of_week_long_saturday">יום שבת</string> + + <string name="day_of_week_medium_sunday">יום א'</string> + <string name="day_of_week_medium_monday">יום ב'</string> + <string name="day_of_week_medium_tuesday">יום ג'</string> + <string name="day_of_week_medium_wednesday">יום ד'</string> + <string name="day_of_week_medium_thursday">יום ה'</string> + <string name="day_of_week_medium_friday">יום ו'</string> + <string name="day_of_week_medium_saturday">שבת</string> + + <string name="day_of_week_short_sunday">יום א'</string> + <string name="day_of_week_short_monday">יום ב'</string> + <string name="day_of_week_short_tuesday">יום ג'</string> + <string name="day_of_week_short_wednesday">יום ד'</string> + <string name="day_of_week_short_thursday">יום ה'</string> + <string name="day_of_week_short_friday">יום ו'</string> + <string name="day_of_week_short_saturday">שבת</string> + + <string name="day_of_week_shortest_sunday">א</string> + <string name="day_of_week_shortest_monday">ב</string> + <string name="day_of_week_shortest_tuesday">ג</string> + <string name="day_of_week_shortest_wednesday">ד</string> + <string name="day_of_week_shortest_thursday">ה</string> + <string name="day_of_week_shortest_friday">ו</string> + <string name="day_of_week_shortest_saturday">ש</string> + + <string name="am">לפנה"צ</string> + <string name="pm">אחה"צ</string> + <string name="yesterday">אתמול</string> + <string name="today">היום</string> + <string name="tomorrow">מחר</string> + + <string name="hour_minute_ampm">%H:%M</string> + <string name="hour_minute_cap_ampm">%H:%M</string> + <string name="numeric_date">%d/%m/%Y</string> + <string name="numeric_date_format">dd/MM/yyyy</string> + <string name="month_day_year">%-e ב%B %Y</string> + <string name="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%H:%M:%S %-e.%-m.%Y</string> + <string name="abbrev_month_day_year">%-e.%-m.%Y</string> + <string name="month_day">%-e ב%B</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%b %-e</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%Y %b</string> +</resources> diff --git a/core/res/res/values-hi-rIN/donottranslate-cldr.xml b/core/res/res/values-hi-rIN/donottranslate-cldr.xml new file mode 100644 index 0000000..8c6a34f7 --- /dev/null +++ b/core/res/res/values-hi-rIN/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">जनवरी</string> + <string name="month_long_standalone_february">फरवरी</string> + <string name="month_long_standalone_march">मार्च</string> + <string name="month_long_standalone_april">अप्रैल</string> + <string name="month_long_standalone_may">मई</string> + <string name="month_long_standalone_june">जून</string> + <string name="month_long_standalone_july">जुलाई</string> + <string name="month_long_standalone_august">अगस्त</string> + <string name="month_long_standalone_september">सितम्बर</string> + <string name="month_long_standalone_october">अक्तूबर</string> + <string name="month_long_standalone_november">नवम्बर</string> + <string name="month_long_standalone_december">दिसम्बर</string> + + <string name="month_long_january">जनवरी</string> + <string name="month_long_february">फरवरी</string> + <string name="month_long_march">मार्च</string> + <string name="month_long_april">अप्रैल</string> + <string name="month_long_may">मई</string> + <string name="month_long_june">जून</string> + <string name="month_long_july">जुलाई</string> + <string name="month_long_august">अगस्त</string> + <string name="month_long_september">सितम्बर</string> + <string name="month_long_october">अक्तूबर</string> + <string name="month_long_november">नवम्बर</string> + <string name="month_long_december">दिसम्बर</string> + + <string name="month_medium_january">जनवरी</string> + <string name="month_medium_february">फरवरी</string> + <string name="month_medium_march">मार्च</string> + <string name="month_medium_april">अप्रैल</string> + <string name="month_medium_may">मई</string> + <string name="month_medium_june">जून</string> + <string name="month_medium_july">जुलाई</string> + <string name="month_medium_august">अगस्त</string> + <string name="month_medium_september">सितम्बर</string> + <string name="month_medium_october">अक्तूबर</string> + <string name="month_medium_november">नवम्बर</string> + <string name="month_medium_december">दिसम्बर</string> + + <string name="month_shortest_january">ज</string> + <string name="month_shortest_february">फ़</string> + <string name="month_shortest_march">मा</string> + <string name="month_shortest_april">अ</string> + <string name="month_shortest_may">म</string> + <string name="month_shortest_june">जू</string> + <string name="month_shortest_july">जु</string> + <string name="month_shortest_august">अ</string> + <string name="month_shortest_september">सि</string> + <string name="month_shortest_october">अ</string> + <string name="month_shortest_november">न</string> + <string name="month_shortest_december">दि</string> + + <string name="day_of_week_long_sunday">रविवार</string> + <string name="day_of_week_long_monday">सोमवार</string> + <string name="day_of_week_long_tuesday">मंगलवार</string> + <string name="day_of_week_long_wednesday">बुधवार</string> + <string name="day_of_week_long_thursday">गुरुवार</string> + <string name="day_of_week_long_friday">शुक्रवार</string> + <string name="day_of_week_long_saturday">शनिवार</string> + + <string name="day_of_week_medium_sunday">रवि</string> + <string name="day_of_week_medium_monday">सोम</string> + <string name="day_of_week_medium_tuesday">मंगल</string> + <string name="day_of_week_medium_wednesday">बुध</string> + <string name="day_of_week_medium_thursday">गुरु</string> + <string name="day_of_week_medium_friday">शुक्र</string> + <string name="day_of_week_medium_saturday">शनि</string> + + <string name="day_of_week_short_sunday">रवि</string> + <string name="day_of_week_short_monday">सोम</string> + <string name="day_of_week_short_tuesday">मंगल</string> + <string name="day_of_week_short_wednesday">बुध</string> + <string name="day_of_week_short_thursday">गुरु</string> + <string name="day_of_week_short_friday">शुक्र</string> + <string name="day_of_week_short_saturday">शनि</string> + + <string name="day_of_week_shortest_sunday">र</string> + <string name="day_of_week_shortest_monday">सो</string> + <string name="day_of_week_shortest_tuesday">मं</string> + <string name="day_of_week_shortest_wednesday">बु</string> + <string name="day_of_week_shortest_thursday">गु</string> + <string name="day_of_week_shortest_friday">शु</string> + <string name="day_of_week_shortest_saturday">श</string> + + <string name="am">AM</string> + <string name="pm">PM</string> + <string name="yesterday">Yesterday</string> + <string name="today">Today</string> + <string name="tomorrow">Tomorrow</string> + + <string name="hour_minute_ampm">%-l:%M %p</string> + <string name="hour_minute_cap_ampm">%-l:%M %^p</string> + <string name="numeric_date">%-e-%-m-%Y</string> + <string name="numeric_date_format">d-M-yyyy</string> + <string name="month_day_year">%-e %B %Y</string> + <string name="time_of_day">%-l:%M:%S %p</string> + <string name="date_and_time">%-l:%M:%S %p %d-%m-%Y</string> + <string name="abbrev_month_day_year">%d-%m-%Y</string> + <string name="month_day">%-e %B</string> + <string name="month">%-B</string> + <string name="month_year">%Y %B</string> + <string name="abbrev_month_day">%-e %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-hu-rHU/donottranslate-cldr.xml b/core/res/res/values-hu-rHU/donottranslate-cldr.xml new file mode 100644 index 0000000..6085c6f --- /dev/null +++ b/core/res/res/values-hu-rHU/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">január</string> + <string name="month_long_standalone_february">február</string> + <string name="month_long_standalone_march">március</string> + <string name="month_long_standalone_april">április</string> + <string name="month_long_standalone_may">május</string> + <string name="month_long_standalone_june">június</string> + <string name="month_long_standalone_july">július</string> + <string name="month_long_standalone_august">augusztus</string> + <string name="month_long_standalone_september">szeptember</string> + <string name="month_long_standalone_october">október</string> + <string name="month_long_standalone_november">november</string> + <string name="month_long_standalone_december">december</string> + + <string name="month_long_january">január</string> + <string name="month_long_february">február</string> + <string name="month_long_march">március</string> + <string name="month_long_april">április</string> + <string name="month_long_may">május</string> + <string name="month_long_june">június</string> + <string name="month_long_july">július</string> + <string name="month_long_august">augusztus</string> + <string name="month_long_september">szeptember</string> + <string name="month_long_october">október</string> + <string name="month_long_november">november</string> + <string name="month_long_december">december</string> + + <string name="month_medium_january">jan.</string> + <string name="month_medium_february">febr.</string> + <string name="month_medium_march">márc.</string> + <string name="month_medium_april">ápr.</string> + <string name="month_medium_may">máj.</string> + <string name="month_medium_june">jún.</string> + <string name="month_medium_july">júl.</string> + <string name="month_medium_august">aug.</string> + <string name="month_medium_september">szept.</string> + <string name="month_medium_october">okt.</string> + <string name="month_medium_november">nov.</string> + <string name="month_medium_december">dec.</string> + + <string name="month_shortest_january">J</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">Á</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">vasárnap</string> + <string name="day_of_week_long_monday">hétfő</string> + <string name="day_of_week_long_tuesday">kedd</string> + <string name="day_of_week_long_wednesday">szerda</string> + <string name="day_of_week_long_thursday">csütörtök</string> + <string name="day_of_week_long_friday">péntek</string> + <string name="day_of_week_long_saturday">szombat</string> + + <string name="day_of_week_medium_sunday">V</string> + <string name="day_of_week_medium_monday">H</string> + <string name="day_of_week_medium_tuesday">K</string> + <string name="day_of_week_medium_wednesday">Sze</string> + <string name="day_of_week_medium_thursday">Cs</string> + <string name="day_of_week_medium_friday">P</string> + <string name="day_of_week_medium_saturday">Szo</string> + + <string name="day_of_week_short_sunday">V</string> + <string name="day_of_week_short_monday">H</string> + <string name="day_of_week_short_tuesday">K</string> + <string name="day_of_week_short_wednesday">Sze</string> + <string name="day_of_week_short_thursday">Cs</string> + <string name="day_of_week_short_friday">P</string> + <string name="day_of_week_short_saturday">Szo</string> + + <string name="day_of_week_shortest_sunday">V</string> + <string name="day_of_week_shortest_monday">H</string> + <string name="day_of_week_shortest_tuesday">K</string> + <string name="day_of_week_shortest_wednesday">S</string> + <string name="day_of_week_shortest_thursday">C</string> + <string name="day_of_week_shortest_friday">P</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">de.</string> + <string name="pm">du.</string> + <string name="yesterday">tegnap</string> + <string name="today">ma</string> + <string name="tomorrow">holnap</string> + + <string name="hour_minute_ampm">%-k:%M</string> + <string name="hour_minute_cap_ampm">%-k:%M</string> + <string name="numeric_date">%Y.%m.%d.</string> + <string name="numeric_date_format">yyyy.MM.dd.</string> + <string name="month_day_year">%Y. %B %-e.</string> + <string name="time_of_day">%-k:%M:%S</string> + <string name="date_and_time">%-k:%M:%S %Y.%m.%d.</string> + <string name="abbrev_month_day_year">%Y.%m.%d.</string> + <string name="month_day">%B %-e.</string> + <string name="month">%-B</string> + <string name="month_year">%Y %B</string> + <string name="abbrev_month_day">%b %-e.</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%Y %b</string> +</resources> diff --git a/core/res/res/values-id-rID/donottranslate-cldr.xml b/core/res/res/values-id-rID/donottranslate-cldr.xml new file mode 100644 index 0000000..0a15fed --- /dev/null +++ b/core/res/res/values-id-rID/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">Januari</string> + <string name="month_long_standalone_february">Februari</string> + <string name="month_long_standalone_march">Maret</string> + <string name="month_long_standalone_april">April</string> + <string name="month_long_standalone_may">Mei</string> + <string name="month_long_standalone_june">Juni</string> + <string name="month_long_standalone_july">Juli</string> + <string name="month_long_standalone_august">Agustus</string> + <string name="month_long_standalone_september">September</string> + <string name="month_long_standalone_october">Oktober</string> + <string name="month_long_standalone_november">November</string> + <string name="month_long_standalone_december">Desember</string> + + <string name="month_long_january">Januari</string> + <string name="month_long_february">Februari</string> + <string name="month_long_march">Maret</string> + <string name="month_long_april">April</string> + <string name="month_long_may">Mei</string> + <string name="month_long_june">Juni</string> + <string name="month_long_july">Juli</string> + <string name="month_long_august">Agustus</string> + <string name="month_long_september">September</string> + <string name="month_long_october">Oktober</string> + <string name="month_long_november">November</string> + <string name="month_long_december">Desember</string> + + <string name="month_medium_january">Jan</string> + <string name="month_medium_february">Feb</string> + <string name="month_medium_march">Mar</string> + <string name="month_medium_april">Apr</string> + <string name="month_medium_may">Mei</string> + <string name="month_medium_june">Jun</string> + <string name="month_medium_july">Jul</string> + <string name="month_medium_august">Agu</string> + <string name="month_medium_september">Sep</string> + <string name="month_medium_october">Okt</string> + <string name="month_medium_november">Nov</string> + <string name="month_medium_december">Des</string> + + <string name="month_shortest_january">1</string> + <string name="month_shortest_february">2</string> + <string name="month_shortest_march">3</string> + <string name="month_shortest_april">4</string> + <string name="month_shortest_may">5</string> + <string name="month_shortest_june">6</string> + <string name="month_shortest_july">7</string> + <string name="month_shortest_august">8</string> + <string name="month_shortest_september">9</string> + <string name="month_shortest_october">10</string> + <string name="month_shortest_november">11</string> + <string name="month_shortest_december">12</string> + + <string name="day_of_week_long_sunday">Minggu</string> + <string name="day_of_week_long_monday">Senin</string> + <string name="day_of_week_long_tuesday">Selasa</string> + <string name="day_of_week_long_wednesday">Rabu</string> + <string name="day_of_week_long_thursday">Kamis</string> + <string name="day_of_week_long_friday">Jumat</string> + <string name="day_of_week_long_saturday">Sabtu</string> + + <string name="day_of_week_medium_sunday">Min</string> + <string name="day_of_week_medium_monday">Sen</string> + <string name="day_of_week_medium_tuesday">Sel</string> + <string name="day_of_week_medium_wednesday">Rab</string> + <string name="day_of_week_medium_thursday">Kam</string> + <string name="day_of_week_medium_friday">Jum</string> + <string name="day_of_week_medium_saturday">Sab</string> + + <string name="day_of_week_short_sunday">Min</string> + <string name="day_of_week_short_monday">Sen</string> + <string name="day_of_week_short_tuesday">Sel</string> + <string name="day_of_week_short_wednesday">Rab</string> + <string name="day_of_week_short_thursday">Kam</string> + <string name="day_of_week_short_friday">Jum</string> + <string name="day_of_week_short_saturday">Sab</string> + + <string name="day_of_week_shortest_sunday">1</string> + <string name="day_of_week_shortest_monday">2</string> + <string name="day_of_week_shortest_tuesday">3</string> + <string name="day_of_week_shortest_wednesday">4</string> + <string name="day_of_week_shortest_thursday">5</string> + <string name="day_of_week_shortest_friday">6</string> + <string name="day_of_week_shortest_saturday">7</string> + + <string name="am">AM</string> + <string name="pm">PM</string> + <string name="yesterday">Yesterday</string> + <string name="today">Today</string> + <string name="tomorrow">Tomorrow</string> + + <string name="hour_minute_ampm">%H:%M</string> + <string name="hour_minute_cap_ampm">%H:%M</string> + <string name="numeric_date">%d/%m/%Y</string> + <string name="numeric_date_format">dd/MM/yyyy</string> + <string name="month_day_year">%-e %B %Y</string> + <string name="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%H:%M:%S %-e %b %Y</string> + <string name="abbrev_month_day_year">%-e %b %Y</string> + <string name="month_day">%B %-e</string> + <string name="month">%-B</string> + <string name="month_year">%Y %B</string> + <string name="abbrev_month_day">%b %-e</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%Y %b</string> +</resources> diff --git a/core/res/res/values-it-rCH/donottranslate-cldr.xml b/core/res/res/values-it-rCH/donottranslate-cldr.xml new file mode 100644 index 0000000..4129d6c --- /dev/null +++ b/core/res/res/values-it-rCH/donottranslate-cldr.xml @@ -0,0 +1,103 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">Gennaio</string> + <string name="month_long_standalone_february">Febbraio</string> + <string name="month_long_standalone_march">Marzo</string> + <string name="month_long_standalone_april">Aprile</string> + <string name="month_long_standalone_may">Maggio</string> + <string name="month_long_standalone_june">Giugno</string> + <string name="month_long_standalone_july">Luglio</string> + + <string name="month_long_january">gennaio</string> + <string name="month_long_february">febbraio</string> + <string name="month_long_march">marzo</string> + <string name="month_long_april">aprile</string> + <string name="month_long_may">maggio</string> + <string name="month_long_june">giugno</string> + <string name="month_long_july">Luglio</string> + <string name="month_long_august">agosto</string> + <string name="month_long_september">settembre</string> + <string name="month_long_october">ottobre</string> + <string name="month_long_november">novembre</string> + <string name="month_long_december">dicembre</string> + + <string name="month_medium_january">gen</string> + <string name="month_medium_february">feb</string> + <string name="month_medium_march">mar</string> + <string name="month_medium_april">apr</string> + <string name="month_medium_may">mag</string> + <string name="month_medium_june">giu</string> + <string name="month_medium_july">lug</string> + <string name="month_medium_august">ago</string> + <string name="month_medium_september">set</string> + <string name="month_medium_october">ott</string> + <string name="month_medium_november">nov</string> + <string name="month_medium_december">dic</string> + + <string name="month_shortest_january">G</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">G</string> + <string name="month_shortest_july">L</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">domenica</string> + <string name="day_of_week_long_monday">lunedì</string> + <string name="day_of_week_long_tuesday">martedì</string> + <string name="day_of_week_long_wednesday">mercoledì</string> + <string name="day_of_week_long_thursday">giovedì</string> + <string name="day_of_week_long_friday">venerdì</string> + <string name="day_of_week_long_saturday">sabato</string> + + <string name="day_of_week_medium_sunday">dom</string> + <string name="day_of_week_medium_monday">lun</string> + <string name="day_of_week_medium_tuesday">mar</string> + <string name="day_of_week_medium_wednesday">mer</string> + <string name="day_of_week_medium_thursday">gio</string> + <string name="day_of_week_medium_friday">ven</string> + <string name="day_of_week_medium_saturday">sab</string> + + <string name="day_of_week_short_sunday">dom</string> + <string name="day_of_week_short_monday">lun</string> + <string name="day_of_week_short_tuesday">mar</string> + <string name="day_of_week_short_wednesday">mer</string> + <string name="day_of_week_short_thursday">gio</string> + <string name="day_of_week_short_friday">ven</string> + <string name="day_of_week_short_saturday">sab</string> + + <string name="day_of_week_shortest_sunday">D</string> + <string name="day_of_week_shortest_monday">L</string> + <string name="day_of_week_shortest_tuesday">M</string> + <string name="day_of_week_shortest_wednesday">M</string> + <string name="day_of_week_shortest_thursday">G</string> + <string name="day_of_week_shortest_friday">V</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">m.</string> + <string name="pm">p.</string> + <string name="yesterday">ieri</string> + <string name="today">oggi</string> + <string name="tomorrow">domani</string> + + <string name="hour_minute_ampm">%H.%M</string> + <string name="hour_minute_cap_ampm">%H.%M</string> + <string name="numeric_date">%d.%m.%Y</string> + <string name="numeric_date_format">dd.MM.yyyy</string> + <string name="month_day_year">%-e %B %Y</string> + <string name="time_of_day">%H.%M.%S</string> + <string name="date_and_time">%H.%M.%S %-e-%b-%Y</string> + <string name="abbrev_month_day_year">%-e-%b-%Y</string> + <string name="month_day">%-e %B</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%-e %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-it-rIT/donottranslate-cldr.xml b/core/res/res/values-it-rIT/donottranslate-cldr.xml new file mode 100644 index 0000000..e3dd747 --- /dev/null +++ b/core/res/res/values-it-rIT/donottranslate-cldr.xml @@ -0,0 +1,103 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">Gennaio</string> + <string name="month_long_standalone_february">Febbraio</string> + <string name="month_long_standalone_march">Marzo</string> + <string name="month_long_standalone_april">Aprile</string> + <string name="month_long_standalone_may">Maggio</string> + <string name="month_long_standalone_june">Giugno</string> + <string name="month_long_standalone_july">Luglio</string> + + <string name="month_long_january">gennaio</string> + <string name="month_long_february">febbraio</string> + <string name="month_long_march">marzo</string> + <string name="month_long_april">aprile</string> + <string name="month_long_may">maggio</string> + <string name="month_long_june">giugno</string> + <string name="month_long_july">Luglio</string> + <string name="month_long_august">agosto</string> + <string name="month_long_september">settembre</string> + <string name="month_long_october">ottobre</string> + <string name="month_long_november">novembre</string> + <string name="month_long_december">dicembre</string> + + <string name="month_medium_january">gen</string> + <string name="month_medium_february">feb</string> + <string name="month_medium_march">mar</string> + <string name="month_medium_april">apr</string> + <string name="month_medium_may">mag</string> + <string name="month_medium_june">giu</string> + <string name="month_medium_july">lug</string> + <string name="month_medium_august">ago</string> + <string name="month_medium_september">set</string> + <string name="month_medium_october">ott</string> + <string name="month_medium_november">nov</string> + <string name="month_medium_december">dic</string> + + <string name="month_shortest_january">G</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">G</string> + <string name="month_shortest_july">L</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">domenica</string> + <string name="day_of_week_long_monday">lunedì</string> + <string name="day_of_week_long_tuesday">martedì</string> + <string name="day_of_week_long_wednesday">mercoledì</string> + <string name="day_of_week_long_thursday">giovedì</string> + <string name="day_of_week_long_friday">venerdì</string> + <string name="day_of_week_long_saturday">sabato</string> + + <string name="day_of_week_medium_sunday">dom</string> + <string name="day_of_week_medium_monday">lun</string> + <string name="day_of_week_medium_tuesday">mar</string> + <string name="day_of_week_medium_wednesday">mer</string> + <string name="day_of_week_medium_thursday">gio</string> + <string name="day_of_week_medium_friday">ven</string> + <string name="day_of_week_medium_saturday">sab</string> + + <string name="day_of_week_short_sunday">dom</string> + <string name="day_of_week_short_monday">lun</string> + <string name="day_of_week_short_tuesday">mar</string> + <string name="day_of_week_short_wednesday">mer</string> + <string name="day_of_week_short_thursday">gio</string> + <string name="day_of_week_short_friday">ven</string> + <string name="day_of_week_short_saturday">sab</string> + + <string name="day_of_week_shortest_sunday">D</string> + <string name="day_of_week_shortest_monday">L</string> + <string name="day_of_week_shortest_tuesday">M</string> + <string name="day_of_week_shortest_wednesday">M</string> + <string name="day_of_week_shortest_thursday">G</string> + <string name="day_of_week_shortest_friday">V</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">m.</string> + <string name="pm">p.</string> + <string name="yesterday">ieri</string> + <string name="today">oggi</string> + <string name="tomorrow">domani</string> + + <string name="hour_minute_ampm">%H.%M</string> + <string name="hour_minute_cap_ampm">%H.%M</string> + <string name="numeric_date">%d/%m/%Y</string> + <string name="numeric_date_format">dd/MM/yyyy</string> + <string name="month_day_year">%d %B %Y</string> + <string name="time_of_day">%H.%M.%S</string> + <string name="date_and_time">%H.%M.%S %d/%b/%Y</string> + <string name="abbrev_month_day_year">%d/%b/%Y</string> + <string name="month_day">%-e %B</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%-e %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-it/donottranslate-cldr.xml b/core/res/res/values-it/donottranslate-cldr.xml new file mode 100644 index 0000000..e3dd747 --- /dev/null +++ b/core/res/res/values-it/donottranslate-cldr.xml @@ -0,0 +1,103 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">Gennaio</string> + <string name="month_long_standalone_february">Febbraio</string> + <string name="month_long_standalone_march">Marzo</string> + <string name="month_long_standalone_april">Aprile</string> + <string name="month_long_standalone_may">Maggio</string> + <string name="month_long_standalone_june">Giugno</string> + <string name="month_long_standalone_july">Luglio</string> + + <string name="month_long_january">gennaio</string> + <string name="month_long_february">febbraio</string> + <string name="month_long_march">marzo</string> + <string name="month_long_april">aprile</string> + <string name="month_long_may">maggio</string> + <string name="month_long_june">giugno</string> + <string name="month_long_july">Luglio</string> + <string name="month_long_august">agosto</string> + <string name="month_long_september">settembre</string> + <string name="month_long_october">ottobre</string> + <string name="month_long_november">novembre</string> + <string name="month_long_december">dicembre</string> + + <string name="month_medium_january">gen</string> + <string name="month_medium_february">feb</string> + <string name="month_medium_march">mar</string> + <string name="month_medium_april">apr</string> + <string name="month_medium_may">mag</string> + <string name="month_medium_june">giu</string> + <string name="month_medium_july">lug</string> + <string name="month_medium_august">ago</string> + <string name="month_medium_september">set</string> + <string name="month_medium_october">ott</string> + <string name="month_medium_november">nov</string> + <string name="month_medium_december">dic</string> + + <string name="month_shortest_january">G</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">G</string> + <string name="month_shortest_july">L</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">domenica</string> + <string name="day_of_week_long_monday">lunedì</string> + <string name="day_of_week_long_tuesday">martedì</string> + <string name="day_of_week_long_wednesday">mercoledì</string> + <string name="day_of_week_long_thursday">giovedì</string> + <string name="day_of_week_long_friday">venerdì</string> + <string name="day_of_week_long_saturday">sabato</string> + + <string name="day_of_week_medium_sunday">dom</string> + <string name="day_of_week_medium_monday">lun</string> + <string name="day_of_week_medium_tuesday">mar</string> + <string name="day_of_week_medium_wednesday">mer</string> + <string name="day_of_week_medium_thursday">gio</string> + <string name="day_of_week_medium_friday">ven</string> + <string name="day_of_week_medium_saturday">sab</string> + + <string name="day_of_week_short_sunday">dom</string> + <string name="day_of_week_short_monday">lun</string> + <string name="day_of_week_short_tuesday">mar</string> + <string name="day_of_week_short_wednesday">mer</string> + <string name="day_of_week_short_thursday">gio</string> + <string name="day_of_week_short_friday">ven</string> + <string name="day_of_week_short_saturday">sab</string> + + <string name="day_of_week_shortest_sunday">D</string> + <string name="day_of_week_shortest_monday">L</string> + <string name="day_of_week_shortest_tuesday">M</string> + <string name="day_of_week_shortest_wednesday">M</string> + <string name="day_of_week_shortest_thursday">G</string> + <string name="day_of_week_shortest_friday">V</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">m.</string> + <string name="pm">p.</string> + <string name="yesterday">ieri</string> + <string name="today">oggi</string> + <string name="tomorrow">domani</string> + + <string name="hour_minute_ampm">%H.%M</string> + <string name="hour_minute_cap_ampm">%H.%M</string> + <string name="numeric_date">%d/%m/%Y</string> + <string name="numeric_date_format">dd/MM/yyyy</string> + <string name="month_day_year">%d %B %Y</string> + <string name="time_of_day">%H.%M.%S</string> + <string name="date_and_time">%H.%M.%S %d/%b/%Y</string> + <string name="abbrev_month_day_year">%d/%b/%Y</string> + <string name="month_day">%-e %B</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%-e %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index f80a4f4..cb040f2 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -418,9 +418,6 @@ <string name="lockscreen_glogin_password_hint">"Password"</string> <string name="lockscreen_glogin_submit_button">"Accedi"</string> <string name="lockscreen_glogin_invalid_input">"Password o nome utente non valido."</string> - <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string> - <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string> - <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string> <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string> <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string> <string name="status_bar_clear_all_button">"Cancella notifiche"</string> @@ -452,9 +449,6 @@ <string name="menu_enter_shortcut_label">"Invio"</string> <string name="menu_delete_shortcut_label">"Canc"</string> <string name="search_go">"Cerca"</string> - <string name="today">"Oggi"</string> - <string name="yesterday">"Ieri"</string> - <string name="tomorrow">"Domani"</string> <string name="oneMonthDurationPast">"1 mese fa"</string> <string name="beforeOneMonthDurationPast">"Oltre 1 mese fa"</string> <plurals name="num_seconds_ago"> @@ -536,13 +530,6 @@ <string name="weeks">"settimane"</string> <string name="year">"anno"</string> <string name="years">"anni"</string> - <string name="sunday">"Domenica"</string> - <string name="monday">"Lunedì"</string> - <string name="tuesday">"Martedì"</string> - <string name="wednesday">"Mercoledì"</string> - <string name="thursday">"Giovedì"</string> - <string name="friday">"Venerdì"</string> - <string name="saturday">"Sabato"</string> <string name="every_weekday">"Ogni giorno feriale (lun-ven)"</string> <string name="daily">"Quotidianamente"</string> <string name="weekly">"Ogni settimana il <xliff:g id="DAY">%s</xliff:g>"</string> @@ -552,9 +539,6 @@ <string name="VideoView_error_text_invalid_progressive_playback">"Spiacenti, questo video non è valido per lo streaming su questo dispositivo."</string> <string name="VideoView_error_text_unknown">"Spiacenti. Impossibile riprodurre il video."</string> <string name="VideoView_error_button">"OK"</string> - <string name="am">"AM"</string> - <string name="pm">"PM"</string> - <string name="numeric_date">"<xliff:g id="DAY">%d</xliff:g>/<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="YEAR">%Y</xliff:g>"</string> <string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string> <string name="wday1_date1_wday2_date2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>"</string> <string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string> @@ -566,23 +550,12 @@ <string name="date_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="time_wday">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>"</string> - <string name="full_date_month_first" format="date">"<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="DAY">d</xliff:g>', '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="full_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="medium_date_month_first" format="date">"<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="DAY">d</xliff:g>', '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="medium_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="twelve_hour_time_format" format="date">"<xliff:g id="HOUR">h</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>' '<xliff:g id="AMPM">a</xliff:g>"</string> - <string name="twenty_four_hour_time_format" format="date">"<xliff:g id="HOUR">HH</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>"</string> <string name="noon">"mezzogiorno"</string> <string name="Noon">"Mezzogiorno"</string> <string name="midnight">"mezzanotte"</string> <string name="Midnight">"Mezzanotte"</string> - <string name="month_day">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g>"</string> <!-- no translation found for month (7026169712234774086) --> <skip /> - <string name="month_day_year">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>, <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="month_year">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string> - <string name="date_and_time">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g> <xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g>, <xliff:g id="YEAR">%Y</xliff:g>"</string> <string name="same_year_md1_md2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>"</string> <string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>"</string> <string name="same_year_mdy1_mdy2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="YEAR">%9$s</xliff:g>"</string> @@ -607,82 +580,8 @@ <string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string> <string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string> <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string> - <string name="abbrev_month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%b</xliff:g>, <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="abbrev_month_year">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="abbrev_month_day">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%b</xliff:g>"</string> <!-- no translation found for abbrev_month (3131032032850777433) --> <skip /> - <string name="day_of_week_long_sunday">"Domenica"</string> - <string name="day_of_week_long_monday">"Lunedì"</string> - <string name="day_of_week_long_tuesday">"Martedì"</string> - <string name="day_of_week_long_wednesday">"Mercoledì"</string> - <string name="day_of_week_long_thursday">"Giovedì"</string> - <string name="day_of_week_long_friday">"Venerdì"</string> - <string name="day_of_week_long_saturday">"Sabato"</string> - <string name="day_of_week_medium_sunday">"Dom"</string> - <string name="day_of_week_medium_monday">"Lun"</string> - <string name="day_of_week_medium_tuesday">"Mar"</string> - <string name="day_of_week_medium_wednesday">"Mer"</string> - <string name="day_of_week_medium_thursday">"Gio"</string> - <string name="day_of_week_medium_friday">"Ven"</string> - <string name="day_of_week_medium_saturday">"Sab"</string> - <string name="day_of_week_short_sunday">"Do"</string> - <string name="day_of_week_short_monday">"Lu"</string> - <string name="day_of_week_short_tuesday">"Ma"</string> - <string name="day_of_week_short_wednesday">"Me"</string> - <string name="day_of_week_short_thursday">"Gi"</string> - <string name="day_of_week_short_friday">"Ve"</string> - <string name="day_of_week_short_saturday">"Sa"</string> - <string name="day_of_week_shorter_sunday">"Do"</string> - <string name="day_of_week_shorter_monday">"Lu"</string> - <string name="day_of_week_shorter_tuesday">"Ma"</string> - <string name="day_of_week_shorter_wednesday">"Me"</string> - <string name="day_of_week_shorter_thursday">"Gi"</string> - <string name="day_of_week_shorter_friday">"V"</string> - <string name="day_of_week_shorter_saturday">"Sa"</string> - <string name="day_of_week_shortest_sunday">"D"</string> - <string name="day_of_week_shortest_monday">"Lun"</string> - <string name="day_of_week_shortest_tuesday">"M"</string> - <string name="day_of_week_shortest_wednesday">"Me"</string> - <string name="day_of_week_shortest_thursday">"G"</string> - <string name="day_of_week_shortest_friday">"V"</string> - <string name="day_of_week_shortest_saturday">"Sa"</string> - <string name="month_long_january">"Gennaio"</string> - <string name="month_long_february">"Febbraio"</string> - <string name="month_long_march">"Marzo"</string> - <string name="month_long_april">"Aprile"</string> - <string name="month_long_may">"Maggio"</string> - <string name="month_long_june">"Giugno"</string> - <string name="month_long_july">"Luglio"</string> - <string name="month_long_august">"Agosto"</string> - <string name="month_long_september">"Settembre"</string> - <string name="month_long_october">"Ottobre"</string> - <string name="month_long_november">"Novembre"</string> - <string name="month_long_december">"Dicembre"</string> - <string name="month_medium_january">"Gen"</string> - <string name="month_medium_february">"Feb"</string> - <string name="month_medium_march">"Mar"</string> - <string name="month_medium_april">"Apr"</string> - <string name="month_medium_may">"Mag"</string> - <string name="month_medium_june">"Giu"</string> - <string name="month_medium_july">"Lug"</string> - <string name="month_medium_august">"Ago"</string> - <string name="month_medium_september">"Set"</string> - <string name="month_medium_october">"Ott"</string> - <string name="month_medium_november">"Nov"</string> - <string name="month_medium_december">"Dic"</string> - <string name="month_shortest_january">"G"</string> - <string name="month_shortest_february">"F"</string> - <string name="month_shortest_march">"M"</string> - <string name="month_shortest_april">"Ap"</string> - <string name="month_shortest_may">"Mag"</string> - <string name="month_shortest_june">"Gi"</string> - <string name="month_shortest_july">"Lug"</string> - <string name="month_shortest_august">"Ago"</string> - <string name="month_shortest_september">"Set"</string> - <string name="month_shortest_october">"O"</string> - <string name="month_shortest_november">"N"</string> - <string name="month_shortest_december">"Di"</string> <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string> <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string> <string name="selectAll">"Seleziona tutto"</string> diff --git a/core/res/res/values-ja-rJP/donottranslate-cldr.xml b/core/res/res/values-ja-rJP/donottranslate-cldr.xml new file mode 100644 index 0000000..b8e94fc --- /dev/null +++ b/core/res/res/values-ja-rJP/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">1月</string> + <string name="month_long_standalone_february">2月</string> + <string name="month_long_standalone_march">3月</string> + <string name="month_long_standalone_april">4月</string> + <string name="month_long_standalone_may">5月</string> + <string name="month_long_standalone_june">6月</string> + <string name="month_long_standalone_july">7月</string> + <string name="month_long_standalone_august">8月</string> + <string name="month_long_standalone_september">9月</string> + <string name="month_long_standalone_october">10月</string> + <string name="month_long_standalone_november">11月</string> + <string name="month_long_standalone_december">12月</string> + + <string name="month_long_january">1月</string> + <string name="month_long_february">2月</string> + <string name="month_long_march">3月</string> + <string name="month_long_april">4月</string> + <string name="month_long_may">5月</string> + <string name="month_long_june">6月</string> + <string name="month_long_july">7月</string> + <string name="month_long_august">8月</string> + <string name="month_long_september">9月</string> + <string name="month_long_october">10月</string> + <string name="month_long_november">11月</string> + <string name="month_long_december">12月</string> + + <string name="month_medium_january">1月</string> + <string name="month_medium_february">2月</string> + <string name="month_medium_march">3月</string> + <string name="month_medium_april">4月</string> + <string name="month_medium_may">5月</string> + <string name="month_medium_june">6月</string> + <string name="month_medium_july">7月</string> + <string name="month_medium_august">8月</string> + <string name="month_medium_september">9月</string> + <string name="month_medium_october">10月</string> + <string name="month_medium_november">11月</string> + <string name="month_medium_december">12月</string> + + <string name="month_shortest_january">1</string> + <string name="month_shortest_february">2</string> + <string name="month_shortest_march">3</string> + <string name="month_shortest_april">4</string> + <string name="month_shortest_may">5</string> + <string name="month_shortest_june">6</string> + <string name="month_shortest_july">7</string> + <string name="month_shortest_august">8</string> + <string name="month_shortest_september">9</string> + <string name="month_shortest_october">10</string> + <string name="month_shortest_november">11</string> + <string name="month_shortest_december">12</string> + + <string name="day_of_week_long_sunday">日曜日</string> + <string name="day_of_week_long_monday">月曜日</string> + <string name="day_of_week_long_tuesday">火曜日</string> + <string name="day_of_week_long_wednesday">水曜日</string> + <string name="day_of_week_long_thursday">木曜日</string> + <string name="day_of_week_long_friday">金曜日</string> + <string name="day_of_week_long_saturday">土曜日</string> + + <string name="day_of_week_medium_sunday">日</string> + <string name="day_of_week_medium_monday">月</string> + <string name="day_of_week_medium_tuesday">火</string> + <string name="day_of_week_medium_wednesday">水</string> + <string name="day_of_week_medium_thursday">木</string> + <string name="day_of_week_medium_friday">金</string> + <string name="day_of_week_medium_saturday">土</string> + + <string name="day_of_week_short_sunday">日</string> + <string name="day_of_week_short_monday">月</string> + <string name="day_of_week_short_tuesday">火</string> + <string name="day_of_week_short_wednesday">水</string> + <string name="day_of_week_short_thursday">木</string> + <string name="day_of_week_short_friday">金</string> + <string name="day_of_week_short_saturday">土</string> + + <string name="day_of_week_shortest_sunday">日</string> + <string name="day_of_week_shortest_monday">月</string> + <string name="day_of_week_shortest_tuesday">火</string> + <string name="day_of_week_shortest_wednesday">水</string> + <string name="day_of_week_shortest_thursday">木</string> + <string name="day_of_week_shortest_friday">金</string> + <string name="day_of_week_shortest_saturday">土</string> + + <string name="am">午前</string> + <string name="pm">午後</string> + <string name="yesterday">昨日</string> + <string name="today">今日</string> + <string name="tomorrow">明日</string> + + <string name="hour_minute_ampm">%-k:%M</string> + <string name="hour_minute_cap_ampm">%-k:%M</string> + <string name="numeric_date">%Y/%m/%d</string> + <string name="numeric_date_format">yyyy/MM/dd</string> + <string name="month_day_year">%Y年%-m月%-e日</string> + <string name="time_of_day">%-k:%M:%S</string> + <string name="date_and_time">%-k:%M:%S %Y/%m/%d</string> + <string name="abbrev_month_day_year">%Y/%m/%d</string> + <string name="month_day">%-m月%-e日</string> + <string name="month">%-B</string> + <string name="month_year">%Y年%-m月</string> + <string name="abbrev_month_day">%-m月%-e日</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%Y年%-m月</string> +</resources> diff --git a/core/res/res/values-ja/donottranslate-cldr.xml b/core/res/res/values-ja/donottranslate-cldr.xml new file mode 100644 index 0000000..b8e94fc --- /dev/null +++ b/core/res/res/values-ja/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">1月</string> + <string name="month_long_standalone_february">2月</string> + <string name="month_long_standalone_march">3月</string> + <string name="month_long_standalone_april">4月</string> + <string name="month_long_standalone_may">5月</string> + <string name="month_long_standalone_june">6月</string> + <string name="month_long_standalone_july">7月</string> + <string name="month_long_standalone_august">8月</string> + <string name="month_long_standalone_september">9月</string> + <string name="month_long_standalone_october">10月</string> + <string name="month_long_standalone_november">11月</string> + <string name="month_long_standalone_december">12月</string> + + <string name="month_long_january">1月</string> + <string name="month_long_february">2月</string> + <string name="month_long_march">3月</string> + <string name="month_long_april">4月</string> + <string name="month_long_may">5月</string> + <string name="month_long_june">6月</string> + <string name="month_long_july">7月</string> + <string name="month_long_august">8月</string> + <string name="month_long_september">9月</string> + <string name="month_long_october">10月</string> + <string name="month_long_november">11月</string> + <string name="month_long_december">12月</string> + + <string name="month_medium_january">1月</string> + <string name="month_medium_february">2月</string> + <string name="month_medium_march">3月</string> + <string name="month_medium_april">4月</string> + <string name="month_medium_may">5月</string> + <string name="month_medium_june">6月</string> + <string name="month_medium_july">7月</string> + <string name="month_medium_august">8月</string> + <string name="month_medium_september">9月</string> + <string name="month_medium_october">10月</string> + <string name="month_medium_november">11月</string> + <string name="month_medium_december">12月</string> + + <string name="month_shortest_january">1</string> + <string name="month_shortest_february">2</string> + <string name="month_shortest_march">3</string> + <string name="month_shortest_april">4</string> + <string name="month_shortest_may">5</string> + <string name="month_shortest_june">6</string> + <string name="month_shortest_july">7</string> + <string name="month_shortest_august">8</string> + <string name="month_shortest_september">9</string> + <string name="month_shortest_october">10</string> + <string name="month_shortest_november">11</string> + <string name="month_shortest_december">12</string> + + <string name="day_of_week_long_sunday">日曜日</string> + <string name="day_of_week_long_monday">月曜日</string> + <string name="day_of_week_long_tuesday">火曜日</string> + <string name="day_of_week_long_wednesday">水曜日</string> + <string name="day_of_week_long_thursday">木曜日</string> + <string name="day_of_week_long_friday">金曜日</string> + <string name="day_of_week_long_saturday">土曜日</string> + + <string name="day_of_week_medium_sunday">日</string> + <string name="day_of_week_medium_monday">月</string> + <string name="day_of_week_medium_tuesday">火</string> + <string name="day_of_week_medium_wednesday">水</string> + <string name="day_of_week_medium_thursday">木</string> + <string name="day_of_week_medium_friday">金</string> + <string name="day_of_week_medium_saturday">土</string> + + <string name="day_of_week_short_sunday">日</string> + <string name="day_of_week_short_monday">月</string> + <string name="day_of_week_short_tuesday">火</string> + <string name="day_of_week_short_wednesday">水</string> + <string name="day_of_week_short_thursday">木</string> + <string name="day_of_week_short_friday">金</string> + <string name="day_of_week_short_saturday">土</string> + + <string name="day_of_week_shortest_sunday">日</string> + <string name="day_of_week_shortest_monday">月</string> + <string name="day_of_week_shortest_tuesday">火</string> + <string name="day_of_week_shortest_wednesday">水</string> + <string name="day_of_week_shortest_thursday">木</string> + <string name="day_of_week_shortest_friday">金</string> + <string name="day_of_week_shortest_saturday">土</string> + + <string name="am">午前</string> + <string name="pm">午後</string> + <string name="yesterday">昨日</string> + <string name="today">今日</string> + <string name="tomorrow">明日</string> + + <string name="hour_minute_ampm">%-k:%M</string> + <string name="hour_minute_cap_ampm">%-k:%M</string> + <string name="numeric_date">%Y/%m/%d</string> + <string name="numeric_date_format">yyyy/MM/dd</string> + <string name="month_day_year">%Y年%-m月%-e日</string> + <string name="time_of_day">%-k:%M:%S</string> + <string name="date_and_time">%-k:%M:%S %Y/%m/%d</string> + <string name="abbrev_month_day_year">%Y/%m/%d</string> + <string name="month_day">%-m月%-e日</string> + <string name="month">%-B</string> + <string name="month_year">%Y年%-m月</string> + <string name="abbrev_month_day">%-m月%-e日</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%Y年%-m月</string> +</resources> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 8da040e..877ecbd 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -418,9 +418,6 @@ <string name="lockscreen_glogin_password_hint">"パスワード"</string> <string name="lockscreen_glogin_submit_button">"ログイン"</string> <string name="lockscreen_glogin_invalid_input">"ユーザー名またはパスワードが正しくありません。"</string> - <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string> - <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string> - <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string> <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string> <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string> <string name="status_bar_clear_all_button">"通知を消去"</string> @@ -452,9 +449,6 @@ <string name="menu_enter_shortcut_label">"Enter"</string> <string name="menu_delete_shortcut_label">"Del"</string> <string name="search_go">"検索"</string> - <string name="today">"今日"</string> - <string name="yesterday">"昨日"</string> - <string name="tomorrow">"明日"</string> <string name="oneMonthDurationPast">"1か月前"</string> <string name="beforeOneMonthDurationPast">"1か月前"</string> <plurals name="num_seconds_ago"> @@ -536,13 +530,6 @@ <string name="weeks">"週間"</string> <string name="year">"年"</string> <string name="years">"年"</string> - <string name="sunday">"日曜日"</string> - <string name="monday">"月曜日"</string> - <string name="tuesday">"火曜日"</string> - <string name="wednesday">"水曜日"</string> - <string name="thursday">"木曜日"</string> - <string name="friday">"金曜日"</string> - <string name="saturday">"土曜日"</string> <string name="every_weekday">"平日(月~金)"</string> <string name="daily">"毎日"</string> <string name="weekly">"毎週<xliff:g id="DAY">%s</xliff:g>"</string> @@ -552,9 +539,6 @@ <string name="VideoView_error_text_invalid_progressive_playback">"この動画はご使用の端末でストリーミングできません。"</string> <string name="VideoView_error_text_unknown">"この動画は再生できません。"</string> <string name="VideoView_error_button">"OK"</string> - <string name="am">"AM"</string> - <string name="pm">"PM"</string> - <string name="numeric_date">"<xliff:g id="YEAR">%Y</xliff:g>/<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="DAY">%d</xliff:g>"</string> <string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g><xliff:g id="WEEKDAY1">%1$s</xliff:g><xliff:g id="TIME1">%3$s</xliff:g>~<xliff:g id="DATE2">%5$s</xliff:g><xliff:g id="WEEKDAY2">%4$s</xliff:g><xliff:g id="TIME2">%6$s</xliff:g>"</string> <string name="wday1_date1_wday2_date2">"<xliff:g id="DATE1">%2$s</xliff:g><xliff:g id="WEEKDAY1">%1$s</xliff:g>~<xliff:g id="DATE2">%5$s</xliff:g><xliff:g id="WEEKDAY2">%4$s</xliff:g>"</string> <string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g> <xliff:g id="TIME1">%3$s</xliff:g>~<xliff:g id="DATE2">%5$s</xliff:g> <xliff:g id="TIME2">%6$s</xliff:g>"</string> @@ -566,23 +550,12 @@ <string name="date_time">"<xliff:g id="DATE">%1$s</xliff:g> <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g> <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="time_wday">"<xliff:g id="WEEKDAY">%2$s</xliff:g>、<xliff:g id="TIME_RANGE">%1$s</xliff:g>"</string> - <string name="full_date_month_first" format="date">"<xliff:g id="MONTH">MMMM</xliff:g><xliff:g id="DAY">d</xliff:g>'日 '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="full_date_day_first" format="date">"<xliff:g id="YEAR">yyyy</xliff:g>'年'<xliff:g id="MONTH">MMMM</xliff:g>'月'<xliff:g id="DAY">d</xliff:g>'日'"</string> - <string name="medium_date_month_first" format="date">"<xliff:g id="MONTH">MMM</xliff:g>'/'<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>'年'"</string> - <string name="medium_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>'/'<xliff:g id="MONTH">MMM</xliff:g>'/'<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="twelve_hour_time_format" format="date">"<xliff:g id="HOUR">h</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>' '<xliff:g id="AMPM">a</xliff:g>"</string> - <string name="twenty_four_hour_time_format" format="date">"<xliff:g id="HOUR">HH</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>"</string> <string name="noon">"正午"</string> <string name="Noon">"正午"</string> <string name="midnight">"午前0時"</string> <string name="Midnight">"午前0時"</string> - <string name="month_day">"<xliff:g id="MONTH">%B</xliff:g><xliff:g id="DAY">%-d</xliff:g>日"</string> <!-- no translation found for month (7026169712234774086) --> <skip /> - <string name="month_day_year">"<xliff:g id="YEAR">%Y</xliff:g>年<xliff:g id="MONTH">%B</xliff:g><xliff:g id="DAY">%-d</xliff:g>日"</string> - <string name="month_year">"<xliff:g id="YEAR">%Y</xliff:g>年<xliff:g id="MONTH">%B</xliff:g>"</string> - <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string> - <string name="date_and_time">"<xliff:g id="YEAR">%Y</xliff:g>/<xliff:g id="MONTH">%B</xliff:g>/<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string> <string name="same_year_md1_md2">"<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1">%3$s</xliff:g>~<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2">%8$s</xliff:g>"</string> <string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1_0">%3$s</xliff:g><xliff:g id="WEEKDAY1">%1$s</xliff:g>~<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2_1">%8$s</xliff:g><xliff:g id="WEEKDAY2">%6$s</xliff:g>"</string> <string name="same_year_mdy1_mdy2">"<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1">%3$s</xliff:g>~<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="YEAR">%9$s</xliff:g>"</string> @@ -607,82 +580,8 @@ <string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1_0">%3$s</xliff:g><xliff:g id="WEEKDAY1">%1$s</xliff:g><xliff:g id="TIME1">%5$s</xliff:g>~<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2_1">%8$s</xliff:g><xliff:g id="WEEKDAY2">%6$s</xliff:g><xliff:g id="TIME2">%10$s</xliff:g>"</string> <string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="YEAR1">%4$s</xliff:g>/<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1">%3$s</xliff:g><xliff:g id="TIME1">%5$s</xliff:g>~<xliff:g id="YEAR2">%9$s</xliff:g>/<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2">%8$s</xliff:g><xliff:g id="TIME2">%10$s</xliff:g>"</string> <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="YEAR1">%4$s</xliff:g>/<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1_0">%3$s</xliff:g><xliff:g id="WEEKDAY1">%1$s</xliff:g><xliff:g id="TIME1">%5$s</xliff:g>~<xliff:g id="YEAR2">%9$s</xliff:g>/<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2_1">%8$s</xliff:g><xliff:g id="WEEKDAY2">%6$s</xliff:g><xliff:g id="TIME2">%10$s</xliff:g>"</string> - <string name="abbrev_month_day_year">"<xliff:g id="YEAR">%Y</xliff:g>/<xliff:g id="MONTH">%b</xliff:g>/<xliff:g id="DAY">%-d</xliff:g>"</string> - <string name="abbrev_month_year">"<xliff:g id="YEAR">%Y</xliff:g>年<xliff:g id="MONTH">%b</xliff:g>月"</string> - <string name="abbrev_month_day">"<xliff:g id="MONTH">%b</xliff:g>/<xliff:g id="DAY">%-d</xliff:g>"</string> <!-- no translation found for abbrev_month (3131032032850777433) --> <skip /> - <string name="day_of_week_long_sunday">"日曜日"</string> - <string name="day_of_week_long_monday">"月曜日"</string> - <string name="day_of_week_long_tuesday">"火曜日"</string> - <string name="day_of_week_long_wednesday">"水曜日"</string> - <string name="day_of_week_long_thursday">"木曜日"</string> - <string name="day_of_week_long_friday">"金曜日"</string> - <string name="day_of_week_long_saturday">"土曜日"</string> - <string name="day_of_week_medium_sunday">"(日)"</string> - <string name="day_of_week_medium_monday">"(月)"</string> - <string name="day_of_week_medium_tuesday">"(火)"</string> - <string name="day_of_week_medium_wednesday">"(水)"</string> - <string name="day_of_week_medium_thursday">"(木)"</string> - <string name="day_of_week_medium_friday">"(金)"</string> - <string name="day_of_week_medium_saturday">"(土)"</string> - <string name="day_of_week_short_sunday">"日"</string> - <string name="day_of_week_short_monday">"月"</string> - <string name="day_of_week_short_tuesday">"火"</string> - <string name="day_of_week_short_wednesday">"水"</string> - <string name="day_of_week_short_thursday">"木"</string> - <string name="day_of_week_short_friday">"金"</string> - <string name="day_of_week_short_saturday">"土"</string> - <string name="day_of_week_shorter_sunday">"日"</string> - <string name="day_of_week_shorter_monday">"月"</string> - <string name="day_of_week_shorter_tuesday">"火"</string> - <string name="day_of_week_shorter_wednesday">"水"</string> - <string name="day_of_week_shorter_thursday">"木"</string> - <string name="day_of_week_shorter_friday">"金"</string> - <string name="day_of_week_shorter_saturday">"土"</string> - <string name="day_of_week_shortest_sunday">"日"</string> - <string name="day_of_week_shortest_monday">"月"</string> - <string name="day_of_week_shortest_tuesday">"火"</string> - <string name="day_of_week_shortest_wednesday">"水"</string> - <string name="day_of_week_shortest_thursday">"火"</string> - <string name="day_of_week_shortest_friday">"金"</string> - <string name="day_of_week_shortest_saturday">"土"</string> - <string name="month_long_january">"1月"</string> - <string name="month_long_february">"2月"</string> - <string name="month_long_march">"3月"</string> - <string name="month_long_april">"4月"</string> - <string name="month_long_may">"5月"</string> - <string name="month_long_june">"6月"</string> - <string name="month_long_july">"7月"</string> - <string name="month_long_august">"8月"</string> - <string name="month_long_september">"9月"</string> - <string name="month_long_october">"10月"</string> - <string name="month_long_november">"11月"</string> - <string name="month_long_december">"12月"</string> - <string name="month_medium_january">"1"</string> - <string name="month_medium_february">"2"</string> - <string name="month_medium_march">"3"</string> - <string name="month_medium_april">"4"</string> - <string name="month_medium_may">"5"</string> - <string name="month_medium_june">"6"</string> - <string name="month_medium_july">"7"</string> - <string name="month_medium_august">"8"</string> - <string name="month_medium_september">"9"</string> - <string name="month_medium_october">"10"</string> - <string name="month_medium_november">"11"</string> - <string name="month_medium_december">"12"</string> - <string name="month_shortest_january">"1"</string> - <string name="month_shortest_february">"2"</string> - <string name="month_shortest_march">"3"</string> - <string name="month_shortest_april">"4"</string> - <string name="month_shortest_may">"5"</string> - <string name="month_shortest_june">"6"</string> - <string name="month_shortest_july">"7"</string> - <string name="month_shortest_august">"8"</string> - <string name="month_shortest_september">"9"</string> - <string name="month_shortest_october">"10"</string> - <string name="month_shortest_november">"11"</string> - <string name="month_shortest_december">"12"</string> <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string> <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string> <string name="selectAll">"すべて選択"</string> diff --git a/core/res/res/values-ko-rKR/donottranslate-cldr.xml b/core/res/res/values-ko-rKR/donottranslate-cldr.xml new file mode 100644 index 0000000..17d9432 --- /dev/null +++ b/core/res/res/values-ko-rKR/donottranslate-cldr.xml @@ -0,0 +1,96 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">1월</string> + <string name="month_long_standalone_february">2월</string> + <string name="month_long_standalone_march">3월</string> + <string name="month_long_standalone_april">4월</string> + <string name="month_long_standalone_may">5월</string> + <string name="month_long_standalone_june">6월</string> + <string name="month_long_standalone_july">7월</string> + <string name="month_long_standalone_august">8월</string> + <string name="month_long_standalone_september">9월</string> + <string name="month_long_standalone_october">10월</string> + <string name="month_long_standalone_november">11월</string> + <string name="month_long_standalone_december">12월</string> + + <string name="month_long_january">1월</string> + <string name="month_long_february">2월</string> + <string name="month_long_march">3월</string> + <string name="month_long_april">4월</string> + <string name="month_long_may">5월</string> + <string name="month_long_june">6월</string> + <string name="month_long_july">7월</string> + <string name="month_long_august">8월</string> + <string name="month_long_september">9월</string> + <string name="month_long_october">10월</string> + <string name="month_long_november">11월</string> + <string name="month_long_december">12월</string> + + + <string name="month_shortest_january">1월</string> + <string name="month_shortest_february">2월</string> + <string name="month_shortest_march">3월</string> + <string name="month_shortest_april">4월</string> + <string name="month_shortest_may">5월</string> + <string name="month_shortest_june">6월</string> + <string name="month_shortest_july">7월</string> + <string name="month_shortest_august">8월</string> + <string name="month_shortest_september">9월</string> + <string name="month_shortest_october">10월</string> + <string name="month_shortest_november">11월</string> + <string name="month_shortest_december">12월</string> + + <string name="day_of_week_long_sunday">일요일</string> + <string name="day_of_week_long_monday">월요일</string> + <string name="day_of_week_long_tuesday">화요일</string> + <string name="day_of_week_long_wednesday">수요일</string> + <string name="day_of_week_long_thursday">목요일</string> + <string name="day_of_week_long_friday">금요일</string> + <string name="day_of_week_long_saturday">토요일</string> + + <string name="day_of_week_medium_sunday">일</string> + <string name="day_of_week_medium_monday">월</string> + <string name="day_of_week_medium_tuesday">화</string> + <string name="day_of_week_medium_wednesday">수</string> + <string name="day_of_week_medium_thursday">목</string> + <string name="day_of_week_medium_friday">금</string> + <string name="day_of_week_medium_saturday">토</string> + + <string name="day_of_week_short_sunday">일</string> + <string name="day_of_week_short_monday">월</string> + <string name="day_of_week_short_tuesday">화</string> + <string name="day_of_week_short_wednesday">수</string> + <string name="day_of_week_short_thursday">목</string> + <string name="day_of_week_short_friday">금</string> + <string name="day_of_week_short_saturday">토</string> + + <string name="day_of_week_shortest_sunday">일</string> + <string name="day_of_week_shortest_monday">월</string> + <string name="day_of_week_shortest_tuesday">화</string> + <string name="day_of_week_shortest_wednesday">수</string> + <string name="day_of_week_shortest_thursday">목</string> + <string name="day_of_week_shortest_friday">금</string> + <string name="day_of_week_shortest_saturday">토</string> + + <string name="am">오전</string> + <string name="pm">오후</string> + <string name="yesterday">어제</string> + <string name="today">오늘</string> + <string name="tomorrow">내일</string> + + <string name="hour_minute_ampm">%p %-l:%M</string> + <string name="hour_minute_cap_ampm">%^p %-l:%M</string> + <string name="numeric_date">%Y. %-m. %-e.</string> + <string name="numeric_date_format">yyyy. M. d.</string> + <string name="month_day_year">%Y년 %-m월 %-e일</string> + <string name="time_of_day">%p %-l:%M:%S</string> + <string name="date_and_time">%p %-l:%M:%S %Y. %-m. %-e.</string> + <string name="abbrev_month_day_year">%Y. %-m. %-e.</string> + <string name="month_day">%B %-e일</string> + <string name="month">%-B</string> + <string name="month_year">%Y년 %B</string> + <string name="abbrev_month_day">%b %-e일</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%Y년 %b</string> +</resources> diff --git a/core/res/res/values-ko/donottranslate-cldr.xml b/core/res/res/values-ko/donottranslate-cldr.xml new file mode 100644 index 0000000..17d9432 --- /dev/null +++ b/core/res/res/values-ko/donottranslate-cldr.xml @@ -0,0 +1,96 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">1월</string> + <string name="month_long_standalone_february">2월</string> + <string name="month_long_standalone_march">3월</string> + <string name="month_long_standalone_april">4월</string> + <string name="month_long_standalone_may">5월</string> + <string name="month_long_standalone_june">6월</string> + <string name="month_long_standalone_july">7월</string> + <string name="month_long_standalone_august">8월</string> + <string name="month_long_standalone_september">9월</string> + <string name="month_long_standalone_october">10월</string> + <string name="month_long_standalone_november">11월</string> + <string name="month_long_standalone_december">12월</string> + + <string name="month_long_january">1월</string> + <string name="month_long_february">2월</string> + <string name="month_long_march">3월</string> + <string name="month_long_april">4월</string> + <string name="month_long_may">5월</string> + <string name="month_long_june">6월</string> + <string name="month_long_july">7월</string> + <string name="month_long_august">8월</string> + <string name="month_long_september">9월</string> + <string name="month_long_october">10월</string> + <string name="month_long_november">11월</string> + <string name="month_long_december">12월</string> + + + <string name="month_shortest_january">1월</string> + <string name="month_shortest_february">2월</string> + <string name="month_shortest_march">3월</string> + <string name="month_shortest_april">4월</string> + <string name="month_shortest_may">5월</string> + <string name="month_shortest_june">6월</string> + <string name="month_shortest_july">7월</string> + <string name="month_shortest_august">8월</string> + <string name="month_shortest_september">9월</string> + <string name="month_shortest_october">10월</string> + <string name="month_shortest_november">11월</string> + <string name="month_shortest_december">12월</string> + + <string name="day_of_week_long_sunday">일요일</string> + <string name="day_of_week_long_monday">월요일</string> + <string name="day_of_week_long_tuesday">화요일</string> + <string name="day_of_week_long_wednesday">수요일</string> + <string name="day_of_week_long_thursday">목요일</string> + <string name="day_of_week_long_friday">금요일</string> + <string name="day_of_week_long_saturday">토요일</string> + + <string name="day_of_week_medium_sunday">일</string> + <string name="day_of_week_medium_monday">월</string> + <string name="day_of_week_medium_tuesday">화</string> + <string name="day_of_week_medium_wednesday">수</string> + <string name="day_of_week_medium_thursday">목</string> + <string name="day_of_week_medium_friday">금</string> + <string name="day_of_week_medium_saturday">토</string> + + <string name="day_of_week_short_sunday">일</string> + <string name="day_of_week_short_monday">월</string> + <string name="day_of_week_short_tuesday">화</string> + <string name="day_of_week_short_wednesday">수</string> + <string name="day_of_week_short_thursday">목</string> + <string name="day_of_week_short_friday">금</string> + <string name="day_of_week_short_saturday">토</string> + + <string name="day_of_week_shortest_sunday">일</string> + <string name="day_of_week_shortest_monday">월</string> + <string name="day_of_week_shortest_tuesday">화</string> + <string name="day_of_week_shortest_wednesday">수</string> + <string name="day_of_week_shortest_thursday">목</string> + <string name="day_of_week_shortest_friday">금</string> + <string name="day_of_week_shortest_saturday">토</string> + + <string name="am">오전</string> + <string name="pm">오후</string> + <string name="yesterday">어제</string> + <string name="today">오늘</string> + <string name="tomorrow">내일</string> + + <string name="hour_minute_ampm">%p %-l:%M</string> + <string name="hour_minute_cap_ampm">%^p %-l:%M</string> + <string name="numeric_date">%Y. %-m. %-e.</string> + <string name="numeric_date_format">yyyy. M. d.</string> + <string name="month_day_year">%Y년 %-m월 %-e일</string> + <string name="time_of_day">%p %-l:%M:%S</string> + <string name="date_and_time">%p %-l:%M:%S %Y. %-m. %-e.</string> + <string name="abbrev_month_day_year">%Y. %-m. %-e.</string> + <string name="month_day">%B %-e일</string> + <string name="month">%-B</string> + <string name="month_year">%Y년 %B</string> + <string name="abbrev_month_day">%b %-e일</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%Y년 %b</string> +</resources> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 96b897a..06b85e8 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -418,9 +418,6 @@ <string name="lockscreen_glogin_password_hint">"비밀번호"</string> <string name="lockscreen_glogin_submit_button">"로그인"</string> <string name="lockscreen_glogin_invalid_input">"사용자 이름 또는 비밀번호가 잘못되었습니다."</string> - <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string> - <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string> - <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string> <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string> <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string> <string name="status_bar_clear_all_button">"알림 지우기"</string> @@ -452,9 +449,6 @@ <string name="menu_enter_shortcut_label">"입력"</string> <string name="menu_delete_shortcut_label">"삭제"</string> <string name="search_go">"검색"</string> - <string name="today">"오늘"</string> - <string name="yesterday">"어제"</string> - <string name="tomorrow">"내일"</string> <string name="oneMonthDurationPast">"한 달 전"</string> <string name="beforeOneMonthDurationPast">"한 달 전"</string> <plurals name="num_seconds_ago"> @@ -536,13 +530,6 @@ <string name="weeks">"주"</string> <string name="year">"년"</string> <string name="years">"년"</string> - <string name="sunday">"일요일"</string> - <string name="monday">"월요일"</string> - <string name="tuesday">"화요일"</string> - <string name="wednesday">"수요일"</string> - <string name="thursday">"목요일"</string> - <string name="friday">"금요일"</string> - <string name="saturday">"토요일"</string> <string name="every_weekday">"주중 매일(월-금)"</string> <string name="daily">"매일"</string> <string name="weekly">"매주 <xliff:g id="DAY">%s</xliff:g>"</string> @@ -552,9 +539,6 @@ <string name="VideoView_error_text_invalid_progressive_playback">"죄송합니다. 이 기기로의 스트리밍에 적합하지 않은 동영상입니다."</string> <string name="VideoView_error_text_unknown">"죄송합니다. 동영상을 재생할 수 없습니다."</string> <string name="VideoView_error_button">"확인"</string> - <string name="am">"AM"</string> - <string name="pm">"PM"</string> - <string name="numeric_date">"<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="DAY">%d</xliff:g>/<xliff:g id="YEAR">%Y</xliff:g>"</string> <string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string> <string name="wday1_date1_wday2_date2">"<xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="WEEKDAY1">%1$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="WEEKDAY2">%4$s</xliff:g>"</string> <string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string> @@ -566,23 +550,12 @@ <string name="date_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="time_wday">"<xliff:g id="WEEKDAY">%2$s</xliff:g>, <xliff:g id="TIME_RANGE">%1$s</xliff:g>"</string> - <string name="full_date_month_first" format="date">"<xliff:g id="YEAR">yyyy</xliff:g>' '<xliff:g id="MONTH">MMMM</xliff:g>', '<xliff:g id="DAY">d</xliff:g>"</string> - <string name="full_date_day_first" format="date">"<xliff:g id="YEAR">yyyy</xliff:g>' '<xliff:g id="MONTH">MMMM</xliff:g>', '<xliff:g id="DAY">d</xliff:g>"</string> - <string name="medium_date_month_first" format="date">"<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="DAY">d</xliff:g>', '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="medium_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMM</xliff:g>', '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="twelve_hour_time_format" format="date">"<xliff:g id="HOUR">h</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>' '<xliff:g id="AMPM">a</xliff:g>"</string> - <string name="twenty_four_hour_time_format" format="date">"<xliff:g id="HOUR">HH</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>"</string> <string name="noon">"정오"</string> <string name="Noon">"정오"</string> <string name="midnight">"자정"</string> <string name="Midnight">"자정"</string> - <string name="month_day">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>"</string> <!-- no translation found for month (7026169712234774086) --> <skip /> - <string name="month_day_year">"<xliff:g id="YEAR">%Y</xliff:g>, <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>"</string> - <string name="month_year">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string> - <string name="date_and_time">"<xliff:g id="YEAR">%Y</xliff:g>, <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>, <xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string> <string name="same_year_md1_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>"</string> <string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="WEEKDAY1">%1$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="WEEKDAY2">%6$s</xliff:g>"</string> <string name="same_year_mdy1_mdy2">"<xliff:g id="YEAR">%9$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>"</string> @@ -607,82 +580,8 @@ <string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string> <string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string> <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string> - <string name="abbrev_month_day_year">"<xliff:g id="YEAR">%Y</xliff:g> <xliff:g id="MONTH">%b</xliff:g>, <xliff:g id="DAY">%-d</xliff:g>"</string> - <string name="abbrev_month_year">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="abbrev_month_day">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="DAY">%-d</xliff:g>"</string> <!-- no translation found for abbrev_month (3131032032850777433) --> <skip /> - <string name="day_of_week_long_sunday">"일요일"</string> - <string name="day_of_week_long_monday">"월요일"</string> - <string name="day_of_week_long_tuesday">"화요일"</string> - <string name="day_of_week_long_wednesday">"수요일"</string> - <string name="day_of_week_long_thursday">"목요일"</string> - <string name="day_of_week_long_friday">"금요일"</string> - <string name="day_of_week_long_saturday">"토요일"</string> - <string name="day_of_week_medium_sunday">"일요일"</string> - <string name="day_of_week_medium_monday">"월"</string> - <string name="day_of_week_medium_tuesday">"화"</string> - <string name="day_of_week_medium_wednesday">"수"</string> - <string name="day_of_week_medium_thursday">"목"</string> - <string name="day_of_week_medium_friday">"금"</string> - <string name="day_of_week_medium_saturday">"토"</string> - <string name="day_of_week_short_sunday">"일"</string> - <string name="day_of_week_short_monday">"월"</string> - <string name="day_of_week_short_tuesday">"화"</string> - <string name="day_of_week_short_wednesday">"수"</string> - <string name="day_of_week_short_thursday">"목"</string> - <string name="day_of_week_short_friday">"금"</string> - <string name="day_of_week_short_saturday">"토"</string> - <string name="day_of_week_shorter_sunday">"일"</string> - <string name="day_of_week_shorter_monday">"월"</string> - <string name="day_of_week_shorter_tuesday">"화"</string> - <string name="day_of_week_shorter_wednesday">"수"</string> - <string name="day_of_week_shorter_thursday">"목"</string> - <string name="day_of_week_shorter_friday">"금"</string> - <string name="day_of_week_shorter_saturday">"토"</string> - <string name="day_of_week_shortest_sunday">"일"</string> - <string name="day_of_week_shortest_monday">"3월"</string> - <string name="day_of_week_shortest_tuesday">"목"</string> - <string name="day_of_week_shortest_wednesday">"수"</string> - <string name="day_of_week_shortest_thursday">"목"</string> - <string name="day_of_week_shortest_friday">"금"</string> - <string name="day_of_week_shortest_saturday">"토"</string> - <string name="month_long_january">"1월"</string> - <string name="month_long_february">"2월"</string> - <string name="month_long_march">"3월"</string> - <string name="month_long_april">"4월"</string> - <string name="month_long_may">"5월"</string> - <string name="month_long_june">"6월"</string> - <string name="month_long_july">"7월"</string> - <string name="month_long_august">"8월"</string> - <string name="month_long_september">"9월"</string> - <string name="month_long_october">"10월"</string> - <string name="month_long_november">"11월"</string> - <string name="month_long_december">"12월"</string> - <string name="month_medium_january">"1월"</string> - <string name="month_medium_february">"2월"</string> - <string name="month_medium_march">"3월"</string> - <string name="month_medium_april">"4월"</string> - <string name="month_medium_may">"5월"</string> - <string name="month_medium_june">"6월"</string> - <string name="month_medium_july">"7월"</string> - <string name="month_medium_august">"8월"</string> - <string name="month_medium_september">"9월"</string> - <string name="month_medium_october">"10월"</string> - <string name="month_medium_november">"11월"</string> - <string name="month_medium_december">"12월"</string> - <string name="month_shortest_january">"1월"</string> - <string name="month_shortest_february">"금"</string> - <string name="month_shortest_march">"3월"</string> - <string name="month_shortest_april">"4월"</string> - <string name="month_shortest_may">"5월"</string> - <string name="month_shortest_june">"6월"</string> - <string name="month_shortest_july">"7월"</string> - <string name="month_shortest_august">"8월"</string> - <string name="month_shortest_september">"9월"</string> - <string name="month_shortest_october">"10월"</string> - <string name="month_shortest_november">"11월"</string> - <string name="month_shortest_december">"12월"</string> <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string> <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string> <string name="selectAll">"모두 선택"</string> diff --git a/core/res/res/values-lt-rLT/donottranslate-cldr.xml b/core/res/res/values-lt-rLT/donottranslate-cldr.xml new file mode 100644 index 0000000..629937b --- /dev/null +++ b/core/res/res/values-lt-rLT/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">Sausis</string> + <string name="month_long_standalone_february">Vasaris</string> + <string name="month_long_standalone_march">Kovas</string> + <string name="month_long_standalone_april">Balandis</string> + <string name="month_long_standalone_may">Gegužė</string> + <string name="month_long_standalone_june">Birželis</string> + <string name="month_long_standalone_july">Liepa</string> + <string name="month_long_standalone_august">Rugpjūtis</string> + <string name="month_long_standalone_september">Rugsėjis</string> + <string name="month_long_standalone_october">Spalis</string> + <string name="month_long_standalone_november">Lapkritis</string> + <string name="month_long_standalone_december">Gruodis</string> + + <string name="month_long_january">sausio</string> + <string name="month_long_february">vasario</string> + <string name="month_long_march">kovo</string> + <string name="month_long_april">balandžio</string> + <string name="month_long_may">gegužės</string> + <string name="month_long_june">birželio</string> + <string name="month_long_july">liepos</string> + <string name="month_long_august">rugpjūčio</string> + <string name="month_long_september">rugsėjo</string> + <string name="month_long_october">spalio</string> + <string name="month_long_november">lapkričio</string> + <string name="month_long_december">gruodžio</string> + + <string name="month_medium_january">Sau</string> + <string name="month_medium_february">Vas</string> + <string name="month_medium_march">Kov</string> + <string name="month_medium_april">Bal</string> + <string name="month_medium_may">Geg</string> + <string name="month_medium_june">Bir</string> + <string name="month_medium_july">Lie</string> + <string name="month_medium_august">Rgp</string> + <string name="month_medium_september">Rgs</string> + <string name="month_medium_october">Spl</string> + <string name="month_medium_november">Lap</string> + <string name="month_medium_december">Grd</string> + + <string name="month_shortest_january">S</string> + <string name="month_shortest_february">V</string> + <string name="month_shortest_march">K</string> + <string name="month_shortest_april">B</string> + <string name="month_shortest_may">G</string> + <string name="month_shortest_june">B</string> + <string name="month_shortest_july">L</string> + <string name="month_shortest_august">R</string> + <string name="month_shortest_september">R</string> + <string name="month_shortest_october">S</string> + <string name="month_shortest_november">L</string> + <string name="month_shortest_december">G</string> + + <string name="day_of_week_long_sunday">sekmadienis</string> + <string name="day_of_week_long_monday">pirmadienis</string> + <string name="day_of_week_long_tuesday">antradienis</string> + <string name="day_of_week_long_wednesday">trečiadienis</string> + <string name="day_of_week_long_thursday">ketvirtadienis</string> + <string name="day_of_week_long_friday">penktadienis</string> + <string name="day_of_week_long_saturday">šeštadienis</string> + + <string name="day_of_week_medium_sunday">Sk</string> + <string name="day_of_week_medium_monday">Pr</string> + <string name="day_of_week_medium_tuesday">An</string> + <string name="day_of_week_medium_wednesday">Tr</string> + <string name="day_of_week_medium_thursday">Kt</string> + <string name="day_of_week_medium_friday">Pn</string> + <string name="day_of_week_medium_saturday">Št</string> + + <string name="day_of_week_short_sunday">Sk</string> + <string name="day_of_week_short_monday">Pr</string> + <string name="day_of_week_short_tuesday">An</string> + <string name="day_of_week_short_wednesday">Tr</string> + <string name="day_of_week_short_thursday">Kt</string> + <string name="day_of_week_short_friday">Pn</string> + <string name="day_of_week_short_saturday">Št</string> + + <string name="day_of_week_shortest_sunday">S</string> + <string name="day_of_week_shortest_monday">P</string> + <string name="day_of_week_shortest_tuesday">A</string> + <string name="day_of_week_shortest_wednesday">T</string> + <string name="day_of_week_shortest_thursday">K</string> + <string name="day_of_week_shortest_friday">P</string> + <string name="day_of_week_shortest_saturday">Š</string> + + <string name="am">priešpiet</string> + <string name="pm">popiet</string> + <string name="yesterday">vakar</string> + <string name="today">šiandien</string> + <string name="tomorrow">rytoj</string> + + <string name="hour_minute_ampm">%H:%M</string> + <string name="hour_minute_cap_ampm">%H:%M</string> + <string name="numeric_date">%Y-%m-%d</string> + <string name="numeric_date_format">yyyy-MM-dd</string> + <string name="month_day_year">%Y m. %B %-e d.</string> + <string name="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%H:%M:%S %Y.%m.%d</string> + <string name="abbrev_month_day_year">%Y.%m.%d</string> + <string name="month_day">%B %-e</string> + <string name="month">%-B</string> + <string name="month_year">%Y %B</string> + <string name="abbrev_month_day">%b %-e</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%Y %b</string> +</resources> diff --git a/core/res/res/values-lv-rLV/donottranslate-cldr.xml b/core/res/res/values-lv-rLV/donottranslate-cldr.xml new file mode 100644 index 0000000..d47a18f --- /dev/null +++ b/core/res/res/values-lv-rLV/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">janvāris</string> + <string name="month_long_standalone_february">februāris</string> + <string name="month_long_standalone_march">marts</string> + <string name="month_long_standalone_april">aprīlis</string> + <string name="month_long_standalone_may">maijs</string> + <string name="month_long_standalone_june">jūnijs</string> + <string name="month_long_standalone_july">jūlijs</string> + <string name="month_long_standalone_august">augusts</string> + <string name="month_long_standalone_september">septembris</string> + <string name="month_long_standalone_october">oktobris</string> + <string name="month_long_standalone_november">novembris</string> + <string name="month_long_standalone_december">decembris</string> + + <string name="month_long_january">janvāris</string> + <string name="month_long_february">februāris</string> + <string name="month_long_march">marts</string> + <string name="month_long_april">aprīlis</string> + <string name="month_long_may">maijs</string> + <string name="month_long_june">jūnijs</string> + <string name="month_long_july">jūlijs</string> + <string name="month_long_august">augusts</string> + <string name="month_long_september">septembris</string> + <string name="month_long_october">oktobris</string> + <string name="month_long_november">novembris</string> + <string name="month_long_december">decembris</string> + + <string name="month_medium_january">janv.</string> + <string name="month_medium_february">febr.</string> + <string name="month_medium_march">marts</string> + <string name="month_medium_april">apr.</string> + <string name="month_medium_may">maijs</string> + <string name="month_medium_june">jūn.</string> + <string name="month_medium_july">jūl.</string> + <string name="month_medium_august">aug.</string> + <string name="month_medium_september">sept.</string> + <string name="month_medium_october">okt.</string> + <string name="month_medium_november">nov.</string> + <string name="month_medium_december">dec.</string> + + <string name="month_shortest_january">J</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">svētdiena</string> + <string name="day_of_week_long_monday">pirmdiena</string> + <string name="day_of_week_long_tuesday">otrdiena</string> + <string name="day_of_week_long_wednesday">trešdiena</string> + <string name="day_of_week_long_thursday">ceturtdiena</string> + <string name="day_of_week_long_friday">piektdiena</string> + <string name="day_of_week_long_saturday">sestdiena</string> + + <string name="day_of_week_medium_sunday">Sv</string> + <string name="day_of_week_medium_monday">Pr</string> + <string name="day_of_week_medium_tuesday">Ot</string> + <string name="day_of_week_medium_wednesday">Tr</string> + <string name="day_of_week_medium_thursday">Ce</string> + <string name="day_of_week_medium_friday">Pk</string> + <string name="day_of_week_medium_saturday">Se</string> + + <string name="day_of_week_short_sunday">Sv</string> + <string name="day_of_week_short_monday">Pr</string> + <string name="day_of_week_short_tuesday">Ot</string> + <string name="day_of_week_short_wednesday">Tr</string> + <string name="day_of_week_short_thursday">Ce</string> + <string name="day_of_week_short_friday">Pk</string> + <string name="day_of_week_short_saturday">Se</string> + + <string name="day_of_week_shortest_sunday">S</string> + <string name="day_of_week_shortest_monday">P</string> + <string name="day_of_week_shortest_tuesday">O</string> + <string name="day_of_week_shortest_wednesday">T</string> + <string name="day_of_week_shortest_thursday">C</string> + <string name="day_of_week_shortest_friday">P</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">AM</string> + <string name="pm">PM</string> + <string name="yesterday">vakar</string> + <string name="today">šodien</string> + <string name="tomorrow">rīt</string> + + <string name="hour_minute_ampm">%H:%M</string> + <string name="hour_minute_cap_ampm">%H:%M</string> + <string name="numeric_date">%d.%m.%Y</string> + <string name="numeric_date_format">dd.MM.yyyy</string> + <string name="month_day_year">%Y. gada %-e. %B</string> + <string name="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%H:%M:%S %Y. gada %-e. %b</string> + <string name="abbrev_month_day_year">%Y. gada %-e. %b</string> + <string name="month_day">%-e. %B</string> + <string name="month">%-B</string> + <string name="month_year">%Y. g. %B</string> + <string name="abbrev_month_day">%-e. %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%Y. g. %b</string> +</resources> diff --git a/core/res/res/values-nb/donottranslate-cldr.xml b/core/res/res/values-nb/donottranslate-cldr.xml new file mode 100644 index 0000000..f89e819 --- /dev/null +++ b/core/res/res/values-nb/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">januar</string> + <string name="month_long_standalone_february">februar</string> + <string name="month_long_standalone_march">mars</string> + <string name="month_long_standalone_april">april</string> + <string name="month_long_standalone_may">mai</string> + <string name="month_long_standalone_june">juni</string> + <string name="month_long_standalone_july">juli</string> + <string name="month_long_standalone_august">august</string> + <string name="month_long_standalone_september">september</string> + <string name="month_long_standalone_october">oktober</string> + <string name="month_long_standalone_november">november</string> + <string name="month_long_standalone_december">desember</string> + + <string name="month_long_january">januar</string> + <string name="month_long_february">februar</string> + <string name="month_long_march">mars</string> + <string name="month_long_april">april</string> + <string name="month_long_may">mai</string> + <string name="month_long_june">juni</string> + <string name="month_long_july">juli</string> + <string name="month_long_august">august</string> + <string name="month_long_september">september</string> + <string name="month_long_october">oktober</string> + <string name="month_long_november">november</string> + <string name="month_long_december">desember</string> + + <string name="month_medium_january">jan.</string> + <string name="month_medium_february">feb.</string> + <string name="month_medium_march">mars</string> + <string name="month_medium_april">apr.</string> + <string name="month_medium_may">mai</string> + <string name="month_medium_june">juni</string> + <string name="month_medium_july">juli</string> + <string name="month_medium_august">aug.</string> + <string name="month_medium_september">sep.</string> + <string name="month_medium_october">okt.</string> + <string name="month_medium_november">nov.</string> + <string name="month_medium_december">des.</string> + + <string name="month_shortest_january">J</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">søndag</string> + <string name="day_of_week_long_monday">mandag</string> + <string name="day_of_week_long_tuesday">tirsdag</string> + <string name="day_of_week_long_wednesday">onsdag</string> + <string name="day_of_week_long_thursday">torsdag</string> + <string name="day_of_week_long_friday">fredag</string> + <string name="day_of_week_long_saturday">lørdag</string> + + <string name="day_of_week_medium_sunday">søn.</string> + <string name="day_of_week_medium_monday">man.</string> + <string name="day_of_week_medium_tuesday">tir.</string> + <string name="day_of_week_medium_wednesday">ons.</string> + <string name="day_of_week_medium_thursday">tor.</string> + <string name="day_of_week_medium_friday">fre.</string> + <string name="day_of_week_medium_saturday">lør.</string> + + <string name="day_of_week_short_sunday">søn.</string> + <string name="day_of_week_short_monday">man.</string> + <string name="day_of_week_short_tuesday">tir.</string> + <string name="day_of_week_short_wednesday">ons.</string> + <string name="day_of_week_short_thursday">tor.</string> + <string name="day_of_week_short_friday">fre.</string> + <string name="day_of_week_short_saturday">lør.</string> + + <string name="day_of_week_shortest_sunday">S</string> + <string name="day_of_week_shortest_monday">M</string> + <string name="day_of_week_shortest_tuesday">T</string> + <string name="day_of_week_shortest_wednesday">O</string> + <string name="day_of_week_shortest_thursday">T</string> + <string name="day_of_week_shortest_friday">F</string> + <string name="day_of_week_shortest_saturday">L</string> + + <string name="am">AM</string> + <string name="pm">PM</string> + <string name="yesterday">i går</string> + <string name="today">i dag</string> + <string name="tomorrow">i morgen</string> + + <string name="hour_minute_ampm">%H.%M</string> + <string name="hour_minute_cap_ampm">%H.%M</string> + <string name="numeric_date">%d.%m.%Y</string> + <string name="numeric_date_format">dd.MM.yyyy</string> + <string name="month_day_year">%-e. %B %Y</string> + <string name="time_of_day">%H.%M.%S</string> + <string name="date_and_time">%H.%M.%S %-e. %b %Y</string> + <string name="abbrev_month_day_year">%-e. %b %Y</string> + <string name="month_day">%-e. %B</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%-e. %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 7bed159..a28b12c 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -424,9 +424,6 @@ <string name="lockscreen_glogin_password_hint">"Password"</string> <string name="lockscreen_glogin_submit_button">"Sign in"</string> <string name="lockscreen_glogin_invalid_input">"Invalid username or password."</string> - <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string> - <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string> - <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string> <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string> <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string> <string name="status_bar_clear_all_button">"Fjern varslinger"</string> @@ -458,9 +455,6 @@ <string name="menu_enter_shortcut_label">"enter"</string> <string name="menu_delete_shortcut_label">"slett"</string> <string name="search_go">"Søk"</string> - <string name="today">"I dag"</string> - <string name="yesterday">"I går"</string> - <string name="tomorrow">"I morgen"</string> <string name="oneMonthDurationPast">"For en måned siden"</string> <string name="beforeOneMonthDurationPast">"For over en måned siden"</string> <plurals name="num_seconds_ago"> @@ -542,13 +536,6 @@ <string name="weeks">"uker"</string> <string name="year">"år"</string> <string name="years">"år"</string> - <string name="sunday">"søndag"</string> - <string name="monday">"mandag"</string> - <string name="tuesday">"tirsdag"</string> - <string name="wednesday">"onsdag"</string> - <string name="thursday">"torsdag"</string> - <string name="friday">"fredag"</string> - <string name="saturday">"lørdag"</string> <string name="every_weekday">"Hverdager (man–fre)"</string> <string name="daily">"Hver dag"</string> <string name="weekly">"Hver <xliff:g id="DAY">%s</xliff:g>"</string> @@ -558,9 +545,6 @@ <string name="VideoView_error_text_invalid_progressive_playback">"Beklager, denne videoen er ikke gyldig for streaming til denne enheten."</string> <string name="VideoView_error_text_unknown">"Beklager, kan ikke spille denne videoen."</string> <string name="VideoView_error_button">"OK"</string> - <string name="am">"AM"</string> - <string name="pm">"PM"</string> - <string name="numeric_date">"<xliff:g id="YEAR">%Y</xliff:g>-<xliff:g id="MONTH">%m</xliff:g>-<xliff:g id="DAY">%d</xliff:g>"</string> <string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="DATE1">%2$s</xliff:g> <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g> <xliff:g id="DATE2">%5$s</xliff:g> <xliff:g id="TIME2">%6$s</xliff:g>"</string> <string name="wday1_date1_wday2_date2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g> <xliff:g id="DATE2">%5$s</xliff:g>"</string> <string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g> <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g> <xliff:g id="TIME2">%6$s</xliff:g>"</string> @@ -572,12 +556,6 @@ <string name="date_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="time_wday">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>"</string> - <string name="full_date_month_first" format="date">"<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="DAY">d</xliff:g>'., '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="full_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>'. '<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="medium_date_month_first" format="date">"<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="DAY">d</xliff:g>', '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="medium_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>'. '<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="twelve_hour_time_format" format="date">"<xliff:g id="HOUR">h</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>' '<xliff:g id="AMPM">a</xliff:g>"</string> - <string name="twenty_four_hour_time_format" format="date">"<xliff:g id="HOUR">HH</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>"</string> <string name="noon">"middag"</string> <string name="Noon">"Middag"</string> <string name="midnight">"midnatt"</string> @@ -586,10 +564,6 @@ <skip /> <!-- no translation found for month (7026169712234774086) --> <skip /> - <string name="month_day_year">"<xliff:g id="DAY">%-d</xliff:g>. <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="month_year">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string> - <string name="date_and_time">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g> <xliff:g id="DAY">%-d</xliff:g>. <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> <string name="same_year_md1_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>"</string> <string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g>"</string> <string name="same_year_mdy1_mdy2">"<xliff:g id="DAY1">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR">%9$s</xliff:g>"</string> @@ -614,83 +588,10 @@ <string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="TIME2">%10$s</xliff:g>"</string> <string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="DAY1">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g> <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g> <xliff:g id="TIME2">%10$s</xliff:g>"</string> <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g> <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g> <xliff:g id="TIME2">%10$s</xliff:g>"</string> - <string name="abbrev_month_day_year">"<xliff:g id="DAY">%-d</xliff:g>. <xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="abbrev_month_year">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> <!-- no translation found for abbrev_month_day (3156047263406783231) --> <skip /> <!-- no translation found for abbrev_month (3131032032850777433) --> <skip /> - <string name="day_of_week_long_sunday">"søndag"</string> - <string name="day_of_week_long_monday">"mandag"</string> - <string name="day_of_week_long_tuesday">"tirsdag"</string> - <string name="day_of_week_long_wednesday">"onsdag"</string> - <string name="day_of_week_long_thursday">"torsdag"</string> - <string name="day_of_week_long_friday">"fredag"</string> - <string name="day_of_week_long_saturday">"lørdag"</string> - <string name="day_of_week_medium_sunday">"søn"</string> - <string name="day_of_week_medium_monday">"man"</string> - <string name="day_of_week_medium_tuesday">"tir"</string> - <string name="day_of_week_medium_wednesday">"ons"</string> - <string name="day_of_week_medium_thursday">"tor"</string> - <string name="day_of_week_medium_friday">"fre"</string> - <string name="day_of_week_medium_saturday">"lør"</string> - <string name="day_of_week_short_sunday">"sø"</string> - <string name="day_of_week_short_monday">"ma"</string> - <string name="day_of_week_short_tuesday">"ti"</string> - <string name="day_of_week_short_wednesday">"on"</string> - <string name="day_of_week_short_thursday">"to"</string> - <string name="day_of_week_short_friday">"fr"</string> - <string name="day_of_week_short_saturday">"lø"</string> - <string name="day_of_week_shorter_sunday">"S"</string> - <string name="day_of_week_shorter_monday">"M"</string> - <string name="day_of_week_shorter_tuesday">"Ti"</string> - <string name="day_of_week_shorter_wednesday">"O"</string> - <string name="day_of_week_shorter_thursday">"To"</string> - <string name="day_of_week_shorter_friday">"F"</string> - <string name="day_of_week_shorter_saturday">"L"</string> - <string name="day_of_week_shortest_sunday">"S"</string> - <string name="day_of_week_shortest_monday">"M"</string> - <string name="day_of_week_shortest_tuesday">"T"</string> - <string name="day_of_week_shortest_wednesday">"O"</string> - <string name="day_of_week_shortest_thursday">"T"</string> - <string name="day_of_week_shortest_friday">"F"</string> - <string name="day_of_week_shortest_saturday">"L"</string> - <string name="month_long_january">"januar"</string> - <string name="month_long_february">"februar"</string> - <string name="month_long_march">"mars"</string> - <string name="month_long_april">"april"</string> - <string name="month_long_may">"mai"</string> - <string name="month_long_june">"juni"</string> - <string name="month_long_july">"juli"</string> - <string name="month_long_august">"august"</string> - <string name="month_long_september">"september"</string> - <string name="month_long_october">"oktober"</string> - <string name="month_long_november">"november"</string> - <string name="month_long_december">"desember"</string> - <string name="month_medium_january">"jan"</string> - <string name="month_medium_february">"feb"</string> - <string name="month_medium_march">"mar"</string> - <string name="month_medium_april">"apr"</string> - <string name="month_medium_may">"mai"</string> - <string name="month_medium_june">"jun"</string> - <string name="month_medium_july">"jul"</string> - <string name="month_medium_august">"aug"</string> - <string name="month_medium_september">"sep"</string> - <string name="month_medium_october">"okt"</string> - <string name="month_medium_november">"nov"</string> - <string name="month_medium_december">"des"</string> - <string name="month_shortest_january">"J"</string> - <string name="month_shortest_february">"F"</string> - <string name="month_shortest_march">"M"</string> - <string name="month_shortest_april">"A"</string> - <string name="month_shortest_may">"M"</string> - <string name="month_shortest_june">"J"</string> - <string name="month_shortest_july">"J"</string> - <string name="month_shortest_august">"A"</string> - <string name="month_shortest_september">"S"</string> - <string name="month_shortest_october">"O"</string> - <string name="month_shortest_november">"N"</string> - <string name="month_shortest_december">"D"</string> <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string> <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string> <string name="selectAll">"Merk alt"</string> diff --git a/core/res/res/values-nl-rBE/donottranslate-cldr.xml b/core/res/res/values-nl-rBE/donottranslate-cldr.xml new file mode 100644 index 0000000..c3050c6 --- /dev/null +++ b/core/res/res/values-nl-rBE/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">januari</string> + <string name="month_long_standalone_february">februari</string> + <string name="month_long_standalone_march">maart</string> + <string name="month_long_standalone_april">april</string> + <string name="month_long_standalone_may">mei</string> + <string name="month_long_standalone_june">juni</string> + <string name="month_long_standalone_july">juli</string> + <string name="month_long_standalone_august">augustus</string> + <string name="month_long_standalone_september">september</string> + <string name="month_long_standalone_october">oktober</string> + <string name="month_long_standalone_november">november</string> + <string name="month_long_standalone_december">december</string> + + <string name="month_long_january">januari</string> + <string name="month_long_february">februari</string> + <string name="month_long_march">maart</string> + <string name="month_long_april">april</string> + <string name="month_long_may">mei</string> + <string name="month_long_june">juni</string> + <string name="month_long_july">juli</string> + <string name="month_long_august">augustus</string> + <string name="month_long_september">september</string> + <string name="month_long_october">oktober</string> + <string name="month_long_november">november</string> + <string name="month_long_december">december</string> + + <string name="month_medium_january">jan.</string> + <string name="month_medium_february">feb.</string> + <string name="month_medium_march">mrt.</string> + <string name="month_medium_april">apr.</string> + <string name="month_medium_may">mei</string> + <string name="month_medium_june">jun.</string> + <string name="month_medium_july">jul.</string> + <string name="month_medium_august">aug.</string> + <string name="month_medium_september">sep.</string> + <string name="month_medium_october">okt.</string> + <string name="month_medium_november">nov.</string> + <string name="month_medium_december">dec.</string> + + <string name="month_shortest_january">J</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">zondag</string> + <string name="day_of_week_long_monday">maandag</string> + <string name="day_of_week_long_tuesday">dinsdag</string> + <string name="day_of_week_long_wednesday">woensdag</string> + <string name="day_of_week_long_thursday">donderdag</string> + <string name="day_of_week_long_friday">vrijdag</string> + <string name="day_of_week_long_saturday">zaterdag</string> + + <string name="day_of_week_medium_sunday">zo</string> + <string name="day_of_week_medium_monday">ma</string> + <string name="day_of_week_medium_tuesday">di</string> + <string name="day_of_week_medium_wednesday">wo</string> + <string name="day_of_week_medium_thursday">do</string> + <string name="day_of_week_medium_friday">vr</string> + <string name="day_of_week_medium_saturday">za</string> + + <string name="day_of_week_short_sunday">zo</string> + <string name="day_of_week_short_monday">ma</string> + <string name="day_of_week_short_tuesday">di</string> + <string name="day_of_week_short_wednesday">wo</string> + <string name="day_of_week_short_thursday">do</string> + <string name="day_of_week_short_friday">vr</string> + <string name="day_of_week_short_saturday">za</string> + + <string name="day_of_week_shortest_sunday">Z</string> + <string name="day_of_week_shortest_monday">M</string> + <string name="day_of_week_shortest_tuesday">D</string> + <string name="day_of_week_shortest_wednesday">W</string> + <string name="day_of_week_shortest_thursday">D</string> + <string name="day_of_week_shortest_friday">V</string> + <string name="day_of_week_shortest_saturday">Z</string> + + <string name="am">AM</string> + <string name="pm">PM</string> + <string name="yesterday">Gisteren</string> + <string name="today">Vandaag</string> + <string name="tomorrow">Morgen</string> + + <string name="hour_minute_ampm">%H:%M</string> + <string name="hour_minute_cap_ampm">%H:%M</string> + <string name="numeric_date">%-e/%m/%Y</string> + <string name="numeric_date_format">d/MM/yyyy</string> + <string name="month_day_year">%-e %B %Y</string> + <string name="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%H:%M:%S %-e-%b-%Y</string> + <string name="abbrev_month_day_year">%-e-%b-%Y</string> + <string name="month_day">%-e %B</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%-e-%b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-nl-rNL/donottranslate-cldr.xml b/core/res/res/values-nl-rNL/donottranslate-cldr.xml new file mode 100644 index 0000000..b9e0407 --- /dev/null +++ b/core/res/res/values-nl-rNL/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">januari</string> + <string name="month_long_standalone_february">februari</string> + <string name="month_long_standalone_march">maart</string> + <string name="month_long_standalone_april">april</string> + <string name="month_long_standalone_may">mei</string> + <string name="month_long_standalone_june">juni</string> + <string name="month_long_standalone_july">juli</string> + <string name="month_long_standalone_august">augustus</string> + <string name="month_long_standalone_september">september</string> + <string name="month_long_standalone_october">oktober</string> + <string name="month_long_standalone_november">november</string> + <string name="month_long_standalone_december">december</string> + + <string name="month_long_january">januari</string> + <string name="month_long_february">februari</string> + <string name="month_long_march">maart</string> + <string name="month_long_april">april</string> + <string name="month_long_may">mei</string> + <string name="month_long_june">juni</string> + <string name="month_long_july">juli</string> + <string name="month_long_august">augustus</string> + <string name="month_long_september">september</string> + <string name="month_long_october">oktober</string> + <string name="month_long_november">november</string> + <string name="month_long_december">december</string> + + <string name="month_medium_january">jan.</string> + <string name="month_medium_february">feb.</string> + <string name="month_medium_march">mrt.</string> + <string name="month_medium_april">apr.</string> + <string name="month_medium_may">mei</string> + <string name="month_medium_june">jun.</string> + <string name="month_medium_july">jul.</string> + <string name="month_medium_august">aug.</string> + <string name="month_medium_september">sep.</string> + <string name="month_medium_october">okt.</string> + <string name="month_medium_november">nov.</string> + <string name="month_medium_december">dec.</string> + + <string name="month_shortest_january">J</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">zondag</string> + <string name="day_of_week_long_monday">maandag</string> + <string name="day_of_week_long_tuesday">dinsdag</string> + <string name="day_of_week_long_wednesday">woensdag</string> + <string name="day_of_week_long_thursday">donderdag</string> + <string name="day_of_week_long_friday">vrijdag</string> + <string name="day_of_week_long_saturday">zaterdag</string> + + <string name="day_of_week_medium_sunday">zo</string> + <string name="day_of_week_medium_monday">ma</string> + <string name="day_of_week_medium_tuesday">di</string> + <string name="day_of_week_medium_wednesday">wo</string> + <string name="day_of_week_medium_thursday">do</string> + <string name="day_of_week_medium_friday">vr</string> + <string name="day_of_week_medium_saturday">za</string> + + <string name="day_of_week_short_sunday">zo</string> + <string name="day_of_week_short_monday">ma</string> + <string name="day_of_week_short_tuesday">di</string> + <string name="day_of_week_short_wednesday">wo</string> + <string name="day_of_week_short_thursday">do</string> + <string name="day_of_week_short_friday">vr</string> + <string name="day_of_week_short_saturday">za</string> + + <string name="day_of_week_shortest_sunday">Z</string> + <string name="day_of_week_shortest_monday">M</string> + <string name="day_of_week_shortest_tuesday">D</string> + <string name="day_of_week_shortest_wednesday">W</string> + <string name="day_of_week_shortest_thursday">D</string> + <string name="day_of_week_shortest_friday">V</string> + <string name="day_of_week_shortest_saturday">Z</string> + + <string name="am">AM</string> + <string name="pm">PM</string> + <string name="yesterday">Gisteren</string> + <string name="today">Vandaag</string> + <string name="tomorrow">Morgen</string> + + <string name="hour_minute_ampm">%H:%M</string> + <string name="hour_minute_cap_ampm">%H:%M</string> + <string name="numeric_date">%d-%m-%Y</string> + <string name="numeric_date_format">dd-MM-yyyy</string> + <string name="month_day_year">%-e %B %Y</string> + <string name="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%H:%M:%S %-e %b %Y</string> + <string name="abbrev_month_day_year">%-e %b %Y</string> + <string name="month_day">%-e %B</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%-e-%b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-nl/donottranslate-cldr.xml b/core/res/res/values-nl/donottranslate-cldr.xml new file mode 100644 index 0000000..b9e0407 --- /dev/null +++ b/core/res/res/values-nl/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">januari</string> + <string name="month_long_standalone_february">februari</string> + <string name="month_long_standalone_march">maart</string> + <string name="month_long_standalone_april">april</string> + <string name="month_long_standalone_may">mei</string> + <string name="month_long_standalone_june">juni</string> + <string name="month_long_standalone_july">juli</string> + <string name="month_long_standalone_august">augustus</string> + <string name="month_long_standalone_september">september</string> + <string name="month_long_standalone_october">oktober</string> + <string name="month_long_standalone_november">november</string> + <string name="month_long_standalone_december">december</string> + + <string name="month_long_january">januari</string> + <string name="month_long_february">februari</string> + <string name="month_long_march">maart</string> + <string name="month_long_april">april</string> + <string name="month_long_may">mei</string> + <string name="month_long_june">juni</string> + <string name="month_long_july">juli</string> + <string name="month_long_august">augustus</string> + <string name="month_long_september">september</string> + <string name="month_long_october">oktober</string> + <string name="month_long_november">november</string> + <string name="month_long_december">december</string> + + <string name="month_medium_january">jan.</string> + <string name="month_medium_february">feb.</string> + <string name="month_medium_march">mrt.</string> + <string name="month_medium_april">apr.</string> + <string name="month_medium_may">mei</string> + <string name="month_medium_june">jun.</string> + <string name="month_medium_july">jul.</string> + <string name="month_medium_august">aug.</string> + <string name="month_medium_september">sep.</string> + <string name="month_medium_october">okt.</string> + <string name="month_medium_november">nov.</string> + <string name="month_medium_december">dec.</string> + + <string name="month_shortest_january">J</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">zondag</string> + <string name="day_of_week_long_monday">maandag</string> + <string name="day_of_week_long_tuesday">dinsdag</string> + <string name="day_of_week_long_wednesday">woensdag</string> + <string name="day_of_week_long_thursday">donderdag</string> + <string name="day_of_week_long_friday">vrijdag</string> + <string name="day_of_week_long_saturday">zaterdag</string> + + <string name="day_of_week_medium_sunday">zo</string> + <string name="day_of_week_medium_monday">ma</string> + <string name="day_of_week_medium_tuesday">di</string> + <string name="day_of_week_medium_wednesday">wo</string> + <string name="day_of_week_medium_thursday">do</string> + <string name="day_of_week_medium_friday">vr</string> + <string name="day_of_week_medium_saturday">za</string> + + <string name="day_of_week_short_sunday">zo</string> + <string name="day_of_week_short_monday">ma</string> + <string name="day_of_week_short_tuesday">di</string> + <string name="day_of_week_short_wednesday">wo</string> + <string name="day_of_week_short_thursday">do</string> + <string name="day_of_week_short_friday">vr</string> + <string name="day_of_week_short_saturday">za</string> + + <string name="day_of_week_shortest_sunday">Z</string> + <string name="day_of_week_shortest_monday">M</string> + <string name="day_of_week_shortest_tuesday">D</string> + <string name="day_of_week_shortest_wednesday">W</string> + <string name="day_of_week_shortest_thursday">D</string> + <string name="day_of_week_shortest_friday">V</string> + <string name="day_of_week_shortest_saturday">Z</string> + + <string name="am">AM</string> + <string name="pm">PM</string> + <string name="yesterday">Gisteren</string> + <string name="today">Vandaag</string> + <string name="tomorrow">Morgen</string> + + <string name="hour_minute_ampm">%H:%M</string> + <string name="hour_minute_cap_ampm">%H:%M</string> + <string name="numeric_date">%d-%m-%Y</string> + <string name="numeric_date_format">dd-MM-yyyy</string> + <string name="month_day_year">%-e %B %Y</string> + <string name="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%H:%M:%S %-e %b %Y</string> + <string name="abbrev_month_day_year">%-e %b %Y</string> + <string name="month_day">%-e %B</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%-e-%b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 3a9e32c..4437f29 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -418,9 +418,6 @@ <string name="lockscreen_glogin_password_hint">"Wachtwoord"</string> <string name="lockscreen_glogin_submit_button">"Aanmelden"</string> <string name="lockscreen_glogin_invalid_input">"Gebruikersnaam of wachtwoord ongeldig."</string> - <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string> - <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string> - <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string> <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string> <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string> <string name="status_bar_clear_all_button">"Meldingen wissen"</string> @@ -452,9 +449,6 @@ <string name="menu_enter_shortcut_label">"invoeren"</string> <string name="menu_delete_shortcut_label">"verwijderen"</string> <string name="search_go">"Zoeken"</string> - <string name="today">"Vandaag"</string> - <string name="yesterday">"Gisteren"</string> - <string name="tomorrow">"Morgen"</string> <string name="oneMonthDurationPast">"1 maand geleden"</string> <string name="beforeOneMonthDurationPast">"Meer dan 1 maand geleden"</string> <plurals name="num_seconds_ago"> @@ -536,13 +530,6 @@ <string name="weeks">"weken"</string> <string name="year">"jaar"</string> <string name="years">"jaren"</string> - <string name="sunday">"Zondag"</string> - <string name="monday">"Maandag"</string> - <string name="tuesday">"Dinsdag"</string> - <string name="wednesday">"Woensdag"</string> - <string name="thursday">"Donderdag"</string> - <string name="friday">"Vrijdag"</string> - <string name="saturday">"Zaterdag"</string> <string name="every_weekday">"Elke weekdag (ma-vr)"</string> <string name="daily">"Dagelijks"</string> <string name="weekly">"Wekelijks op <xliff:g id="DAY">%s</xliff:g>"</string> @@ -552,9 +539,6 @@ <string name="VideoView_error_text_invalid_progressive_playback">"Deze video kan helaas niet worden gestreamd naar dit apparaat."</string> <string name="VideoView_error_text_unknown">"Deze video kan niet worden afgespeeld."</string> <string name="VideoView_error_button">"OK"</string> - <string name="am">"am"</string> - <string name="pm">"pm"</string> - <string name="numeric_date">"<xliff:g id="DAY">%d</xliff:g>-<xliff:g id="MONTH">%m</xliff:g>-<xliff:g id="YEAR">%Y</xliff:g>"</string> <string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g> <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string> <string name="wday1_date1_wday2_date2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g> <xliff:g id="DATE2">%5$s</xliff:g>"</string> <string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string> @@ -566,23 +550,12 @@ <string name="date_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="time_wday">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>"</string> - <string name="full_date_month_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="full_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="medium_date_month_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="medium_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="twelve_hour_time_format" format="date">"<xliff:g id="HOUR">h</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>' '<xliff:g id="AMPM">a</xliff:g>"</string> - <string name="twenty_four_hour_time_format" format="date">"<xliff:g id="HOUR">HH</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>"</string> <string name="noon">"twaalf uur \'s middags"</string> <string name="Noon">"Twaalf uur \'s middags"</string> <string name="midnight">"middernacht"</string> <string name="Midnight">"Middernacht"</string> - <string name="month_day">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g>"</string> <!-- no translation found for month (7026169712234774086) --> <skip /> - <string name="month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="month_year">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string> - <string name="date_and_time">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g> <xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> <string name="same_year_md1_md2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>"</string> <string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>"</string> <string name="same_year_mdy1_mdy2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR">%9$s</xliff:g>"</string> @@ -607,82 +580,8 @@ <string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string> <string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string> <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string> - <string name="abbrev_month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="abbrev_month_year">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="abbrev_month_day">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%b</xliff:g>"</string> <!-- no translation found for abbrev_month (3131032032850777433) --> <skip /> - <string name="day_of_week_long_sunday">"Zondag"</string> - <string name="day_of_week_long_monday">"Maandag"</string> - <string name="day_of_week_long_tuesday">"Dinsdag"</string> - <string name="day_of_week_long_wednesday">"Woensdag"</string> - <string name="day_of_week_long_thursday">"Donderdag"</string> - <string name="day_of_week_long_friday">"Vrijdag"</string> - <string name="day_of_week_long_saturday">"Zaterdag"</string> - <string name="day_of_week_medium_sunday">"Zo"</string> - <string name="day_of_week_medium_monday">"Ma"</string> - <string name="day_of_week_medium_tuesday">"Di"</string> - <string name="day_of_week_medium_wednesday">"Wo"</string> - <string name="day_of_week_medium_thursday">"Do"</string> - <string name="day_of_week_medium_friday">"Vr"</string> - <string name="day_of_week_medium_saturday">"Za"</string> - <string name="day_of_week_short_sunday">"Zo"</string> - <string name="day_of_week_short_monday">"Ma"</string> - <string name="day_of_week_short_tuesday">"Di"</string> - <string name="day_of_week_short_wednesday">"Wo"</string> - <string name="day_of_week_short_thursday">"Do"</string> - <string name="day_of_week_short_friday">"Vr"</string> - <string name="day_of_week_short_saturday">"Za"</string> - <string name="day_of_week_shorter_sunday">"Zo"</string> - <string name="day_of_week_shorter_monday">"M"</string> - <string name="day_of_week_shorter_tuesday">"Di"</string> - <string name="day_of_week_shorter_wednesday">"W"</string> - <string name="day_of_week_shorter_thursday">"Do"</string> - <string name="day_of_week_shorter_friday">"V"</string> - <string name="day_of_week_shorter_saturday">"Za"</string> - <string name="day_of_week_shortest_sunday">"Z"</string> - <string name="day_of_week_shortest_monday">"M"</string> - <string name="day_of_week_shortest_tuesday">"D"</string> - <string name="day_of_week_shortest_wednesday">"W"</string> - <string name="day_of_week_shortest_thursday">"D"</string> - <string name="day_of_week_shortest_friday">"V"</string> - <string name="day_of_week_shortest_saturday">"Z"</string> - <string name="month_long_january">"Januari"</string> - <string name="month_long_february">"Februari"</string> - <string name="month_long_march">"Maart"</string> - <string name="month_long_april">"April"</string> - <string name="month_long_may">"Mei"</string> - <string name="month_long_june">"Juni"</string> - <string name="month_long_july">"Juli"</string> - <string name="month_long_august">"Augustus"</string> - <string name="month_long_september">"September"</string> - <string name="month_long_october">"Oktober"</string> - <string name="month_long_november">"November"</string> - <string name="month_long_december">"December"</string> - <string name="month_medium_january">"Jan"</string> - <string name="month_medium_february">"Feb"</string> - <string name="month_medium_march">"Mrt"</string> - <string name="month_medium_april">"Apr"</string> - <string name="month_medium_may">"Mei"</string> - <string name="month_medium_june">"Jun"</string> - <string name="month_medium_july">"Jul"</string> - <string name="month_medium_august">"Aug"</string> - <string name="month_medium_september">"Sep"</string> - <string name="month_medium_october">"Okt"</string> - <string name="month_medium_november">"Nov"</string> - <string name="month_medium_december">"Dec"</string> - <string name="month_shortest_january">"J"</string> - <string name="month_shortest_february">"V"</string> - <string name="month_shortest_march">"M"</string> - <string name="month_shortest_april">"A"</string> - <string name="month_shortest_may">"M"</string> - <string name="month_shortest_june">"J"</string> - <string name="month_shortest_july">"J"</string> - <string name="month_shortest_august">"A"</string> - <string name="month_shortest_september">"S"</string> - <string name="month_shortest_october">"O"</string> - <string name="month_shortest_november">"N"</string> - <string name="month_shortest_december">"D"</string> <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string> <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string> <string name="selectAll">"Alles selecteren"</string> diff --git a/core/res/res/values-pl-rPL/donottranslate-cldr.xml b/core/res/res/values-pl-rPL/donottranslate-cldr.xml new file mode 100644 index 0000000..0ae8b48 --- /dev/null +++ b/core/res/res/values-pl-rPL/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">styczeń</string> + <string name="month_long_standalone_february">luty</string> + <string name="month_long_standalone_march">marzec</string> + <string name="month_long_standalone_april">kwiecień</string> + <string name="month_long_standalone_may">maj</string> + <string name="month_long_standalone_june">czerwiec</string> + <string name="month_long_standalone_july">lipiec</string> + <string name="month_long_standalone_august">sierpień</string> + <string name="month_long_standalone_september">wrzesień</string> + <string name="month_long_standalone_october">październik</string> + <string name="month_long_standalone_november">listopad</string> + <string name="month_long_standalone_december">grudzień</string> + + <string name="month_long_january">stycznia</string> + <string name="month_long_february">lutego</string> + <string name="month_long_march">marca</string> + <string name="month_long_april">kwietnia</string> + <string name="month_long_may">maja</string> + <string name="month_long_june">czerwca</string> + <string name="month_long_july">lipca</string> + <string name="month_long_august">sierpnia</string> + <string name="month_long_september">września</string> + <string name="month_long_october">października</string> + <string name="month_long_november">listopada</string> + <string name="month_long_december">grudnia</string> + + <string name="month_medium_january">sty</string> + <string name="month_medium_february">lut</string> + <string name="month_medium_march">mar</string> + <string name="month_medium_april">kwi</string> + <string name="month_medium_may">maj</string> + <string name="month_medium_june">cze</string> + <string name="month_medium_july">lip</string> + <string name="month_medium_august">sie</string> + <string name="month_medium_september">wrz</string> + <string name="month_medium_october">paź</string> + <string name="month_medium_november">lis</string> + <string name="month_medium_december">gru</string> + + <string name="month_shortest_january">s</string> + <string name="month_shortest_february">l</string> + <string name="month_shortest_march">m</string> + <string name="month_shortest_april">k</string> + <string name="month_shortest_may">m</string> + <string name="month_shortest_june">c</string> + <string name="month_shortest_july">l</string> + <string name="month_shortest_august">s</string> + <string name="month_shortest_september">w</string> + <string name="month_shortest_october">p</string> + <string name="month_shortest_november">l</string> + <string name="month_shortest_december">g</string> + + <string name="day_of_week_long_sunday">niedziela</string> + <string name="day_of_week_long_monday">poniedziałek</string> + <string name="day_of_week_long_tuesday">wtorek</string> + <string name="day_of_week_long_wednesday">środa</string> + <string name="day_of_week_long_thursday">czwartek</string> + <string name="day_of_week_long_friday">piątek</string> + <string name="day_of_week_long_saturday">sobota</string> + + <string name="day_of_week_medium_sunday">niedz.</string> + <string name="day_of_week_medium_monday">pon.</string> + <string name="day_of_week_medium_tuesday">wt.</string> + <string name="day_of_week_medium_wednesday">śr.</string> + <string name="day_of_week_medium_thursday">czw.</string> + <string name="day_of_week_medium_friday">pt.</string> + <string name="day_of_week_medium_saturday">sob.</string> + + <string name="day_of_week_short_sunday">niedz.</string> + <string name="day_of_week_short_monday">pon.</string> + <string name="day_of_week_short_tuesday">wt.</string> + <string name="day_of_week_short_wednesday">śr.</string> + <string name="day_of_week_short_thursday">czw.</string> + <string name="day_of_week_short_friday">pt.</string> + <string name="day_of_week_short_saturday">sob.</string> + + <string name="day_of_week_shortest_sunday">N</string> + <string name="day_of_week_shortest_monday">P</string> + <string name="day_of_week_shortest_tuesday">W</string> + <string name="day_of_week_shortest_wednesday">Ś</string> + <string name="day_of_week_shortest_thursday">C</string> + <string name="day_of_week_shortest_friday">P</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">AM</string> + <string name="pm">PM</string> + <string name="yesterday">Wczoraj</string> + <string name="today">Dzisiaj</string> + <string name="tomorrow">Jutro</string> + + <string name="hour_minute_ampm">%H:%M</string> + <string name="hour_minute_cap_ampm">%H:%M</string> + <string name="numeric_date">%d-%m-%Y</string> + <string name="numeric_date_format">dd-MM-yyyy</string> + <string name="month_day_year">%-e %B %Y</string> + <string name="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%H:%M:%S %d-%m-%Y</string> + <string name="abbrev_month_day_year">%d-%m-%Y</string> + <string name="month_day">%-e %B</string> + <string name="month">%-B</string> + <string name="month_year">%-B %Y</string> + <string name="abbrev_month_day">%b %-e</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%Y %b</string> +</resources> diff --git a/core/res/res/values-pl/donottranslate-cldr.xml b/core/res/res/values-pl/donottranslate-cldr.xml new file mode 100644 index 0000000..0ae8b48 --- /dev/null +++ b/core/res/res/values-pl/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">styczeń</string> + <string name="month_long_standalone_february">luty</string> + <string name="month_long_standalone_march">marzec</string> + <string name="month_long_standalone_april">kwiecień</string> + <string name="month_long_standalone_may">maj</string> + <string name="month_long_standalone_june">czerwiec</string> + <string name="month_long_standalone_july">lipiec</string> + <string name="month_long_standalone_august">sierpień</string> + <string name="month_long_standalone_september">wrzesień</string> + <string name="month_long_standalone_october">październik</string> + <string name="month_long_standalone_november">listopad</string> + <string name="month_long_standalone_december">grudzień</string> + + <string name="month_long_january">stycznia</string> + <string name="month_long_february">lutego</string> + <string name="month_long_march">marca</string> + <string name="month_long_april">kwietnia</string> + <string name="month_long_may">maja</string> + <string name="month_long_june">czerwca</string> + <string name="month_long_july">lipca</string> + <string name="month_long_august">sierpnia</string> + <string name="month_long_september">września</string> + <string name="month_long_october">października</string> + <string name="month_long_november">listopada</string> + <string name="month_long_december">grudnia</string> + + <string name="month_medium_january">sty</string> + <string name="month_medium_february">lut</string> + <string name="month_medium_march">mar</string> + <string name="month_medium_april">kwi</string> + <string name="month_medium_may">maj</string> + <string name="month_medium_june">cze</string> + <string name="month_medium_july">lip</string> + <string name="month_medium_august">sie</string> + <string name="month_medium_september">wrz</string> + <string name="month_medium_october">paź</string> + <string name="month_medium_november">lis</string> + <string name="month_medium_december">gru</string> + + <string name="month_shortest_january">s</string> + <string name="month_shortest_february">l</string> + <string name="month_shortest_march">m</string> + <string name="month_shortest_april">k</string> + <string name="month_shortest_may">m</string> + <string name="month_shortest_june">c</string> + <string name="month_shortest_july">l</string> + <string name="month_shortest_august">s</string> + <string name="month_shortest_september">w</string> + <string name="month_shortest_october">p</string> + <string name="month_shortest_november">l</string> + <string name="month_shortest_december">g</string> + + <string name="day_of_week_long_sunday">niedziela</string> + <string name="day_of_week_long_monday">poniedziałek</string> + <string name="day_of_week_long_tuesday">wtorek</string> + <string name="day_of_week_long_wednesday">środa</string> + <string name="day_of_week_long_thursday">czwartek</string> + <string name="day_of_week_long_friday">piątek</string> + <string name="day_of_week_long_saturday">sobota</string> + + <string name="day_of_week_medium_sunday">niedz.</string> + <string name="day_of_week_medium_monday">pon.</string> + <string name="day_of_week_medium_tuesday">wt.</string> + <string name="day_of_week_medium_wednesday">śr.</string> + <string name="day_of_week_medium_thursday">czw.</string> + <string name="day_of_week_medium_friday">pt.</string> + <string name="day_of_week_medium_saturday">sob.</string> + + <string name="day_of_week_short_sunday">niedz.</string> + <string name="day_of_week_short_monday">pon.</string> + <string name="day_of_week_short_tuesday">wt.</string> + <string name="day_of_week_short_wednesday">śr.</string> + <string name="day_of_week_short_thursday">czw.</string> + <string name="day_of_week_short_friday">pt.</string> + <string name="day_of_week_short_saturday">sob.</string> + + <string name="day_of_week_shortest_sunday">N</string> + <string name="day_of_week_shortest_monday">P</string> + <string name="day_of_week_shortest_tuesday">W</string> + <string name="day_of_week_shortest_wednesday">Ś</string> + <string name="day_of_week_shortest_thursday">C</string> + <string name="day_of_week_shortest_friday">P</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">AM</string> + <string name="pm">PM</string> + <string name="yesterday">Wczoraj</string> + <string name="today">Dzisiaj</string> + <string name="tomorrow">Jutro</string> + + <string name="hour_minute_ampm">%H:%M</string> + <string name="hour_minute_cap_ampm">%H:%M</string> + <string name="numeric_date">%d-%m-%Y</string> + <string name="numeric_date_format">dd-MM-yyyy</string> + <string name="month_day_year">%-e %B %Y</string> + <string name="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%H:%M:%S %d-%m-%Y</string> + <string name="abbrev_month_day_year">%d-%m-%Y</string> + <string name="month_day">%-e %B</string> + <string name="month">%-B</string> + <string name="month_year">%-B %Y</string> + <string name="abbrev_month_day">%b %-e</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%Y %b</string> +</resources> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 50d245b..2cd4841 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -418,9 +418,6 @@ <string name="lockscreen_glogin_password_hint">"Hasło"</string> <string name="lockscreen_glogin_submit_button">"Zaloguj"</string> <string name="lockscreen_glogin_invalid_input">"Błędna nazwa użytkownika lub hasło."</string> - <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string> - <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string> - <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string> <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string> <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string> <string name="status_bar_clear_all_button">"Wyczyść powiadomienia"</string> @@ -452,9 +449,6 @@ <string name="menu_enter_shortcut_label">"enter"</string> <string name="menu_delete_shortcut_label">"usuń"</string> <string name="search_go">"Szukaj"</string> - <string name="today">"Dzisiaj"</string> - <string name="yesterday">"Wczoraj"</string> - <string name="tomorrow">"Jutro"</string> <string name="oneMonthDurationPast">"1 miesiąc temu"</string> <string name="beforeOneMonthDurationPast">"Ponad 1 miesiąc temu"</string> <plurals name="num_seconds_ago"> @@ -536,13 +530,6 @@ <string name="weeks">"tygodni"</string> <string name="year">"rok"</string> <string name="years">"lat"</string> - <string name="sunday">"niedziela"</string> - <string name="monday">"poniedziałek"</string> - <string name="tuesday">"wtorek"</string> - <string name="wednesday">"środa"</string> - <string name="thursday">"czwartek"</string> - <string name="friday">"piątek"</string> - <string name="saturday">"sobota"</string> <string name="every_weekday">"W każdy dzień roboczy (pon–pt)"</string> <string name="daily">"Codziennie"</string> <string name="weekly">"Co tydzień w <xliff:g id="DAY">%s</xliff:g>"</string> @@ -552,9 +539,6 @@ <string name="VideoView_error_text_invalid_progressive_playback">"Przepraszamy, ten film wideo nie nadaje się do przesyłania strumieniowego do tego urządzenia."</string> <string name="VideoView_error_text_unknown">"Niestety, nie można odtworzyć tego filmu wideo."</string> <string name="VideoView_error_button">"OK"</string> - <string name="am">"rano"</string> - <string name="pm">"po południu"</string> - <string name="numeric_date">"<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="DAY">%d</xliff:g>/<xliff:g id="YEAR">%Y</xliff:g>"</string> <string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string> <string name="wday1_date1_wday2_date2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>"</string> <string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string> @@ -566,23 +550,12 @@ <string name="date_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="time_wday">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>"</string> - <string name="full_date_month_first" format="date">"<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="DAY">d</xliff:g>', '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="full_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMMM</xliff:g>', '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="medium_date_month_first" format="date">"<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="DAY">d</xliff:g>', '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="medium_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMM</xliff:g>', '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="twelve_hour_time_format" format="date">"<xliff:g id="HOUR">h</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>' '<xliff:g id="AMPM">a</xliff:g>"</string> - <string name="twenty_four_hour_time_format" format="date">"<xliff:g id="HOUR">HH</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>"</string> <string name="noon">"południe"</string> <string name="Noon">"Południe"</string> <string name="midnight">"północ"</string> <string name="Midnight">"Północ"</string> - <string name="month_day">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g>"</string> <!-- no translation found for month (7026169712234774086) --> <skip /> - <string name="month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="month_year">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string> - <string name="date_and_time">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>, <xliff:g id="YEAR">%Y</xliff:g>"</string> <string name="same_year_md1_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>"</string> <string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>"</string> <string name="same_year_mdy1_mdy2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="YEAR">%9$s</xliff:g>"</string> @@ -607,82 +580,8 @@ <string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string> <string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string> <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string> - <string name="abbrev_month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="abbrev_month_year">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="abbrev_month_day">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="DAY">%-d</xliff:g>"</string> <!-- no translation found for abbrev_month (3131032032850777433) --> <skip /> - <string name="day_of_week_long_sunday">"niedziela"</string> - <string name="day_of_week_long_monday">"poniedziałek"</string> - <string name="day_of_week_long_tuesday">"wtorek"</string> - <string name="day_of_week_long_wednesday">"środa"</string> - <string name="day_of_week_long_thursday">"czwartek"</string> - <string name="day_of_week_long_friday">"piątek"</string> - <string name="day_of_week_long_saturday">"sobota"</string> - <string name="day_of_week_medium_sunday">"Nie"</string> - <string name="day_of_week_medium_monday">"Pon"</string> - <string name="day_of_week_medium_tuesday">"Wt"</string> - <string name="day_of_week_medium_wednesday">"Śro"</string> - <string name="day_of_week_medium_thursday">"Czw"</string> - <string name="day_of_week_medium_friday">"Pią"</string> - <string name="day_of_week_medium_saturday">"Sob"</string> - <string name="day_of_week_short_sunday">"Nd"</string> - <string name="day_of_week_short_monday">"Pn"</string> - <string name="day_of_week_short_tuesday">"Wt"</string> - <string name="day_of_week_short_wednesday">"Śr"</string> - <string name="day_of_week_short_thursday">"Czw"</string> - <string name="day_of_week_short_friday">"Pt"</string> - <string name="day_of_week_short_saturday">"So"</string> - <string name="day_of_week_shorter_sunday">"Nd"</string> - <string name="day_of_week_shorter_monday">"Pon"</string> - <string name="day_of_week_shorter_tuesday">"Wt"</string> - <string name="day_of_week_shorter_wednesday">"Śr"</string> - <string name="day_of_week_shorter_thursday">"Czw"</string> - <string name="day_of_week_shorter_friday">"Pt"</string> - <string name="day_of_week_shorter_saturday">"So"</string> - <string name="day_of_week_shortest_sunday">"Nd"</string> - <string name="day_of_week_shortest_monday">"Pon"</string> - <string name="day_of_week_shortest_tuesday">"Czw"</string> - <string name="day_of_week_shortest_wednesday">"Śr"</string> - <string name="day_of_week_shortest_thursday">"Czw"</string> - <string name="day_of_week_shortest_friday">"Pt"</string> - <string name="day_of_week_shortest_saturday">"Sob"</string> - <string name="month_long_january">"Styczeń"</string> - <string name="month_long_february">"Luty"</string> - <string name="month_long_march">"Marzec"</string> - <string name="month_long_april">"Kwiecień"</string> - <string name="month_long_may">"Maj"</string> - <string name="month_long_june">"Czerwiec"</string> - <string name="month_long_july">"Lipiec"</string> - <string name="month_long_august">"Sierpień"</string> - <string name="month_long_september">"Wrzesień"</string> - <string name="month_long_october">"Październik"</string> - <string name="month_long_november">"Listopad"</string> - <string name="month_long_december">"Grudzień"</string> - <string name="month_medium_january">"Sty"</string> - <string name="month_medium_february">"Lut"</string> - <string name="month_medium_march">"Mar"</string> - <string name="month_medium_april">"Kwi"</string> - <string name="month_medium_may">"Maj"</string> - <string name="month_medium_june">"Cze"</string> - <string name="month_medium_july">"Lip"</string> - <string name="month_medium_august">"Sie"</string> - <string name="month_medium_september">"Wrz"</string> - <string name="month_medium_october">"Paź"</string> - <string name="month_medium_november">"Lis"</string> - <string name="month_medium_december">"Gru"</string> - <string name="month_shortest_january">"Sty"</string> - <string name="month_shortest_february">"Lut"</string> - <string name="month_shortest_march">"Pon"</string> - <string name="month_shortest_april">"Kwi"</string> - <string name="month_shortest_may">"Maj"</string> - <string name="month_shortest_june">"Cze"</string> - <string name="month_shortest_july">"Lip"</string> - <string name="month_shortest_august">"Sie"</string> - <string name="month_shortest_september">"Wrz"</string> - <string name="month_shortest_october">"Paź"</string> - <string name="month_shortest_november">"Lis"</string> - <string name="month_shortest_december">"Gru"</string> <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string> <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string> <string name="selectAll">"Zaznacz wszystko"</string> diff --git a/core/res/res/values-pt-rBR/donottranslate-cldr.xml b/core/res/res/values-pt-rBR/donottranslate-cldr.xml new file mode 100644 index 0000000..cf0c29e --- /dev/null +++ b/core/res/res/values-pt-rBR/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">janeiro</string> + <string name="month_long_standalone_february">fevereiro</string> + <string name="month_long_standalone_march">março</string> + <string name="month_long_standalone_april">abril</string> + <string name="month_long_standalone_may">maio</string> + <string name="month_long_standalone_june">junho</string> + <string name="month_long_standalone_july">julho</string> + <string name="month_long_standalone_august">agosto</string> + <string name="month_long_standalone_september">setembro</string> + <string name="month_long_standalone_october">outubro</string> + <string name="month_long_standalone_november">novembro</string> + <string name="month_long_standalone_december">dezembro</string> + + <string name="month_long_january">janeiro</string> + <string name="month_long_february">fevereiro</string> + <string name="month_long_march">março</string> + <string name="month_long_april">abril</string> + <string name="month_long_may">maio</string> + <string name="month_long_june">junho</string> + <string name="month_long_july">julho</string> + <string name="month_long_august">agosto</string> + <string name="month_long_september">setembro</string> + <string name="month_long_october">outubro</string> + <string name="month_long_november">novembro</string> + <string name="month_long_december">dezembro</string> + + <string name="month_medium_january">jan</string> + <string name="month_medium_february">fev</string> + <string name="month_medium_march">mar</string> + <string name="month_medium_april">abr</string> + <string name="month_medium_may">mai</string> + <string name="month_medium_june">jun</string> + <string name="month_medium_july">jul</string> + <string name="month_medium_august">ago</string> + <string name="month_medium_september">set</string> + <string name="month_medium_october">out</string> + <string name="month_medium_november">nov</string> + <string name="month_medium_december">dez</string> + + <string name="month_shortest_january">J</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">domingo</string> + <string name="day_of_week_long_monday">segunda-feira</string> + <string name="day_of_week_long_tuesday">terça-feira</string> + <string name="day_of_week_long_wednesday">quarta-feira</string> + <string name="day_of_week_long_thursday">quinta-feira</string> + <string name="day_of_week_long_friday">sexta-feira</string> + <string name="day_of_week_long_saturday">sábado</string> + + <string name="day_of_week_medium_sunday">dom</string> + <string name="day_of_week_medium_monday">seg</string> + <string name="day_of_week_medium_tuesday">ter</string> + <string name="day_of_week_medium_wednesday">qua</string> + <string name="day_of_week_medium_thursday">qui</string> + <string name="day_of_week_medium_friday">sex</string> + <string name="day_of_week_medium_saturday">sáb</string> + + <string name="day_of_week_short_sunday">dom</string> + <string name="day_of_week_short_monday">seg</string> + <string name="day_of_week_short_tuesday">ter</string> + <string name="day_of_week_short_wednesday">qua</string> + <string name="day_of_week_short_thursday">qui</string> + <string name="day_of_week_short_friday">sex</string> + <string name="day_of_week_short_saturday">sáb</string> + + <string name="day_of_week_shortest_sunday">D</string> + <string name="day_of_week_shortest_monday">S</string> + <string name="day_of_week_shortest_tuesday">T</string> + <string name="day_of_week_shortest_wednesday">Q</string> + <string name="day_of_week_shortest_thursday">Q</string> + <string name="day_of_week_shortest_friday">S</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">AM</string> + <string name="pm">PM</string> + <string name="yesterday">Ontem</string> + <string name="today">Hoje</string> + <string name="tomorrow">Amanhã</string> + + <string name="hour_minute_ampm">%H:%M</string> + <string name="hour_minute_cap_ampm">%H:%M</string> + <string name="numeric_date">%d/%m/%Y</string> + <string name="numeric_date_format">dd/MM/yyyy</string> + <string name="month_day_year">%-e de %B de %Y</string> + <string name="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%H:%M:%S %d/%m/%Y</string> + <string name="abbrev_month_day_year">%d/%m/%Y</string> + <string name="month_day">%-e de %B</string> + <string name="month">%-B</string> + <string name="month_year">%B de %Y</string> + <string name="abbrev_month_day">%-e de %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b de %Y</string> +</resources> diff --git a/core/res/res/values-pt-rPT/donottranslate-cldr.xml b/core/res/res/values-pt-rPT/donottranslate-cldr.xml new file mode 100644 index 0000000..d42dc8f --- /dev/null +++ b/core/res/res/values-pt-rPT/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">Janeiro</string> + <string name="month_long_standalone_february">Fevereiro</string> + <string name="month_long_standalone_march">Março</string> + <string name="month_long_standalone_april">Abril</string> + <string name="month_long_standalone_may">Maio</string> + <string name="month_long_standalone_june">Junho</string> + <string name="month_long_standalone_july">Julho</string> + <string name="month_long_standalone_august">Agosto</string> + <string name="month_long_standalone_september">Setembro</string> + <string name="month_long_standalone_october">Outubro</string> + <string name="month_long_standalone_november">Novembro</string> + <string name="month_long_standalone_december">Dezembro</string> + + <string name="month_long_january">Janeiro</string> + <string name="month_long_february">Fevereiro</string> + <string name="month_long_march">Março</string> + <string name="month_long_april">Abril</string> + <string name="month_long_may">Maio</string> + <string name="month_long_june">Junho</string> + <string name="month_long_july">Julho</string> + <string name="month_long_august">Agosto</string> + <string name="month_long_september">Setembro</string> + <string name="month_long_october">Outubro</string> + <string name="month_long_november">Novembro</string> + <string name="month_long_december">Dezembro</string> + + <string name="month_medium_january">Jan</string> + <string name="month_medium_february">Fev</string> + <string name="month_medium_march">Mar</string> + <string name="month_medium_april">Abr</string> + <string name="month_medium_may">Mai</string> + <string name="month_medium_june">Jun</string> + <string name="month_medium_july">Jul</string> + <string name="month_medium_august">Ago</string> + <string name="month_medium_september">Set</string> + <string name="month_medium_october">Out</string> + <string name="month_medium_november">Nov</string> + <string name="month_medium_december">Dez</string> + + <string name="month_shortest_january">J</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">domingo</string> + <string name="day_of_week_long_monday">segunda-feira</string> + <string name="day_of_week_long_tuesday">terça-feira</string> + <string name="day_of_week_long_wednesday">quarta-feira</string> + <string name="day_of_week_long_thursday">quinta-feira</string> + <string name="day_of_week_long_friday">sexta-feira</string> + <string name="day_of_week_long_saturday">sábado</string> + + <string name="day_of_week_medium_sunday">dom</string> + <string name="day_of_week_medium_monday">seg</string> + <string name="day_of_week_medium_tuesday">ter</string> + <string name="day_of_week_medium_wednesday">qua</string> + <string name="day_of_week_medium_thursday">qui</string> + <string name="day_of_week_medium_friday">sex</string> + <string name="day_of_week_medium_saturday">sáb</string> + + <string name="day_of_week_short_sunday">dom</string> + <string name="day_of_week_short_monday">seg</string> + <string name="day_of_week_short_tuesday">ter</string> + <string name="day_of_week_short_wednesday">qua</string> + <string name="day_of_week_short_thursday">qui</string> + <string name="day_of_week_short_friday">sex</string> + <string name="day_of_week_short_saturday">sáb</string> + + <string name="day_of_week_shortest_sunday">D</string> + <string name="day_of_week_shortest_monday">S</string> + <string name="day_of_week_shortest_tuesday">T</string> + <string name="day_of_week_shortest_wednesday">Q</string> + <string name="day_of_week_shortest_thursday">Q</string> + <string name="day_of_week_shortest_friday">S</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">Antes do meio-dia</string> + <string name="pm">Depois do meio-dia</string> + <string name="yesterday">Ontem</string> + <string name="today">Hoje</string> + <string name="tomorrow">Amanhã</string> + + <string name="hour_minute_ampm">%H:%M</string> + <string name="hour_minute_cap_ampm">%H:%M</string> + <string name="numeric_date">%d/%m/%Y</string> + <string name="numeric_date_format">dd/MM/yyyy</string> + <string name="month_day_year">%-e de %B de %Y</string> + <string name="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%H:%M:%S %-e de %b de %Y</string> + <string name="abbrev_month_day_year">%-e de %b de %Y</string> + <string name="month_day">%-e de %B</string> + <string name="month">%-B</string> + <string name="month_year">%B de %Y</string> + <string name="abbrev_month_day">%-e de %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b de %Y</string> +</resources> diff --git a/core/res/res/values-ro-rRO/donottranslate-cldr.xml b/core/res/res/values-ro-rRO/donottranslate-cldr.xml new file mode 100644 index 0000000..1ed2c81 --- /dev/null +++ b/core/res/res/values-ro-rRO/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">ianuarie</string> + <string name="month_long_standalone_february">februarie</string> + <string name="month_long_standalone_march">martie</string> + <string name="month_long_standalone_april">aprilie</string> + <string name="month_long_standalone_may">mai</string> + <string name="month_long_standalone_june">iunie</string> + <string name="month_long_standalone_july">iulie</string> + <string name="month_long_standalone_august">august</string> + <string name="month_long_standalone_september">septembrie</string> + <string name="month_long_standalone_october">octombrie</string> + <string name="month_long_standalone_november">noiembrie</string> + <string name="month_long_standalone_december">decembrie</string> + + <string name="month_long_january">ianuarie</string> + <string name="month_long_february">februarie</string> + <string name="month_long_march">martie</string> + <string name="month_long_april">aprilie</string> + <string name="month_long_may">mai</string> + <string name="month_long_june">iunie</string> + <string name="month_long_july">iulie</string> + <string name="month_long_august">august</string> + <string name="month_long_september">septembrie</string> + <string name="month_long_october">octombrie</string> + <string name="month_long_november">noiembrie</string> + <string name="month_long_december">decembrie</string> + + <string name="month_medium_january">ian.</string> + <string name="month_medium_february">feb.</string> + <string name="month_medium_march">mar.</string> + <string name="month_medium_april">apr.</string> + <string name="month_medium_may">mai</string> + <string name="month_medium_june">iun.</string> + <string name="month_medium_july">iul.</string> + <string name="month_medium_august">aug.</string> + <string name="month_medium_september">sept.</string> + <string name="month_medium_october">oct.</string> + <string name="month_medium_november">nov.</string> + <string name="month_medium_december">dec.</string> + + <string name="month_shortest_january">I</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">I</string> + <string name="month_shortest_july">I</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">duminică</string> + <string name="day_of_week_long_monday">luni</string> + <string name="day_of_week_long_tuesday">marți</string> + <string name="day_of_week_long_wednesday">miercuri</string> + <string name="day_of_week_long_thursday">joi</string> + <string name="day_of_week_long_friday">vineri</string> + <string name="day_of_week_long_saturday">sâmbătă</string> + + <string name="day_of_week_medium_sunday">Du</string> + <string name="day_of_week_medium_monday">Lu</string> + <string name="day_of_week_medium_tuesday">Ma</string> + <string name="day_of_week_medium_wednesday">Mi</string> + <string name="day_of_week_medium_thursday">Jo</string> + <string name="day_of_week_medium_friday">Vi</string> + <string name="day_of_week_medium_saturday">Sâ</string> + + <string name="day_of_week_short_sunday">Du</string> + <string name="day_of_week_short_monday">Lu</string> + <string name="day_of_week_short_tuesday">Ma</string> + <string name="day_of_week_short_wednesday">Mi</string> + <string name="day_of_week_short_thursday">Jo</string> + <string name="day_of_week_short_friday">Vi</string> + <string name="day_of_week_short_saturday">Sâ</string> + + <string name="day_of_week_shortest_sunday">D</string> + <string name="day_of_week_shortest_monday">L</string> + <string name="day_of_week_shortest_tuesday">M</string> + <string name="day_of_week_shortest_wednesday">M</string> + <string name="day_of_week_shortest_thursday">J</string> + <string name="day_of_week_shortest_friday">V</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">AM</string> + <string name="pm">PM</string> + <string name="yesterday">ieri</string> + <string name="today">azi</string> + <string name="tomorrow">mâine</string> + + <string name="hour_minute_ampm">%H:%M</string> + <string name="hour_minute_cap_ampm">%H:%M</string> + <string name="numeric_date">%d.%m.%Y</string> + <string name="numeric_date_format">dd.MM.yyyy</string> + <string name="month_day_year">%-e %B %Y</string> + <string name="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%H:%M:%S, %d.%m.%Y</string> + <string name="abbrev_month_day_year">%d.%m.%Y</string> + <string name="month_day">%-e %B</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%-e %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-ru-rRU/donottranslate-cldr.xml b/core/res/res/values-ru-rRU/donottranslate-cldr.xml new file mode 100644 index 0000000..8faeb44 --- /dev/null +++ b/core/res/res/values-ru-rRU/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">Январь</string> + <string name="month_long_standalone_february">Февраль</string> + <string name="month_long_standalone_march">Март</string> + <string name="month_long_standalone_april">Апрель</string> + <string name="month_long_standalone_may">Май</string> + <string name="month_long_standalone_june">Июнь</string> + <string name="month_long_standalone_july">Июль</string> + <string name="month_long_standalone_august">Август</string> + <string name="month_long_standalone_september">Сентябрь</string> + <string name="month_long_standalone_october">Октябрь</string> + <string name="month_long_standalone_november">Ноябрь</string> + <string name="month_long_standalone_december">Декабрь</string> + + <string name="month_long_january">января</string> + <string name="month_long_february">февраля</string> + <string name="month_long_march">марта</string> + <string name="month_long_april">апреля</string> + <string name="month_long_may">мая</string> + <string name="month_long_june">июня</string> + <string name="month_long_july">июля</string> + <string name="month_long_august">августа</string> + <string name="month_long_september">сентября</string> + <string name="month_long_october">октября</string> + <string name="month_long_november">ноября</string> + <string name="month_long_december">декабря</string> + + <string name="month_medium_january">янв.</string> + <string name="month_medium_february">февр.</string> + <string name="month_medium_march">марта</string> + <string name="month_medium_april">апр.</string> + <string name="month_medium_may">мая</string> + <string name="month_medium_june">июня</string> + <string name="month_medium_july">июля</string> + <string name="month_medium_august">авг.</string> + <string name="month_medium_september">сент.</string> + <string name="month_medium_october">окт.</string> + <string name="month_medium_november">нояб.</string> + <string name="month_medium_december">дек.</string> + + <string name="month_shortest_january">Я</string> + <string name="month_shortest_february">Ф</string> + <string name="month_shortest_march">М</string> + <string name="month_shortest_april">А</string> + <string name="month_shortest_may">М</string> + <string name="month_shortest_june">И</string> + <string name="month_shortest_july">И</string> + <string name="month_shortest_august">А</string> + <string name="month_shortest_september">С</string> + <string name="month_shortest_october">О</string> + <string name="month_shortest_november">Н</string> + <string name="month_shortest_december">Д</string> + + <string name="day_of_week_long_sunday">воскресенье</string> + <string name="day_of_week_long_monday">понедельник</string> + <string name="day_of_week_long_tuesday">вторник</string> + <string name="day_of_week_long_wednesday">среда</string> + <string name="day_of_week_long_thursday">четверг</string> + <string name="day_of_week_long_friday">пятница</string> + <string name="day_of_week_long_saturday">суббота</string> + + <string name="day_of_week_medium_sunday">Вс</string> + <string name="day_of_week_medium_monday">Пн</string> + <string name="day_of_week_medium_tuesday">Вт</string> + <string name="day_of_week_medium_wednesday">Ср</string> + <string name="day_of_week_medium_thursday">Чт</string> + <string name="day_of_week_medium_friday">Пт</string> + <string name="day_of_week_medium_saturday">Сб</string> + + <string name="day_of_week_short_sunday">Вс</string> + <string name="day_of_week_short_monday">Пн</string> + <string name="day_of_week_short_tuesday">Вт</string> + <string name="day_of_week_short_wednesday">Ср</string> + <string name="day_of_week_short_thursday">Чт</string> + <string name="day_of_week_short_friday">Пт</string> + <string name="day_of_week_short_saturday">Сб</string> + + <string name="day_of_week_shortest_sunday">В</string> + <string name="day_of_week_shortest_monday">П</string> + <string name="day_of_week_shortest_tuesday">В</string> + <string name="day_of_week_shortest_wednesday">С</string> + <string name="day_of_week_shortest_thursday">Ч</string> + <string name="day_of_week_shortest_friday">П</string> + <string name="day_of_week_shortest_saturday">С</string> + + <string name="am">AM</string> + <string name="pm">PM</string> + <string name="yesterday">Вчера</string> + <string name="today">Сегодня</string> + <string name="tomorrow">Завтра</string> + + <string name="hour_minute_ampm">%-k:%M</string> + <string name="hour_minute_cap_ampm">%-k:%M</string> + <string name="numeric_date">%d.%m.%Y</string> + <string name="numeric_date_format">dd.MM.yyyy</string> + <string name="month_day_year">%-e %B %Y г.</string> + <string name="time_of_day">%-k:%M:%S</string> + <string name="date_and_time">%-k:%M:%S %d.%m.%Y</string> + <string name="abbrev_month_day_year">%d.%m.%Y</string> + <string name="month_day">%-e %B</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%-e %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-ru/donottranslate-cldr.xml b/core/res/res/values-ru/donottranslate-cldr.xml new file mode 100644 index 0000000..8faeb44 --- /dev/null +++ b/core/res/res/values-ru/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">Январь</string> + <string name="month_long_standalone_february">Февраль</string> + <string name="month_long_standalone_march">Март</string> + <string name="month_long_standalone_april">Апрель</string> + <string name="month_long_standalone_may">Май</string> + <string name="month_long_standalone_june">Июнь</string> + <string name="month_long_standalone_july">Июль</string> + <string name="month_long_standalone_august">Август</string> + <string name="month_long_standalone_september">Сентябрь</string> + <string name="month_long_standalone_october">Октябрь</string> + <string name="month_long_standalone_november">Ноябрь</string> + <string name="month_long_standalone_december">Декабрь</string> + + <string name="month_long_january">января</string> + <string name="month_long_february">февраля</string> + <string name="month_long_march">марта</string> + <string name="month_long_april">апреля</string> + <string name="month_long_may">мая</string> + <string name="month_long_june">июня</string> + <string name="month_long_july">июля</string> + <string name="month_long_august">августа</string> + <string name="month_long_september">сентября</string> + <string name="month_long_october">октября</string> + <string name="month_long_november">ноября</string> + <string name="month_long_december">декабря</string> + + <string name="month_medium_january">янв.</string> + <string name="month_medium_february">февр.</string> + <string name="month_medium_march">марта</string> + <string name="month_medium_april">апр.</string> + <string name="month_medium_may">мая</string> + <string name="month_medium_june">июня</string> + <string name="month_medium_july">июля</string> + <string name="month_medium_august">авг.</string> + <string name="month_medium_september">сент.</string> + <string name="month_medium_october">окт.</string> + <string name="month_medium_november">нояб.</string> + <string name="month_medium_december">дек.</string> + + <string name="month_shortest_january">Я</string> + <string name="month_shortest_february">Ф</string> + <string name="month_shortest_march">М</string> + <string name="month_shortest_april">А</string> + <string name="month_shortest_may">М</string> + <string name="month_shortest_june">И</string> + <string name="month_shortest_july">И</string> + <string name="month_shortest_august">А</string> + <string name="month_shortest_september">С</string> + <string name="month_shortest_october">О</string> + <string name="month_shortest_november">Н</string> + <string name="month_shortest_december">Д</string> + + <string name="day_of_week_long_sunday">воскресенье</string> + <string name="day_of_week_long_monday">понедельник</string> + <string name="day_of_week_long_tuesday">вторник</string> + <string name="day_of_week_long_wednesday">среда</string> + <string name="day_of_week_long_thursday">четверг</string> + <string name="day_of_week_long_friday">пятница</string> + <string name="day_of_week_long_saturday">суббота</string> + + <string name="day_of_week_medium_sunday">Вс</string> + <string name="day_of_week_medium_monday">Пн</string> + <string name="day_of_week_medium_tuesday">Вт</string> + <string name="day_of_week_medium_wednesday">Ср</string> + <string name="day_of_week_medium_thursday">Чт</string> + <string name="day_of_week_medium_friday">Пт</string> + <string name="day_of_week_medium_saturday">Сб</string> + + <string name="day_of_week_short_sunday">Вс</string> + <string name="day_of_week_short_monday">Пн</string> + <string name="day_of_week_short_tuesday">Вт</string> + <string name="day_of_week_short_wednesday">Ср</string> + <string name="day_of_week_short_thursday">Чт</string> + <string name="day_of_week_short_friday">Пт</string> + <string name="day_of_week_short_saturday">Сб</string> + + <string name="day_of_week_shortest_sunday">В</string> + <string name="day_of_week_shortest_monday">П</string> + <string name="day_of_week_shortest_tuesday">В</string> + <string name="day_of_week_shortest_wednesday">С</string> + <string name="day_of_week_shortest_thursday">Ч</string> + <string name="day_of_week_shortest_friday">П</string> + <string name="day_of_week_shortest_saturday">С</string> + + <string name="am">AM</string> + <string name="pm">PM</string> + <string name="yesterday">Вчера</string> + <string name="today">Сегодня</string> + <string name="tomorrow">Завтра</string> + + <string name="hour_minute_ampm">%-k:%M</string> + <string name="hour_minute_cap_ampm">%-k:%M</string> + <string name="numeric_date">%d.%m.%Y</string> + <string name="numeric_date_format">dd.MM.yyyy</string> + <string name="month_day_year">%-e %B %Y г.</string> + <string name="time_of_day">%-k:%M:%S</string> + <string name="date_and_time">%-k:%M:%S %d.%m.%Y</string> + <string name="abbrev_month_day_year">%d.%m.%Y</string> + <string name="month_day">%-e %B</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%-e %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index fac6cb7..2a15c43 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -418,9 +418,6 @@ <string name="lockscreen_glogin_password_hint">"Пароль"</string> <string name="lockscreen_glogin_submit_button">"Войти"</string> <string name="lockscreen_glogin_invalid_input">"Недействительное имя пользователя или пароль."</string> - <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string> - <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string> - <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string> <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string> <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string> <string name="status_bar_clear_all_button">"Очистить уведомления"</string> @@ -452,9 +449,6 @@ <string name="menu_enter_shortcut_label">"ввод"</string> <string name="menu_delete_shortcut_label">"удалить"</string> <string name="search_go">"Поиск"</string> - <string name="today">"Сегодня"</string> - <string name="yesterday">"Вчера"</string> - <string name="tomorrow">"Завтра"</string> <string name="oneMonthDurationPast">"1 месяц назад"</string> <string name="beforeOneMonthDurationPast">"Больше 1 месяца назад"</string> <plurals name="num_seconds_ago"> @@ -536,13 +530,6 @@ <string name="weeks">"недели"</string> <string name="year">"год"</string> <string name="years">"годы"</string> - <string name="sunday">"воскресенье"</string> - <string name="monday">"понедельник"</string> - <string name="tuesday">"вторник"</string> - <string name="wednesday">"среда"</string> - <string name="thursday">"четверг"</string> - <string name="friday">"пятница"</string> - <string name="saturday">"суббота"</string> <string name="every_weekday">"По рабочим дням (пн-пт)"</string> <string name="daily">"Ежедневно"</string> <string name="weekly">"Еженедельно в: <xliff:g id="DAY">%s</xliff:g>"</string> @@ -552,9 +539,6 @@ <string name="VideoView_error_text_invalid_progressive_playback">"К сожалению, это видео не подходит для потокового воспроизведения на данном устройстве."</string> <string name="VideoView_error_text_unknown">"К сожалению, это видео нельзя воспроизвести."</string> <string name="VideoView_error_button">"ОК"</string> - <string name="am">"AM"</string> - <string name="pm">"PM"</string> - <string name="numeric_date">"<xliff:g id="DAY">%d</xliff:g>/<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="YEAR">%Y</xliff:g>"</string> <string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string> <string name="wday1_date1_wday2_date2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>"</string> <string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string> @@ -566,23 +550,12 @@ <string name="date_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="time_wday">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>"</string> - <string name="full_date_month_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="full_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="medium_date_month_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="medium_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="twelve_hour_time_format" format="date">"<xliff:g id="HOUR">h</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>' '<xliff:g id="AMPM">a</xliff:g>"</string> - <string name="twenty_four_hour_time_format" format="date">"<xliff:g id="HOUR">HH</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>"</string> <string name="noon">"полдень"</string> <string name="Noon">"Полдень"</string> <string name="midnight">"полночь"</string> <string name="Midnight">"Полночь"</string> - <string name="month_day">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g>"</string> <!-- no translation found for month (7026169712234774086) --> <skip /> - <string name="month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="month_year">"<xliff:g id="YEAR">%Y</xliff:g> <xliff:g id="MONTH">%B</xliff:g> г."</string> - <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string> - <string name="date_and_time">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g> <xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> <string name="same_year_md1_md2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>"</string> <string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>"</string> <string name="same_year_mdy1_mdy2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR">%9$s</xliff:g>"</string> @@ -607,82 +580,8 @@ <string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string> <string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string> <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string> - <string name="abbrev_month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string> - <string name="abbrev_month_year">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g> г."</string> - <string name="abbrev_month_day">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%b</xliff:g>"</string> <!-- no translation found for abbrev_month (3131032032850777433) --> <skip /> - <string name="day_of_week_long_sunday">"воскресенье"</string> - <string name="day_of_week_long_monday">"понедельник"</string> - <string name="day_of_week_long_tuesday">"вторник"</string> - <string name="day_of_week_long_wednesday">"среда"</string> - <string name="day_of_week_long_thursday">"четверг"</string> - <string name="day_of_week_long_friday">"пятница"</string> - <string name="day_of_week_long_saturday">"суббота"</string> - <string name="day_of_week_medium_sunday">"вс"</string> - <string name="day_of_week_medium_monday">"пн"</string> - <string name="day_of_week_medium_tuesday">"вт"</string> - <string name="day_of_week_medium_wednesday">"ср"</string> - <string name="day_of_week_medium_thursday">"чт"</string> - <string name="day_of_week_medium_friday">"пт"</string> - <string name="day_of_week_medium_saturday">"сб"</string> - <string name="day_of_week_short_sunday">"вс"</string> - <string name="day_of_week_short_monday">"пн"</string> - <string name="day_of_week_short_tuesday">"вт"</string> - <string name="day_of_week_short_wednesday">"ср"</string> - <string name="day_of_week_short_thursday">"чт"</string> - <string name="day_of_week_short_friday">"пт"</string> - <string name="day_of_week_short_saturday">"сб"</string> - <string name="day_of_week_shorter_sunday">"вс"</string> - <string name="day_of_week_shorter_monday">"пн"</string> - <string name="day_of_week_shorter_tuesday">"вт"</string> - <string name="day_of_week_shorter_wednesday">"с"</string> - <string name="day_of_week_shorter_thursday">"чт"</string> - <string name="day_of_week_shorter_friday">"пт"</string> - <string name="day_of_week_shorter_saturday">"сб"</string> - <string name="day_of_week_shortest_sunday">"в"</string> - <string name="day_of_week_shortest_monday">"п"</string> - <string name="day_of_week_shortest_tuesday">"в"</string> - <string name="day_of_week_shortest_wednesday">"с"</string> - <string name="day_of_week_shortest_thursday">"ч"</string> - <string name="day_of_week_shortest_friday">"п"</string> - <string name="day_of_week_shortest_saturday">"с"</string> - <string name="month_long_january">"январь"</string> - <string name="month_long_february">"февраль"</string> - <string name="month_long_march">"март"</string> - <string name="month_long_april">"апрель"</string> - <string name="month_long_may">"май"</string> - <string name="month_long_june">"июнь"</string> - <string name="month_long_july">"июль"</string> - <string name="month_long_august">"август"</string> - <string name="month_long_september">"сентябрь"</string> - <string name="month_long_october">"октябрь"</string> - <string name="month_long_november">"ноябрь"</string> - <string name="month_long_december">"декабрь"</string> - <string name="month_medium_january">"янв"</string> - <string name="month_medium_february">"фев"</string> - <string name="month_medium_march">"мар"</string> - <string name="month_medium_april">"апр"</string> - <string name="month_medium_may">"май"</string> - <string name="month_medium_june">"июн"</string> - <string name="month_medium_july">"июл"</string> - <string name="month_medium_august">"авг"</string> - <string name="month_medium_september">"сен"</string> - <string name="month_medium_october">"окт"</string> - <string name="month_medium_november">"ноя"</string> - <string name="month_medium_december">"дек"</string> - <string name="month_shortest_january">"Я"</string> - <string name="month_shortest_february">"ф"</string> - <string name="month_shortest_march">"м"</string> - <string name="month_shortest_april">"а"</string> - <string name="month_shortest_may">"м"</string> - <string name="month_shortest_june">"и"</string> - <string name="month_shortest_july">"и"</string> - <string name="month_shortest_august">"а"</string> - <string name="month_shortest_september">"с"</string> - <string name="month_shortest_october">"о"</string> - <string name="month_shortest_november">"н"</string> - <string name="month_shortest_december">"д"</string> <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string> <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string> <string name="selectAll">"Выбрать все"</string> diff --git a/core/res/res/values-sk-rSK/donottranslate-cldr.xml b/core/res/res/values-sk-rSK/donottranslate-cldr.xml new file mode 100644 index 0000000..05bc5d3 --- /dev/null +++ b/core/res/res/values-sk-rSK/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">január</string> + <string name="month_long_standalone_february">február</string> + <string name="month_long_standalone_march">marec</string> + <string name="month_long_standalone_april">apríl</string> + <string name="month_long_standalone_may">máj</string> + <string name="month_long_standalone_june">jún</string> + <string name="month_long_standalone_july">júl</string> + <string name="month_long_standalone_august">august</string> + <string name="month_long_standalone_september">september</string> + <string name="month_long_standalone_october">október</string> + <string name="month_long_standalone_november">november</string> + <string name="month_long_standalone_december">december</string> + + <string name="month_long_january">januára</string> + <string name="month_long_february">februára</string> + <string name="month_long_march">marca</string> + <string name="month_long_april">apríla</string> + <string name="month_long_may">mája</string> + <string name="month_long_june">júna</string> + <string name="month_long_july">júla</string> + <string name="month_long_august">augusta</string> + <string name="month_long_september">septembra</string> + <string name="month_long_october">októbra</string> + <string name="month_long_november">novembra</string> + <string name="month_long_december">decembra</string> + + <string name="month_medium_january">jan</string> + <string name="month_medium_february">feb</string> + <string name="month_medium_march">mar</string> + <string name="month_medium_april">apr</string> + <string name="month_medium_may">máj</string> + <string name="month_medium_june">jún</string> + <string name="month_medium_july">júl</string> + <string name="month_medium_august">aug</string> + <string name="month_medium_september">sep</string> + <string name="month_medium_october">okt</string> + <string name="month_medium_november">nov</string> + <string name="month_medium_december">dec</string> + + <string name="month_shortest_january">j</string> + <string name="month_shortest_february">f</string> + <string name="month_shortest_march">m</string> + <string name="month_shortest_april">a</string> + <string name="month_shortest_may">m</string> + <string name="month_shortest_june">j</string> + <string name="month_shortest_july">j</string> + <string name="month_shortest_august">a</string> + <string name="month_shortest_september">s</string> + <string name="month_shortest_october">o</string> + <string name="month_shortest_november">n</string> + <string name="month_shortest_december">d</string> + + <string name="day_of_week_long_sunday">nedeľa</string> + <string name="day_of_week_long_monday">pondelok</string> + <string name="day_of_week_long_tuesday">utorok</string> + <string name="day_of_week_long_wednesday">streda</string> + <string name="day_of_week_long_thursday">štvrtok</string> + <string name="day_of_week_long_friday">piatok</string> + <string name="day_of_week_long_saturday">sobota</string> + + <string name="day_of_week_medium_sunday">ne</string> + <string name="day_of_week_medium_monday">po</string> + <string name="day_of_week_medium_tuesday">ut</string> + <string name="day_of_week_medium_wednesday">st</string> + <string name="day_of_week_medium_thursday">št</string> + <string name="day_of_week_medium_friday">pi</string> + <string name="day_of_week_medium_saturday">so</string> + + <string name="day_of_week_short_sunday">ne</string> + <string name="day_of_week_short_monday">po</string> + <string name="day_of_week_short_tuesday">ut</string> + <string name="day_of_week_short_wednesday">st</string> + <string name="day_of_week_short_thursday">št</string> + <string name="day_of_week_short_friday">pi</string> + <string name="day_of_week_short_saturday">so</string> + + <string name="day_of_week_shortest_sunday">N</string> + <string name="day_of_week_shortest_monday">P</string> + <string name="day_of_week_shortest_tuesday">U</string> + <string name="day_of_week_shortest_wednesday">S</string> + <string name="day_of_week_shortest_thursday">Š</string> + <string name="day_of_week_shortest_friday">P</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">dopoludnia</string> + <string name="pm">popoludní</string> + <string name="yesterday">Včera</string> + <string name="today">Dnes</string> + <string name="tomorrow">Zajtra</string> + + <string name="hour_minute_ampm">%-k:%M</string> + <string name="hour_minute_cap_ampm">%-k:%M</string> + <string name="numeric_date">%-e.%-m.%Y</string> + <string name="numeric_date_format">d.M.yyyy</string> + <string name="month_day_year">%-e. %B %Y</string> + <string name="time_of_day">%-k:%M:%S</string> + <string name="date_and_time">%-k:%M:%S %-e.%-m.%Y</string> + <string name="abbrev_month_day_year">%-e.%-m.%Y</string> + <string name="month_day">%-e. %B</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%-e. %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-sl-rSI/donottranslate-cldr.xml b/core/res/res/values-sl-rSI/donottranslate-cldr.xml new file mode 100644 index 0000000..e24b070 --- /dev/null +++ b/core/res/res/values-sl-rSI/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">januar</string> + <string name="month_long_standalone_february">februar</string> + <string name="month_long_standalone_march">marec</string> + <string name="month_long_standalone_april">april</string> + <string name="month_long_standalone_may">maj</string> + <string name="month_long_standalone_june">junij</string> + <string name="month_long_standalone_july">julij</string> + <string name="month_long_standalone_august">avgust</string> + <string name="month_long_standalone_september">september</string> + <string name="month_long_standalone_october">oktober</string> + <string name="month_long_standalone_november">november</string> + <string name="month_long_standalone_december">december</string> + + <string name="month_long_january">januar</string> + <string name="month_long_february">februar</string> + <string name="month_long_march">marec</string> + <string name="month_long_april">april</string> + <string name="month_long_may">maj</string> + <string name="month_long_june">junij</string> + <string name="month_long_july">julij</string> + <string name="month_long_august">avgust</string> + <string name="month_long_september">september</string> + <string name="month_long_october">oktober</string> + <string name="month_long_november">november</string> + <string name="month_long_december">december</string> + + <string name="month_medium_january">jan</string> + <string name="month_medium_february">feb</string> + <string name="month_medium_march">mar</string> + <string name="month_medium_april">apr</string> + <string name="month_medium_may">maj</string> + <string name="month_medium_june">jun</string> + <string name="month_medium_july">jul</string> + <string name="month_medium_august">avg</string> + <string name="month_medium_september">sep</string> + <string name="month_medium_october">okt</string> + <string name="month_medium_november">nov</string> + <string name="month_medium_december">dec</string> + + <string name="month_shortest_january">j</string> + <string name="month_shortest_february">f</string> + <string name="month_shortest_march">m</string> + <string name="month_shortest_april">a</string> + <string name="month_shortest_may">m</string> + <string name="month_shortest_june">j</string> + <string name="month_shortest_july">j</string> + <string name="month_shortest_august">a</string> + <string name="month_shortest_september">s</string> + <string name="month_shortest_october">o</string> + <string name="month_shortest_november">n</string> + <string name="month_shortest_december">d</string> + + <string name="day_of_week_long_sunday">nedelja</string> + <string name="day_of_week_long_monday">ponedeljek</string> + <string name="day_of_week_long_tuesday">torek</string> + <string name="day_of_week_long_wednesday">sreda</string> + <string name="day_of_week_long_thursday">četrtek</string> + <string name="day_of_week_long_friday">petek</string> + <string name="day_of_week_long_saturday">sobota</string> + + <string name="day_of_week_medium_sunday">ned</string> + <string name="day_of_week_medium_monday">pon</string> + <string name="day_of_week_medium_tuesday">tor</string> + <string name="day_of_week_medium_wednesday">sre</string> + <string name="day_of_week_medium_thursday">čet</string> + <string name="day_of_week_medium_friday">pet</string> + <string name="day_of_week_medium_saturday">sob</string> + + <string name="day_of_week_short_sunday">ned</string> + <string name="day_of_week_short_monday">pon</string> + <string name="day_of_week_short_tuesday">tor</string> + <string name="day_of_week_short_wednesday">sre</string> + <string name="day_of_week_short_thursday">čet</string> + <string name="day_of_week_short_friday">pet</string> + <string name="day_of_week_short_saturday">sob</string> + + <string name="day_of_week_shortest_sunday">n</string> + <string name="day_of_week_shortest_monday">p</string> + <string name="day_of_week_shortest_tuesday">t</string> + <string name="day_of_week_shortest_wednesday">s</string> + <string name="day_of_week_shortest_thursday">č</string> + <string name="day_of_week_shortest_friday">p</string> + <string name="day_of_week_shortest_saturday">s</string> + + <string name="am">dop.</string> + <string name="pm">pop.</string> + <string name="yesterday">Včeraj</string> + <string name="today">Danes</string> + <string name="tomorrow">Jutri</string> + + <string name="hour_minute_ampm">%H:%M</string> + <string name="hour_minute_cap_ampm">%H:%M</string> + <string name="numeric_date">%-e. %m. %Y</string> + <string name="numeric_date_format">d. MM. yyyy</string> + <string name="month_day_year">%d. %B %Y</string> + <string name="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%H:%M:%S %-e. %b. %Y</string> + <string name="abbrev_month_day_year">%-e. %b. %Y</string> + <string name="month_day">%-e. %B</string> + <string name="month">%-B</string> + <string name="month_year">%Y %B</string> + <string name="abbrev_month_day">%b %-e</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%Y %b</string> +</resources> diff --git a/core/res/res/values-sr-rRS/donottranslate-cldr.xml b/core/res/res/values-sr-rRS/donottranslate-cldr.xml new file mode 100644 index 0000000..7f98ae2 --- /dev/null +++ b/core/res/res/values-sr-rRS/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">јануар</string> + <string name="month_long_standalone_february">фебруар</string> + <string name="month_long_standalone_march">март</string> + <string name="month_long_standalone_april">април</string> + <string name="month_long_standalone_may">мај</string> + <string name="month_long_standalone_june">јун</string> + <string name="month_long_standalone_july">јул</string> + <string name="month_long_standalone_august">август</string> + <string name="month_long_standalone_september">септембар</string> + <string name="month_long_standalone_october">октобар</string> + <string name="month_long_standalone_november">новембар</string> + <string name="month_long_standalone_december">децембар</string> + + <string name="month_long_january">јануар</string> + <string name="month_long_february">фебруар</string> + <string name="month_long_march">март</string> + <string name="month_long_april">април</string> + <string name="month_long_may">мај</string> + <string name="month_long_june">јун</string> + <string name="month_long_july">јул</string> + <string name="month_long_august">август</string> + <string name="month_long_september">септембар</string> + <string name="month_long_october">октобар</string> + <string name="month_long_november">новембар</string> + <string name="month_long_december">децембар</string> + + <string name="month_medium_january">јан</string> + <string name="month_medium_february">феб</string> + <string name="month_medium_march">мар</string> + <string name="month_medium_april">апр</string> + <string name="month_medium_may">мај</string> + <string name="month_medium_june">јун</string> + <string name="month_medium_july">јул</string> + <string name="month_medium_august">авг</string> + <string name="month_medium_september">сеп</string> + <string name="month_medium_october">окт</string> + <string name="month_medium_november">нов</string> + <string name="month_medium_december">дец</string> + + <string name="month_shortest_january">ј</string> + <string name="month_shortest_february">ф</string> + <string name="month_shortest_march">м</string> + <string name="month_shortest_april">а</string> + <string name="month_shortest_may">м</string> + <string name="month_shortest_june">ј</string> + <string name="month_shortest_july">ј</string> + <string name="month_shortest_august">а</string> + <string name="month_shortest_september">с</string> + <string name="month_shortest_october">о</string> + <string name="month_shortest_november">н</string> + <string name="month_shortest_december">д</string> + + <string name="day_of_week_long_sunday">недеља</string> + <string name="day_of_week_long_monday">понедељак</string> + <string name="day_of_week_long_tuesday">уторак</string> + <string name="day_of_week_long_wednesday">среда</string> + <string name="day_of_week_long_thursday">четвртак</string> + <string name="day_of_week_long_friday">петак</string> + <string name="day_of_week_long_saturday">субота</string> + + <string name="day_of_week_medium_sunday">нед</string> + <string name="day_of_week_medium_monday">пон</string> + <string name="day_of_week_medium_tuesday">уто</string> + <string name="day_of_week_medium_wednesday">сре</string> + <string name="day_of_week_medium_thursday">чет</string> + <string name="day_of_week_medium_friday">пет</string> + <string name="day_of_week_medium_saturday">суб</string> + + <string name="day_of_week_short_sunday">нед</string> + <string name="day_of_week_short_monday">пон</string> + <string name="day_of_week_short_tuesday">уто</string> + <string name="day_of_week_short_wednesday">сре</string> + <string name="day_of_week_short_thursday">чет</string> + <string name="day_of_week_short_friday">пет</string> + <string name="day_of_week_short_saturday">суб</string> + + <string name="day_of_week_shortest_sunday">н</string> + <string name="day_of_week_shortest_monday">п</string> + <string name="day_of_week_shortest_tuesday">у</string> + <string name="day_of_week_shortest_wednesday">с</string> + <string name="day_of_week_shortest_thursday">ч</string> + <string name="day_of_week_shortest_friday">п</string> + <string name="day_of_week_shortest_saturday">с</string> + + <string name="am">пре подне</string> + <string name="pm">поподне</string> + <string name="yesterday">јуче</string> + <string name="today">данас</string> + <string name="tomorrow">сутра</string> + + <string name="hour_minute_ampm">%H.%M</string> + <string name="hour_minute_cap_ampm">%H.%M</string> + <string name="numeric_date">%-e.%-m.%Y.</string> + <string name="numeric_date_format">d.M.yyyy.</string> + <string name="month_day_year">%d. %B %Y.</string> + <string name="time_of_day">%H.%M.%S</string> + <string name="date_and_time">%H.%M.%S %d.%m.%Y.</string> + <string name="abbrev_month_day_year">%d.%m.%Y.</string> + <string name="month_day">%B %-e.</string> + <string name="month">%-B</string> + <string name="month_year">%Y %B</string> + <string name="abbrev_month_day">%b %-e.</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b. %Y</string> +</resources> diff --git a/core/res/res/values-sv-rSE/donottranslate-cldr.xml b/core/res/res/values-sv-rSE/donottranslate-cldr.xml new file mode 100644 index 0000000..4570245 --- /dev/null +++ b/core/res/res/values-sv-rSE/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">januari</string> + <string name="month_long_standalone_february">februari</string> + <string name="month_long_standalone_march">mars</string> + <string name="month_long_standalone_april">april</string> + <string name="month_long_standalone_may">maj</string> + <string name="month_long_standalone_june">juni</string> + <string name="month_long_standalone_july">juli</string> + <string name="month_long_standalone_august">augusti</string> + <string name="month_long_standalone_september">september</string> + <string name="month_long_standalone_october">oktober</string> + <string name="month_long_standalone_november">november</string> + <string name="month_long_standalone_december">december</string> + + <string name="month_long_january">januari</string> + <string name="month_long_february">februari</string> + <string name="month_long_march">mars</string> + <string name="month_long_april">april</string> + <string name="month_long_may">maj</string> + <string name="month_long_june">juni</string> + <string name="month_long_july">juli</string> + <string name="month_long_august">augusti</string> + <string name="month_long_september">september</string> + <string name="month_long_october">oktober</string> + <string name="month_long_november">november</string> + <string name="month_long_december">december</string> + + <string name="month_medium_january">jan</string> + <string name="month_medium_february">feb</string> + <string name="month_medium_march">mar</string> + <string name="month_medium_april">apr</string> + <string name="month_medium_may">maj</string> + <string name="month_medium_june">jun</string> + <string name="month_medium_july">jul</string> + <string name="month_medium_august">aug</string> + <string name="month_medium_september">sep</string> + <string name="month_medium_october">okt</string> + <string name="month_medium_november">nov</string> + <string name="month_medium_december">dec</string> + + <string name="month_shortest_january">J</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">söndag</string> + <string name="day_of_week_long_monday">måndag</string> + <string name="day_of_week_long_tuesday">tisdag</string> + <string name="day_of_week_long_wednesday">onsdag</string> + <string name="day_of_week_long_thursday">torsdag</string> + <string name="day_of_week_long_friday">fredag</string> + <string name="day_of_week_long_saturday">lördag</string> + + <string name="day_of_week_medium_sunday">sön</string> + <string name="day_of_week_medium_monday">mån</string> + <string name="day_of_week_medium_tuesday">tis</string> + <string name="day_of_week_medium_wednesday">ons</string> + <string name="day_of_week_medium_thursday">tors</string> + <string name="day_of_week_medium_friday">fre</string> + <string name="day_of_week_medium_saturday">lör</string> + + <string name="day_of_week_short_sunday">sön</string> + <string name="day_of_week_short_monday">mån</string> + <string name="day_of_week_short_tuesday">tis</string> + <string name="day_of_week_short_wednesday">ons</string> + <string name="day_of_week_short_thursday">tors</string> + <string name="day_of_week_short_friday">fre</string> + <string name="day_of_week_short_saturday">lör</string> + + <string name="day_of_week_shortest_sunday">S</string> + <string name="day_of_week_shortest_monday">M</string> + <string name="day_of_week_shortest_tuesday">T</string> + <string name="day_of_week_shortest_wednesday">O</string> + <string name="day_of_week_shortest_thursday">T</string> + <string name="day_of_week_shortest_friday">F</string> + <string name="day_of_week_shortest_saturday">L</string> + + <string name="am">f.m.</string> + <string name="pm">e.m.</string> + <string name="yesterday">igår</string> + <string name="today">idag</string> + <string name="tomorrow">imorgon</string> + + <string name="hour_minute_ampm">%H:%M</string> + <string name="hour_minute_cap_ampm">%H:%M</string> + <string name="numeric_date">%Y-%m-%d</string> + <string name="numeric_date_format">yyyy-MM-dd</string> + <string name="month_day_year">%-e %B %Y</string> + <string name="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%H:%M:%S %-e %b %Y</string> + <string name="abbrev_month_day_year">%-e %b %Y</string> + <string name="month_day">%-e %B</string> + <string name="month">%-B</string> + <string name="month_year">%Y %B</string> + <string name="abbrev_month_day">%-e %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%Y %b</string> +</resources> diff --git a/core/res/res/values-th-rTH/donottranslate-cldr.xml b/core/res/res/values-th-rTH/donottranslate-cldr.xml new file mode 100644 index 0000000..cc680f6 --- /dev/null +++ b/core/res/res/values-th-rTH/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">มกราคม</string> + <string name="month_long_standalone_february">กุมภาพันธ์</string> + <string name="month_long_standalone_march">มีนาคม</string> + <string name="month_long_standalone_april">เมษายน</string> + <string name="month_long_standalone_may">พฤษภาคม</string> + <string name="month_long_standalone_june">มิถุนายน</string> + <string name="month_long_standalone_july">กรกฎาคม</string> + <string name="month_long_standalone_august">สิงหาคม</string> + <string name="month_long_standalone_september">กันยายน</string> + <string name="month_long_standalone_october">ตุลาคม</string> + <string name="month_long_standalone_november">พฤศจิกายน</string> + <string name="month_long_standalone_december">ธันวาคม</string> + + <string name="month_long_january">มกราคม</string> + <string name="month_long_february">กุมภาพันธ์</string> + <string name="month_long_march">มีนาคม</string> + <string name="month_long_april">เมษายน</string> + <string name="month_long_may">พฤษภาคม</string> + <string name="month_long_june">มิถุนายน</string> + <string name="month_long_july">กรกฎาคม</string> + <string name="month_long_august">สิงหาคม</string> + <string name="month_long_september">กันยายน</string> + <string name="month_long_october">ตุลาคม</string> + <string name="month_long_november">พฤศจิกายน</string> + <string name="month_long_december">ธันวาคม</string> + + <string name="month_medium_january">ม.ค.</string> + <string name="month_medium_february">ก.พ.</string> + <string name="month_medium_march">มี.ค.</string> + <string name="month_medium_april">เม.ย.</string> + <string name="month_medium_may">พ.ค.</string> + <string name="month_medium_june">มิ.ย.</string> + <string name="month_medium_july">ก.ค.</string> + <string name="month_medium_august">ส.ค.</string> + <string name="month_medium_september">ก.ย.</string> + <string name="month_medium_october">ต.ค.</string> + <string name="month_medium_november">พ.ย.</string> + <string name="month_medium_december">ธ.ค.</string> + + <string name="month_shortest_january">ม.ค.</string> + <string name="month_shortest_february">ก.พ.</string> + <string name="month_shortest_march">มี.ค.</string> + <string name="month_shortest_april">เม.ย.</string> + <string name="month_shortest_may">พ.ค.</string> + <string name="month_shortest_june">มิ.ย.</string> + <string name="month_shortest_july">ก.ค.</string> + <string name="month_shortest_august">ส.ค.</string> + <string name="month_shortest_september">ก.ย.</string> + <string name="month_shortest_october">ต.ค.</string> + <string name="month_shortest_november">พ.ย.</string> + <string name="month_shortest_december">ธ.ค.</string> + + <string name="day_of_week_long_sunday">วันอาทิตย์</string> + <string name="day_of_week_long_monday">วันจันทร์</string> + <string name="day_of_week_long_tuesday">วันอังคาร</string> + <string name="day_of_week_long_wednesday">วันพุธ</string> + <string name="day_of_week_long_thursday">วันพฤหัสบดี</string> + <string name="day_of_week_long_friday">วันศุกร์</string> + <string name="day_of_week_long_saturday">วันเสาร์</string> + + <string name="day_of_week_medium_sunday">อา.</string> + <string name="day_of_week_medium_monday">จ.</string> + <string name="day_of_week_medium_tuesday">อ.</string> + <string name="day_of_week_medium_wednesday">พ.</string> + <string name="day_of_week_medium_thursday">พฤ.</string> + <string name="day_of_week_medium_friday">ศ.</string> + <string name="day_of_week_medium_saturday">ส.</string> + + <string name="day_of_week_short_sunday">อา.</string> + <string name="day_of_week_short_monday">จ.</string> + <string name="day_of_week_short_tuesday">อ.</string> + <string name="day_of_week_short_wednesday">พ.</string> + <string name="day_of_week_short_thursday">พฤ.</string> + <string name="day_of_week_short_friday">ศ.</string> + <string name="day_of_week_short_saturday">ส.</string> + + <string name="day_of_week_shortest_sunday">อ</string> + <string name="day_of_week_shortest_monday">จ</string> + <string name="day_of_week_shortest_tuesday">อ</string> + <string name="day_of_week_shortest_wednesday">พ</string> + <string name="day_of_week_shortest_thursday">พ</string> + <string name="day_of_week_shortest_friday">ศ</string> + <string name="day_of_week_shortest_saturday">ส</string> + + <string name="am">ก่อนเที่ยง</string> + <string name="pm">หลังเที่ยง</string> + <string name="yesterday">เมื่อวาน</string> + <string name="today">วันนี้</string> + <string name="tomorrow">พรุ่งนี้</string> + + <string name="hour_minute_ampm">%-k:%M</string> + <string name="hour_minute_cap_ampm">%-k:%M</string> + <string name="numeric_date">%-e/%-m/%Y</string> + <string name="numeric_date_format">d/M/yyyy</string> + <string name="month_day_year">%-e %B %Y</string> + <string name="time_of_day">%-k:%M:%S</string> + <string name="date_and_time">%-k:%M:%S, %-e %b %Y</string> + <string name="abbrev_month_day_year">%-e %b %Y</string> + <string name="month_day">%-e %B</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%-e %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-tr-rTR/donottranslate-cldr.xml b/core/res/res/values-tr-rTR/donottranslate-cldr.xml new file mode 100644 index 0000000..acc0121 --- /dev/null +++ b/core/res/res/values-tr-rTR/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">Ocak</string> + <string name="month_long_standalone_february">Şubat</string> + <string name="month_long_standalone_march">Mart</string> + <string name="month_long_standalone_april">Nisan</string> + <string name="month_long_standalone_may">Mayıs</string> + <string name="month_long_standalone_june">Haziran</string> + <string name="month_long_standalone_july">Temmuz</string> + <string name="month_long_standalone_august">Ağustos</string> + <string name="month_long_standalone_september">Eylül</string> + <string name="month_long_standalone_october">Ekim</string> + <string name="month_long_standalone_november">Kasım</string> + <string name="month_long_standalone_december">Aralık</string> + + <string name="month_long_january">Ocak</string> + <string name="month_long_february">Şubat</string> + <string name="month_long_march">Mart</string> + <string name="month_long_april">Nisan</string> + <string name="month_long_may">Mayıs</string> + <string name="month_long_june">Haziran</string> + <string name="month_long_july">Temmuz</string> + <string name="month_long_august">Ağustos</string> + <string name="month_long_september">Eylül</string> + <string name="month_long_october">Ekim</string> + <string name="month_long_november">Kasım</string> + <string name="month_long_december">Aralık</string> + + <string name="month_medium_january">Oca</string> + <string name="month_medium_february">Şub</string> + <string name="month_medium_march">Mar</string> + <string name="month_medium_april">Nis</string> + <string name="month_medium_may">May</string> + <string name="month_medium_june">Haz</string> + <string name="month_medium_july">Tem</string> + <string name="month_medium_august">Ağu</string> + <string name="month_medium_september">Eyl</string> + <string name="month_medium_october">Eki</string> + <string name="month_medium_november">Kas</string> + <string name="month_medium_december">Ara</string> + + <string name="month_shortest_january">O</string> + <string name="month_shortest_february">Ş</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">N</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">H</string> + <string name="month_shortest_july">T</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">E</string> + <string name="month_shortest_october">E</string> + <string name="month_shortest_november">K</string> + <string name="month_shortest_december">A</string> + + <string name="day_of_week_long_sunday">Pazar</string> + <string name="day_of_week_long_monday">Pazartesi</string> + <string name="day_of_week_long_tuesday">Salı</string> + <string name="day_of_week_long_wednesday">Çarşamba</string> + <string name="day_of_week_long_thursday">Perşembe</string> + <string name="day_of_week_long_friday">Cuma</string> + <string name="day_of_week_long_saturday">Cumartesi</string> + + <string name="day_of_week_medium_sunday">Paz</string> + <string name="day_of_week_medium_monday">Pzt</string> + <string name="day_of_week_medium_tuesday">Sal</string> + <string name="day_of_week_medium_wednesday">Çar</string> + <string name="day_of_week_medium_thursday">Per</string> + <string name="day_of_week_medium_friday">Cum</string> + <string name="day_of_week_medium_saturday">Cmt</string> + + <string name="day_of_week_short_sunday">Paz</string> + <string name="day_of_week_short_monday">Pzt</string> + <string name="day_of_week_short_tuesday">Sal</string> + <string name="day_of_week_short_wednesday">Çar</string> + <string name="day_of_week_short_thursday">Per</string> + <string name="day_of_week_short_friday">Cum</string> + <string name="day_of_week_short_saturday">Cmt</string> + + <string name="day_of_week_shortest_sunday">P</string> + <string name="day_of_week_shortest_monday">P</string> + <string name="day_of_week_shortest_tuesday">S</string> + <string name="day_of_week_shortest_wednesday">Ç</string> + <string name="day_of_week_shortest_thursday">P</string> + <string name="day_of_week_shortest_friday">C</string> + <string name="day_of_week_shortest_saturday">C</string> + + <string name="am">AM</string> + <string name="pm">PM</string> + <string name="yesterday">Dün</string> + <string name="today">Bugün</string> + <string name="tomorrow">Yarın</string> + + <string name="hour_minute_ampm">%H:%M</string> + <string name="hour_minute_cap_ampm">%H:%M</string> + <string name="numeric_date">%d %m %Y</string> + <string name="numeric_date_format">dd MM yyyy</string> + <string name="month_day_year">%d %B %Y</string> + <string name="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%H:%M:%S %d %b %Y</string> + <string name="abbrev_month_day_year">%d %b %Y</string> + <string name="month_day">%d %B</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%d %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-uk-rUA/donottranslate-cldr.xml b/core/res/res/values-uk-rUA/donottranslate-cldr.xml new file mode 100644 index 0000000..888df36 --- /dev/null +++ b/core/res/res/values-uk-rUA/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">Січень</string> + <string name="month_long_standalone_february">Лютий</string> + <string name="month_long_standalone_march">Березень</string> + <string name="month_long_standalone_april">Квітень</string> + <string name="month_long_standalone_may">Травень</string> + <string name="month_long_standalone_june">Червень</string> + <string name="month_long_standalone_july">Липень</string> + <string name="month_long_standalone_august">Серпень</string> + <string name="month_long_standalone_september">Вересень</string> + <string name="month_long_standalone_october">Жовтень</string> + <string name="month_long_standalone_november">Листопад</string> + <string name="month_long_standalone_december">Грудень</string> + + <string name="month_long_january">січня</string> + <string name="month_long_february">лютого</string> + <string name="month_long_march">березня</string> + <string name="month_long_april">квітня</string> + <string name="month_long_may">травня</string> + <string name="month_long_june">червня</string> + <string name="month_long_july">липня</string> + <string name="month_long_august">серпня</string> + <string name="month_long_september">вересня</string> + <string name="month_long_october">жовтня</string> + <string name="month_long_november">листопада</string> + <string name="month_long_december">грудня</string> + + <string name="month_medium_january">січ.</string> + <string name="month_medium_february">лют.</string> + <string name="month_medium_march">бер.</string> + <string name="month_medium_april">квіт.</string> + <string name="month_medium_may">трав.</string> + <string name="month_medium_june">черв.</string> + <string name="month_medium_july">лип.</string> + <string name="month_medium_august">серп.</string> + <string name="month_medium_september">вер.</string> + <string name="month_medium_october">жовт.</string> + <string name="month_medium_november">лист.</string> + <string name="month_medium_december">груд.</string> + + <string name="month_shortest_january">С</string> + <string name="month_shortest_february">Л</string> + <string name="month_shortest_march">Б</string> + <string name="month_shortest_april">К</string> + <string name="month_shortest_may">Т</string> + <string name="month_shortest_june">Ч</string> + <string name="month_shortest_july">Л</string> + <string name="month_shortest_august">С</string> + <string name="month_shortest_september">В</string> + <string name="month_shortest_october">Ж</string> + <string name="month_shortest_november">Л</string> + <string name="month_shortest_december">Г</string> + + <string name="day_of_week_long_sunday">Неділя</string> + <string name="day_of_week_long_monday">Понеділок</string> + <string name="day_of_week_long_tuesday">Вівторок</string> + <string name="day_of_week_long_wednesday">Середа</string> + <string name="day_of_week_long_thursday">Четвер</string> + <string name="day_of_week_long_friday">Пʼятниця</string> + <string name="day_of_week_long_saturday">Субота</string> + + <string name="day_of_week_medium_sunday">Нд</string> + <string name="day_of_week_medium_monday">Пн</string> + <string name="day_of_week_medium_tuesday">Вт</string> + <string name="day_of_week_medium_wednesday">Ср</string> + <string name="day_of_week_medium_thursday">Чт</string> + <string name="day_of_week_medium_friday">Пт</string> + <string name="day_of_week_medium_saturday">Сб</string> + + <string name="day_of_week_short_sunday">Нд</string> + <string name="day_of_week_short_monday">Пн</string> + <string name="day_of_week_short_tuesday">Вт</string> + <string name="day_of_week_short_wednesday">Ср</string> + <string name="day_of_week_short_thursday">Чт</string> + <string name="day_of_week_short_friday">Пт</string> + <string name="day_of_week_short_saturday">Сб</string> + + <string name="day_of_week_shortest_sunday">Н</string> + <string name="day_of_week_shortest_monday">П</string> + <string name="day_of_week_shortest_tuesday">В</string> + <string name="day_of_week_shortest_wednesday">С</string> + <string name="day_of_week_shortest_thursday">Ч</string> + <string name="day_of_week_shortest_friday">П</string> + <string name="day_of_week_shortest_saturday">С</string> + + <string name="am">дп</string> + <string name="pm">пп</string> + <string name="yesterday">Вчора</string> + <string name="today">Сьогодні</string> + <string name="tomorrow">Завтра</string> + + <string name="hour_minute_ampm">%H:%M</string> + <string name="hour_minute_cap_ampm">%H:%M</string> + <string name="numeric_date">%d.%m.%Y</string> + <string name="numeric_date_format">dd.MM.yyyy</string> + <string name="month_day_year">%-e %B %Y р.</string> + <string name="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%H:%M:%S %-e %b %Y</string> + <string name="abbrev_month_day_year">%-e %b %Y</string> + <string name="month_day">%-e %B</string> + <string name="month">%-B</string> + <string name="month_year">%-B %Y</string> + <string name="abbrev_month_day">%-e %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%-b %Y</string> +</resources> diff --git a/core/res/res/values-vi-rVN/donottranslate-cldr.xml b/core/res/res/values-vi-rVN/donottranslate-cldr.xml new file mode 100644 index 0000000..2a28b32 --- /dev/null +++ b/core/res/res/values-vi-rVN/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">tháng một</string> + <string name="month_long_standalone_february">tháng hai</string> + <string name="month_long_standalone_march">tháng ba</string> + <string name="month_long_standalone_april">tháng tư</string> + <string name="month_long_standalone_may">tháng năm</string> + <string name="month_long_standalone_june">tháng sáu</string> + <string name="month_long_standalone_july">tháng bảy</string> + <string name="month_long_standalone_august">tháng tám</string> + <string name="month_long_standalone_september">tháng chín</string> + <string name="month_long_standalone_october">tháng mười</string> + <string name="month_long_standalone_november">tháng mười một</string> + <string name="month_long_standalone_december">tháng mười hai</string> + + <string name="month_long_january">tháng một</string> + <string name="month_long_february">tháng hai</string> + <string name="month_long_march">tháng ba</string> + <string name="month_long_april">tháng tư</string> + <string name="month_long_may">tháng năm</string> + <string name="month_long_june">tháng sáu</string> + <string name="month_long_july">tháng bảy</string> + <string name="month_long_august">tháng tám</string> + <string name="month_long_september">tháng chín</string> + <string name="month_long_october">tháng mười</string> + <string name="month_long_november">tháng mười một</string> + <string name="month_long_december">tháng mười hai</string> + + <string name="month_medium_january">thg 1</string> + <string name="month_medium_february">thg 2</string> + <string name="month_medium_march">thg 3</string> + <string name="month_medium_april">thg 4</string> + <string name="month_medium_may">thg 5</string> + <string name="month_medium_june">thg 6</string> + <string name="month_medium_july">thg 7</string> + <string name="month_medium_august">thg 8</string> + <string name="month_medium_september">thg 9</string> + <string name="month_medium_october">thg 10</string> + <string name="month_medium_november">thg 11</string> + <string name="month_medium_december">thg 12</string> + + <string name="month_shortest_january">1</string> + <string name="month_shortest_february">2</string> + <string name="month_shortest_march">3</string> + <string name="month_shortest_april">4</string> + <string name="month_shortest_may">5</string> + <string name="month_shortest_june">6</string> + <string name="month_shortest_july">7</string> + <string name="month_shortest_august">8</string> + <string name="month_shortest_september">9</string> + <string name="month_shortest_october">10</string> + <string name="month_shortest_november">11</string> + <string name="month_shortest_december">12</string> + + <string name="day_of_week_long_sunday">Chủ nhật</string> + <string name="day_of_week_long_monday">Thứ hai</string> + <string name="day_of_week_long_tuesday">Thứ ba</string> + <string name="day_of_week_long_wednesday">Thứ tư</string> + <string name="day_of_week_long_thursday">Thứ năm</string> + <string name="day_of_week_long_friday">Thứ sáu</string> + <string name="day_of_week_long_saturday">Thứ bảy</string> + + <string name="day_of_week_medium_sunday">CN</string> + <string name="day_of_week_medium_monday">Th 2</string> + <string name="day_of_week_medium_tuesday">Th 3</string> + <string name="day_of_week_medium_wednesday">Th 4</string> + <string name="day_of_week_medium_thursday">Th 5</string> + <string name="day_of_week_medium_friday">Th 6</string> + <string name="day_of_week_medium_saturday">Th 7</string> + + <string name="day_of_week_short_sunday">CN</string> + <string name="day_of_week_short_monday">Th 2</string> + <string name="day_of_week_short_tuesday">Th 3</string> + <string name="day_of_week_short_wednesday">Th 4</string> + <string name="day_of_week_short_thursday">Th 5</string> + <string name="day_of_week_short_friday">Th 6</string> + <string name="day_of_week_short_saturday">Th 7</string> + + <string name="day_of_week_shortest_sunday">1</string> + <string name="day_of_week_shortest_monday">2</string> + <string name="day_of_week_shortest_tuesday">3</string> + <string name="day_of_week_shortest_wednesday">4</string> + <string name="day_of_week_shortest_thursday">5</string> + <string name="day_of_week_shortest_friday">6</string> + <string name="day_of_week_shortest_saturday">7</string> + + <string name="am">SA</string> + <string name="pm">CH</string> + <string name="yesterday">Yesterday</string> + <string name="today">Today</string> + <string name="tomorrow">Tomorrow</string> + + <string name="hour_minute_ampm">%H:%M</string> + <string name="hour_minute_cap_ampm">%H:%M</string> + <string name="numeric_date">%d/%m/%Y</string> + <string name="numeric_date_format">dd/MM/yyyy</string> + <string name="month_day_year">Ngày %d tháng %-m năm %Y</string> + <string name="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%d-%m-%Y %H:%M:%S</string> + <string name="abbrev_month_day_year">%d-%m-%Y</string> + <string name="month_day">%-e %B</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%-e %b</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values-zh-rCN/donottranslate-cldr.xml b/core/res/res/values-zh-rCN/donottranslate-cldr.xml new file mode 100644 index 0000000..18e37a9 --- /dev/null +++ b/core/res/res/values-zh-rCN/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">一月</string> + <string name="month_long_standalone_february">二月</string> + <string name="month_long_standalone_march">三月</string> + <string name="month_long_standalone_april">四月</string> + <string name="month_long_standalone_may">五月</string> + <string name="month_long_standalone_june">六月</string> + <string name="month_long_standalone_july">七月</string> + <string name="month_long_standalone_august">八月</string> + <string name="month_long_standalone_september">九月</string> + <string name="month_long_standalone_october">十月</string> + <string name="month_long_standalone_november">十一月</string> + <string name="month_long_standalone_december">十二月</string> + + <string name="month_long_january">1月</string> + <string name="month_long_february">2月</string> + <string name="month_long_march">3月</string> + <string name="month_long_april">4月</string> + <string name="month_long_may">5月</string> + <string name="month_long_june">6月</string> + <string name="month_long_july">7月</string> + <string name="month_long_august">8月</string> + <string name="month_long_september">9月</string> + <string name="month_long_october">10月</string> + <string name="month_long_november">11月</string> + <string name="month_long_december">12月</string> + + <string name="month_medium_january">1月</string> + <string name="month_medium_february">2月</string> + <string name="month_medium_march">3月</string> + <string name="month_medium_april">4月</string> + <string name="month_medium_may">5月</string> + <string name="month_medium_june">6月</string> + <string name="month_medium_july">7月</string> + <string name="month_medium_august">8月</string> + <string name="month_medium_september">9月</string> + <string name="month_medium_october">10月</string> + <string name="month_medium_november">11月</string> + <string name="month_medium_december">12月</string> + + <string name="month_shortest_january">1月</string> + <string name="month_shortest_february">2月</string> + <string name="month_shortest_march">3月</string> + <string name="month_shortest_april">4月</string> + <string name="month_shortest_may">5月</string> + <string name="month_shortest_june">6月</string> + <string name="month_shortest_july">7月</string> + <string name="month_shortest_august">8月</string> + <string name="month_shortest_september">9月</string> + <string name="month_shortest_october">10月</string> + <string name="month_shortest_november">11月</string> + <string name="month_shortest_december">12月</string> + + <string name="day_of_week_long_sunday">星期日</string> + <string name="day_of_week_long_monday">星期一</string> + <string name="day_of_week_long_tuesday">星期二</string> + <string name="day_of_week_long_wednesday">星期三</string> + <string name="day_of_week_long_thursday">星期四</string> + <string name="day_of_week_long_friday">星期五</string> + <string name="day_of_week_long_saturday">星期六</string> + + <string name="day_of_week_medium_sunday">周日</string> + <string name="day_of_week_medium_monday">周一</string> + <string name="day_of_week_medium_tuesday">周二</string> + <string name="day_of_week_medium_wednesday">周三</string> + <string name="day_of_week_medium_thursday">周四</string> + <string name="day_of_week_medium_friday">周五</string> + <string name="day_of_week_medium_saturday">周六</string> + + <string name="day_of_week_short_sunday">周日</string> + <string name="day_of_week_short_monday">周一</string> + <string name="day_of_week_short_tuesday">周二</string> + <string name="day_of_week_short_wednesday">周三</string> + <string name="day_of_week_short_thursday">周四</string> + <string name="day_of_week_short_friday">周五</string> + <string name="day_of_week_short_saturday">周六</string> + + <string name="day_of_week_shortest_sunday">日</string> + <string name="day_of_week_shortest_monday">一</string> + <string name="day_of_week_shortest_tuesday">二</string> + <string name="day_of_week_shortest_wednesday">三</string> + <string name="day_of_week_shortest_thursday">四</string> + <string name="day_of_week_shortest_friday">五</string> + <string name="day_of_week_shortest_saturday">六</string> + + <string name="am">上午</string> + <string name="pm">下午</string> + <string name="yesterday">昨天</string> + <string name="today">今天</string> + <string name="tomorrow">明天</string> + + <string name="hour_minute_ampm">%p%-l:%M</string> + <string name="hour_minute_cap_ampm">%^p%-l:%M</string> + <string name="numeric_date">%Y-%-m-%-e</string> + <string name="numeric_date_format">yyyy-M-d</string> + <string name="month_day_year">%Y年%-m月%-e日</string> + <string name="time_of_day">%p%I:%M:%S</string> + <string name="date_and_time">%p%I:%M:%S %Y-%-m-%-e</string> + <string name="abbrev_month_day_year">%Y-%-m-%-e</string> + <string name="month_day">%B%-e日</string> + <string name="month">%-B</string> + <string name="month_year">%Y年%B</string> + <string name="abbrev_month_day">%b%-e日</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%Y年%b</string> +</resources> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 54b0b97..ee7b3cd 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -424,9 +424,6 @@ <string name="lockscreen_glogin_password_hint">"密码"</string> <string name="lockscreen_glogin_submit_button">"登录"</string> <string name="lockscreen_glogin_invalid_input">"用户名或密码无效。"</string> - <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string> - <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string> - <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string> <string name="hour_ampm">"<xliff:g id="AMPM">%P</xliff:g><xliff:g id="HOUR">%-l</xliff:g>点"</string> <string name="hour_cap_ampm">"<xliff:g id="AMPM">%p</xliff:g><xliff:g id="HOUR">%-l</xliff:g>点"</string> <string name="status_bar_clear_all_button">"清除通知"</string> @@ -458,9 +455,6 @@ <string name="menu_enter_shortcut_label">"Enter 键"</string> <string name="menu_delete_shortcut_label">"删除"</string> <string name="search_go">"搜索"</string> - <string name="today">"今天"</string> - <string name="yesterday">"昨天"</string> - <string name="tomorrow">"明天"</string> <string name="oneMonthDurationPast">"1 个月前"</string> <string name="beforeOneMonthDurationPast">"1 个月前"</string> <plurals name="num_seconds_ago"> @@ -542,13 +536,6 @@ <string name="weeks">"周"</string> <string name="year">"年"</string> <string name="years">"年"</string> - <string name="sunday">"周日"</string> - <string name="monday">"周一"</string> - <string name="tuesday">"周二"</string> - <string name="wednesday">"周三"</string> - <string name="thursday">"周四"</string> - <string name="friday">"周五"</string> - <string name="saturday">"周六"</string> <string name="every_weekday">"每个工作日(周一到周五)"</string> <string name="daily">"每天"</string> <string name="weekly">"每周的<xliff:g id="DAY">%s</xliff:g>"</string> @@ -558,9 +545,6 @@ <string name="VideoView_error_text_invalid_progressive_playback">"抱歉,该视频不适合在此设备上播放。"</string> <string name="VideoView_error_text_unknown">"很抱歉,此视频不能播放。"</string> <string name="VideoView_error_button">"确定"</string> - <string name="am">"上午"</string> - <string name="pm">"下午"</string> - <string name="numeric_date">"<xliff:g id="YEAR">%Y</xliff:g> 年 <xliff:g id="MONTH">%m</xliff:g> 月 <xliff:g id="DAY">%d</xliff:g> 日"</string> <string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g><xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="TIME1">%3$s</xliff:g> 至 <xliff:g id="DATE2">%5$s</xliff:g><xliff:g id="WEEKDAY2">%4$s</xliff:g> <xliff:g id="TIME2">%6$s</xliff:g>"</string> <string name="wday1_date1_wday2_date2">"<xliff:g id="DATE1">%2$s</xliff:g><xliff:g id="WEEKDAY1">%1$s</xliff:g>至 <xliff:g id="DATE2">%5$s</xliff:g><xliff:g id="WEEKDAY2">%4$s</xliff:g>"</string> <string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g> <xliff:g id="TIME1">%3$s</xliff:g> 至 <xliff:g id="DATE2">%5$s</xliff:g> <xliff:g id="TIME2">%6$s</xliff:g>"</string> @@ -572,23 +556,12 @@ <string name="date_time">"<xliff:g id="DATE">%1$s</xliff:g><xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g><xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="time_wday">"<xliff:g id="WEEKDAY">%2$s</xliff:g> <xliff:g id="TIME_RANGE">%1$s</xliff:g>"</string> - <string name="full_date_month_first" format="date">"<xliff:g id="YEAR">yyyy</xliff:g>' 年 '<xliff:g id="MONTH">MMMM</xliff:g>' 月 '<xliff:g id="DAY">d</xliff:g>' 日'"</string> - <string name="full_date_day_first" format="date">"<xliff:g id="YEAR">yyyy</xliff:g>' 年 '<xliff:g id="MONTH">MMMM</xliff:g>' 月 '<xliff:g id="DAY">d</xliff:g>' 日'"</string> - <string name="medium_date_month_first" format="date">"<xliff:g id="YEAR">yyyy</xliff:g>' 年 '<xliff:g id="MONTH">MMM</xliff:g>' 月 '<xliff:g id="DAY">d</xliff:g>' 日'"</string> - <string name="medium_date_day_first" format="date">"<xliff:g id="YEAR">yyyy</xliff:g>' 年 '<xliff:g id="DAY">d</xliff:g>' 月 '<xliff:g id="MONTH">MMM</xliff:g>' 日'"</string> - <string name="twelve_hour_time_format" format="date">"<xliff:g id="HOUR">h</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>' '<xliff:g id="AMPM">a</xliff:g>"</string> - <string name="twenty_four_hour_time_format" format="date">"<xliff:g id="HOUR">HH</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>"</string> <string name="noon">"中午"</string> <string name="Noon">"中午"</string> <string name="midnight">"午夜"</string> <string name="Midnight">"午夜"</string> - <string name="month_day">"<xliff:g id="MONTH">%B</xliff:g> 月 <xliff:g id="DAY">%-d</xliff:g> 日"</string> <!-- no translation found for month (7026169712234774086) --> <skip /> - <string name="month_day_year">"<xliff:g id="YEAR">%Y</xliff:g> 年 <xliff:g id="MONTH">%B</xliff:g> 月 <xliff:g id="DAY">%-d</xliff:g> 日"</string> - <string name="month_year">"<xliff:g id="YEAR">%Y</xliff:g> 年 <xliff:g id="MONTH">%B</xliff:g> 月"</string> - <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string> - <string name="date_and_time">"<xliff:g id="YEAR">%Y</xliff:g> 年 <xliff:g id="MONTH">%B</xliff:g> 月 <xliff:g id="DAY">%-d</xliff:g> 日 <xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string> <string name="same_year_md1_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> 月 <xliff:g id="DAY1">%3$s</xliff:g> 日至 <xliff:g id="MONTH2">%7$s</xliff:g> 月 <xliff:g id="DAY2">%8$s</xliff:g> 日"</string> <string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> 月 <xliff:g id="DAY1_0">%3$s</xliff:g> 日<xliff:g id="WEEKDAY1">%1$s</xliff:g>至 <xliff:g id="MONTH2">%7$s</xliff:g> 月 <xliff:g id="DAY2_1">%8$s</xliff:g> 日<xliff:g id="WEEKDAY2">%6$s</xliff:g>"</string> <string name="same_year_mdy1_mdy2">"<xliff:g id="YEAR">%9$s</xliff:g> 年 <xliff:g id="MONTH1">%2$s</xliff:g> 月 <xliff:g id="DAY1">%3$s</xliff:g> 日至 <xliff:g id="MONTH2">%7$s</xliff:g> 月 <xliff:g id="DAY2">%8$s</xliff:g> 日"</string> @@ -613,82 +586,8 @@ <string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> 月 <xliff:g id="DAY1_0">%3$s</xliff:g> 日<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="TIME1">%5$s</xliff:g> 至 <xliff:g id="MONTH2">%7$s</xliff:g> 月 <xliff:g id="DAY2_1">%8$s</xliff:g> 日<xliff:g id="WEEKDAY2">%6$s</xliff:g> <xliff:g id="TIME2">%10$s</xliff:g>"</string> <string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="YEAR1">%4$s</xliff:g> 年 <xliff:g id="MONTH1">%2$s</xliff:g> 月 <xliff:g id="DAY1">%3$s</xliff:g> 日 <xliff:g id="TIME1">%5$s</xliff:g> 至 <xliff:g id="YEAR2">%9$s</xliff:g> 年 <xliff:g id="MONTH2">%7$s</xliff:g> 月 <xliff:g id="DAY2">%8$s</xliff:g> 日 <xliff:g id="TIME2">%10$s</xliff:g>"</string> <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="YEAR1">%4$s</xliff:g> 年 <xliff:g id="MONTH1">%2$s</xliff:g> 月 <xliff:g id="DAY1_0">%3$s</xliff:g> 日<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="TIME1">%5$s</xliff:g> 至 <xliff:g id="YEAR2">%9$s</xliff:g> 年 <xliff:g id="MONTH2">%7$s</xliff:g> 月 <xliff:g id="DAY2_1">%8$s</xliff:g> 日<xliff:g id="WEEKDAY2">%6$s</xliff:g> <xliff:g id="TIME2">%10$s</xliff:g>"</string> - <string name="abbrev_month_day_year">"<xliff:g id="YEAR">%Y</xliff:g> 年 <xliff:g id="MONTH">%b</xliff:g> 月 <xliff:g id="DAY">%-d</xliff:g> 日"</string> - <string name="abbrev_month_year">"<xliff:g id="YEAR">%Y</xliff:g> 年 <xliff:g id="MONTH">%b</xliff:g> 月"</string> - <string name="abbrev_month_day">"<xliff:g id="MONTH">%b</xliff:g> 月 <xliff:g id="DAY">%-d</xliff:g> 日"</string> <!-- no translation found for abbrev_month (3131032032850777433) --> <skip /> - <string name="day_of_week_long_sunday">"周日"</string> - <string name="day_of_week_long_monday">"周一"</string> - <string name="day_of_week_long_tuesday">"周二"</string> - <string name="day_of_week_long_wednesday">"周三"</string> - <string name="day_of_week_long_thursday">"周四"</string> - <string name="day_of_week_long_friday">"周五"</string> - <string name="day_of_week_long_saturday">"周六"</string> - <string name="day_of_week_medium_sunday">"周日"</string> - <string name="day_of_week_medium_monday">"周一"</string> - <string name="day_of_week_medium_tuesday">"周二"</string> - <string name="day_of_week_medium_wednesday">"周三"</string> - <string name="day_of_week_medium_thursday">"周四"</string> - <string name="day_of_week_medium_friday">"周五"</string> - <string name="day_of_week_medium_saturday">"周六"</string> - <string name="day_of_week_short_sunday">"周日"</string> - <string name="day_of_week_short_monday">"周一"</string> - <string name="day_of_week_short_tuesday">"周二"</string> - <string name="day_of_week_short_wednesday">"周三"</string> - <string name="day_of_week_short_thursday">"周四"</string> - <string name="day_of_week_short_friday">"周五"</string> - <string name="day_of_week_short_saturday">"周六"</string> - <string name="day_of_week_shorter_sunday">"周日"</string> - <string name="day_of_week_shorter_monday">"周一"</string> - <string name="day_of_week_shorter_tuesday">"周二"</string> - <string name="day_of_week_shorter_wednesday">"周三"</string> - <string name="day_of_week_shorter_thursday">"周四"</string> - <string name="day_of_week_shorter_friday">"周五"</string> - <string name="day_of_week_shorter_saturday">"周六"</string> - <string name="day_of_week_shortest_sunday">"周日"</string> - <string name="day_of_week_shortest_monday">"周一"</string> - <string name="day_of_week_shortest_tuesday">"周二"</string> - <string name="day_of_week_shortest_wednesday">"周三"</string> - <string name="day_of_week_shortest_thursday">"周四"</string> - <string name="day_of_week_shortest_friday">"周五"</string> - <string name="day_of_week_shortest_saturday">"周六"</string> - <string name="month_long_january">"1 月"</string> - <string name="month_long_february">"2 月"</string> - <string name="month_long_march">"3 月"</string> - <string name="month_long_april">"4 月"</string> - <string name="month_long_may">"5 月"</string> - <string name="month_long_june">"6 月"</string> - <string name="month_long_july">"7 月"</string> - <string name="month_long_august">"8 月"</string> - <string name="month_long_september">"9 月"</string> - <string name="month_long_october">"10 月"</string> - <string name="month_long_november">"11 月"</string> - <string name="month_long_december">"12 月"</string> - <string name="month_medium_january">"1 月"</string> - <string name="month_medium_february">"2 月"</string> - <string name="month_medium_march">"3 月"</string> - <string name="month_medium_april">"4 月"</string> - <string name="month_medium_may">"5 月"</string> - <string name="month_medium_june">"6 月"</string> - <string name="month_medium_july">"7 月"</string> - <string name="month_medium_august">"8 月"</string> - <string name="month_medium_september">"9 月"</string> - <string name="month_medium_october">"10 月"</string> - <string name="month_medium_november">"11 月"</string> - <string name="month_medium_december">"12 月"</string> - <string name="month_shortest_january">"1 月"</string> - <string name="month_shortest_february">"2 月"</string> - <string name="month_shortest_march">"3 月"</string> - <string name="month_shortest_april">"4 月"</string> - <string name="month_shortest_may">"5 月"</string> - <string name="month_shortest_june">"6 月"</string> - <string name="month_shortest_july">"7 月"</string> - <string name="month_shortest_august">"8 月"</string> - <string name="month_shortest_september">"9 月"</string> - <string name="month_shortest_october">"10 月"</string> - <string name="month_shortest_november">"11 月"</string> - <string name="month_shortest_december">"12 月"</string> <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string> <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string> <string name="selectAll">"全选"</string> diff --git a/core/res/res/values-zh-rTW/donottranslate-cldr.xml b/core/res/res/values-zh-rTW/donottranslate-cldr.xml new file mode 100644 index 0000000..18e37a9 --- /dev/null +++ b/core/res/res/values-zh-rTW/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">一月</string> + <string name="month_long_standalone_february">二月</string> + <string name="month_long_standalone_march">三月</string> + <string name="month_long_standalone_april">四月</string> + <string name="month_long_standalone_may">五月</string> + <string name="month_long_standalone_june">六月</string> + <string name="month_long_standalone_july">七月</string> + <string name="month_long_standalone_august">八月</string> + <string name="month_long_standalone_september">九月</string> + <string name="month_long_standalone_october">十月</string> + <string name="month_long_standalone_november">十一月</string> + <string name="month_long_standalone_december">十二月</string> + + <string name="month_long_january">1月</string> + <string name="month_long_february">2月</string> + <string name="month_long_march">3月</string> + <string name="month_long_april">4月</string> + <string name="month_long_may">5月</string> + <string name="month_long_june">6月</string> + <string name="month_long_july">7月</string> + <string name="month_long_august">8月</string> + <string name="month_long_september">9月</string> + <string name="month_long_october">10月</string> + <string name="month_long_november">11月</string> + <string name="month_long_december">12月</string> + + <string name="month_medium_january">1月</string> + <string name="month_medium_february">2月</string> + <string name="month_medium_march">3月</string> + <string name="month_medium_april">4月</string> + <string name="month_medium_may">5月</string> + <string name="month_medium_june">6月</string> + <string name="month_medium_july">7月</string> + <string name="month_medium_august">8月</string> + <string name="month_medium_september">9月</string> + <string name="month_medium_october">10月</string> + <string name="month_medium_november">11月</string> + <string name="month_medium_december">12月</string> + + <string name="month_shortest_january">1月</string> + <string name="month_shortest_february">2月</string> + <string name="month_shortest_march">3月</string> + <string name="month_shortest_april">4月</string> + <string name="month_shortest_may">5月</string> + <string name="month_shortest_june">6月</string> + <string name="month_shortest_july">7月</string> + <string name="month_shortest_august">8月</string> + <string name="month_shortest_september">9月</string> + <string name="month_shortest_october">10月</string> + <string name="month_shortest_november">11月</string> + <string name="month_shortest_december">12月</string> + + <string name="day_of_week_long_sunday">星期日</string> + <string name="day_of_week_long_monday">星期一</string> + <string name="day_of_week_long_tuesday">星期二</string> + <string name="day_of_week_long_wednesday">星期三</string> + <string name="day_of_week_long_thursday">星期四</string> + <string name="day_of_week_long_friday">星期五</string> + <string name="day_of_week_long_saturday">星期六</string> + + <string name="day_of_week_medium_sunday">周日</string> + <string name="day_of_week_medium_monday">周一</string> + <string name="day_of_week_medium_tuesday">周二</string> + <string name="day_of_week_medium_wednesday">周三</string> + <string name="day_of_week_medium_thursday">周四</string> + <string name="day_of_week_medium_friday">周五</string> + <string name="day_of_week_medium_saturday">周六</string> + + <string name="day_of_week_short_sunday">周日</string> + <string name="day_of_week_short_monday">周一</string> + <string name="day_of_week_short_tuesday">周二</string> + <string name="day_of_week_short_wednesday">周三</string> + <string name="day_of_week_short_thursday">周四</string> + <string name="day_of_week_short_friday">周五</string> + <string name="day_of_week_short_saturday">周六</string> + + <string name="day_of_week_shortest_sunday">日</string> + <string name="day_of_week_shortest_monday">一</string> + <string name="day_of_week_shortest_tuesday">二</string> + <string name="day_of_week_shortest_wednesday">三</string> + <string name="day_of_week_shortest_thursday">四</string> + <string name="day_of_week_shortest_friday">五</string> + <string name="day_of_week_shortest_saturday">六</string> + + <string name="am">上午</string> + <string name="pm">下午</string> + <string name="yesterday">昨天</string> + <string name="today">今天</string> + <string name="tomorrow">明天</string> + + <string name="hour_minute_ampm">%p%-l:%M</string> + <string name="hour_minute_cap_ampm">%^p%-l:%M</string> + <string name="numeric_date">%Y-%-m-%-e</string> + <string name="numeric_date_format">yyyy-M-d</string> + <string name="month_day_year">%Y年%-m月%-e日</string> + <string name="time_of_day">%p%I:%M:%S</string> + <string name="date_and_time">%p%I:%M:%S %Y-%-m-%-e</string> + <string name="abbrev_month_day_year">%Y-%-m-%-e</string> + <string name="month_day">%B%-e日</string> + <string name="month">%-B</string> + <string name="month_year">%Y年%B</string> + <string name="abbrev_month_day">%b%-e日</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%Y年%b</string> +</resources> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 514e304..a742228 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -418,9 +418,6 @@ <string name="lockscreen_glogin_password_hint">"密碼"</string> <string name="lockscreen_glogin_submit_button">"登入"</string> <string name="lockscreen_glogin_invalid_input">"使用者名稱或密碼錯誤。"</string> - <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string> - <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string> - <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string> <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string> <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string> <string name="status_bar_clear_all_button">"清除通知"</string> @@ -452,9 +449,6 @@ <string name="menu_enter_shortcut_label">"輸入"</string> <string name="menu_delete_shortcut_label">"刪除"</string> <string name="search_go">"搜尋"</string> - <string name="today">"今天"</string> - <string name="yesterday">"昨天"</string> - <string name="tomorrow">"明天"</string> <string name="oneMonthDurationPast">"1 個月以前"</string> <string name="beforeOneMonthDurationPast">"1 個月前"</string> <plurals name="num_seconds_ago"> @@ -536,13 +530,6 @@ <string name="weeks">"週"</string> <string name="year">"年"</string> <string name="years">"年"</string> - <string name="sunday">"星期日"</string> - <string name="monday">"星期一"</string> - <string name="tuesday">"星期二"</string> - <string name="wednesday">"星期三"</string> - <string name="thursday">"星期四"</string> - <string name="friday">"星期五"</string> - <string name="saturday">"星期六"</string> <string name="every_weekday">"每天 (週一至週五)"</string> <string name="daily">"每天"</string> <string name="weekly">"每週<xliff:g id="DAY">%s</xliff:g>"</string> @@ -552,9 +539,6 @@ <string name="VideoView_error_text_invalid_progressive_playback">"很抱歉,影片格式無效,裝置無法進行串流處理。"</string> <string name="VideoView_error_text_unknown">"很抱歉,此影片無法播放。"</string> <string name="VideoView_error_button">"確定"</string> - <string name="am">"上午"</string> - <string name="pm">"下午"</string> - <string name="numeric_date">"<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="DAY">%d</xliff:g>/<xliff:g id="YEAR">%Y</xliff:g>"</string> <string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>,<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>,<xliff:g id="WEEKDAY2">%4$s</xliff:g>,<xliff:g id="TIME2">%6$s</xliff:g>"</string> <string name="wday1_date1_wday2_date2">"<xliff:g id="DATE1">%2$s</xliff:g>,<xliff:g id="WEEKDAY1">%1$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>,<xliff:g id="WEEKDAY2">%4$s</xliff:g>"</string> <string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>,<xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>,<xliff:g id="TIME2">%6$s</xliff:g>"</string> @@ -566,23 +550,12 @@ <string name="date_time">"<xliff:g id="DATE">%1$s</xliff:g>,<xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>,<xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="time_wday">"<xliff:g id="WEEKDAY">%2$s</xliff:g>,<xliff:g id="TIME_RANGE">%1$s</xliff:g>"</string> - <string name="full_date_month_first" format="date">"<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="DAY">d</xliff:g>','<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="full_date_day_first" format="date">"<xliff:g id="YEAR">yyyy</xliff:g>' 年 '<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="DAY">d</xliff:g>' 日'"</string> - <string name="medium_date_month_first" format="date">"<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="DAY">d</xliff:g>','<xliff:g id="YEAR">yyyy</xliff:g>"</string> - <string name="medium_date_day_first" format="date">"<xliff:g id="YEAR">yyyy</xliff:g>' 年 '<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="DAY">d</xliff:g>' 日'"</string> - <string name="twelve_hour_time_format" format="date">"<xliff:g id="HOUR">h</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>' '<xliff:g id="AMPM">a</xliff:g>"</string> - <string name="twenty_four_hour_time_format" format="date">"<xliff:g id="HOUR">HH</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>"</string> <string name="noon">"中午"</string> <string name="Noon">"中午"</string> <string name="midnight">"午夜"</string> <string name="Midnight">"午夜"</string> - <string name="month_day">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g> 日"</string> <!-- no translation found for month (7026169712234774086) --> <skip /> - <string name="month_day_year">"<xliff:g id="YEAR">%Y</xliff:g> 年 <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g> 日"</string> - <string name="month_year">"<xliff:g id="YEAR">%Y</xliff:g> 年<xliff:g id="MONTH">%B</xliff:g>"</string> - <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string> - <string name="date_and_time">"<xliff:g id="YEAR">%Y</xliff:g> 年 <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g> 日,<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string> <string name="same_year_md1_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>"</string> <string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> 日,<xliff:g id="WEEKDAY1">%1$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g> 日,<xliff:g id="WEEKDAY2">%6$s</xliff:g>"</string> <string name="same_year_mdy1_mdy2">"<xliff:g id="YEAR">%9$s</xliff:g> 年 <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> 日 – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g> 日"</string> @@ -607,82 +580,8 @@ <string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> 日,<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g> 日,<xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string> <string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="YEAR1">%4$s</xliff:g> 年 <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> 日 <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="YEAR2">%9$s</xliff:g> 年 <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g> 日 <xliff:g id="TIME2">%10$s</xliff:g>"</string> <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="YEAR1">%4$s</xliff:g> 年 <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> 日,<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="YEAR2">%9$s</xliff:g> 年 <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g> 日,<xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string> - <string name="abbrev_month_day_year">"<xliff:g id="YEAR">%Y</xliff:g> 年 <xliff:g id="MONTH">%b</xliff:g> <xliff:g id="DAY">%-d</xliff:g> 日"</string> - <string name="abbrev_month_year">"<xliff:g id="YEAR">%Y</xliff:g> 年 <xliff:g id="MONTH">%b</xliff:g>"</string> - <string name="abbrev_month_day">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="DAY">%-d</xliff:g> 日"</string> <!-- no translation found for abbrev_month (3131032032850777433) --> <skip /> - <string name="day_of_week_long_sunday">"星期日"</string> - <string name="day_of_week_long_monday">"星期一"</string> - <string name="day_of_week_long_tuesday">"星期二"</string> - <string name="day_of_week_long_wednesday">"星期三"</string> - <string name="day_of_week_long_thursday">"星期四"</string> - <string name="day_of_week_long_friday">"星期五"</string> - <string name="day_of_week_long_saturday">"星期六"</string> - <string name="day_of_week_medium_sunday">"週日"</string> - <string name="day_of_week_medium_monday">"週一"</string> - <string name="day_of_week_medium_tuesday">"週二"</string> - <string name="day_of_week_medium_wednesday">"週三"</string> - <string name="day_of_week_medium_thursday">"週四"</string> - <string name="day_of_week_medium_friday">"五"</string> - <string name="day_of_week_medium_saturday">"週六"</string> - <string name="day_of_week_short_sunday">"日"</string> - <string name="day_of_week_short_monday">"一"</string> - <string name="day_of_week_short_tuesday">"二"</string> - <string name="day_of_week_short_wednesday">"三"</string> - <string name="day_of_week_short_thursday">"週四"</string> - <string name="day_of_week_short_friday">"五"</string> - <string name="day_of_week_short_saturday">"六"</string> - <string name="day_of_week_shorter_sunday">"日"</string> - <string name="day_of_week_shorter_monday">"一"</string> - <string name="day_of_week_shorter_tuesday">"二"</string> - <string name="day_of_week_shorter_wednesday">"三"</string> - <string name="day_of_week_shorter_thursday">"四"</string> - <string name="day_of_week_shorter_friday">"五"</string> - <string name="day_of_week_shorter_saturday">"六"</string> - <string name="day_of_week_shortest_sunday">"日"</string> - <string name="day_of_week_shortest_monday">"一"</string> - <string name="day_of_week_shortest_tuesday">"二"</string> - <string name="day_of_week_shortest_wednesday">"三"</string> - <string name="day_of_week_shortest_thursday">"四"</string> - <string name="day_of_week_shortest_friday">"五"</string> - <string name="day_of_week_shortest_saturday">"六"</string> - <string name="month_long_january">"1 月"</string> - <string name="month_long_february">"2 月"</string> - <string name="month_long_march">"3 月"</string> - <string name="month_long_april">"4 月"</string> - <string name="month_long_may">"5 月"</string> - <string name="month_long_june">"6 月"</string> - <string name="month_long_july">"7 月"</string> - <string name="month_long_august">"8 月"</string> - <string name="month_long_september">"9 月"</string> - <string name="month_long_october">"10 月"</string> - <string name="month_long_november">"11 月"</string> - <string name="month_long_december">"12 月"</string> - <string name="month_medium_january">"1 月"</string> - <string name="month_medium_february">"2 月"</string> - <string name="month_medium_march">"3 月"</string> - <string name="month_medium_april">"4 月"</string> - <string name="month_medium_may">"5 月"</string> - <string name="month_medium_june">"6 月"</string> - <string name="month_medium_july">"7 月"</string> - <string name="month_medium_august">"8 月"</string> - <string name="month_medium_september">"9 月"</string> - <string name="month_medium_october">"10 月"</string> - <string name="month_medium_november">"11 月"</string> - <string name="month_medium_december">"12 月"</string> - <string name="month_shortest_january">"1"</string> - <string name="month_shortest_february">"2"</string> - <string name="month_shortest_march">"3"</string> - <string name="month_shortest_april">"4"</string> - <string name="month_shortest_may">"5"</string> - <string name="month_shortest_june">"6"</string> - <string name="month_shortest_july">"7"</string> - <string name="month_shortest_august">"8"</string> - <string name="month_shortest_september">"9"</string> - <string name="month_shortest_october">"10"</string> - <string name="month_shortest_november">"11"</string> - <string name="month_shortest_december">"12"</string> <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string> <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string> <string name="selectAll">"全部選取"</string> diff --git a/core/res/res/values/arrays.xml b/core/res/res/values/arrays.xml index 7db73f0..eb94812 100644 --- a/core/res/res/values/arrays.xml +++ b/core/res/res/values/arrays.xml @@ -110,7 +110,10 @@ <item><xliff:g id="id">alarm_clock</xliff:g></item> <item><xliff:g id="id">battery</xliff:g></item> <item><xliff:g id="id">phone_signal</xliff:g></item> + <item><xliff:g id="id">phone_evdo_signal</xliff:g></item> <item><xliff:g id="id">data_connection</xliff:g></item> + <item><xliff:g id="id">cdma_eri</xliff:g></item> + <item><xliff:g id="id">tty</xliff:g></item> <item><xliff:g id="id">volume</xliff:g></item> <item><xliff:g id="id">mute</xliff:g></item> <item><xliff:g id="id">speakerphone</xliff:g></item> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 40a8af2..60c70cf 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -79,6 +79,9 @@ <attr name="textColorPrimaryInverseNoDisable" format="reference|color" /> <!-- Dim inverse text color. This does not differentiate the disabled state. --> <attr name="textColorSecondaryInverseNoDisable" format="reference|color" /> + + <!-- Text color for urls in search suggestions, used by things like global search and the browser. @hide --> + <attr name="textColorSearchUrl" format="reference|color" /> <!-- Text color, typeface, size, and style for "large" text. Defaults to primary text color. --> <attr name="textAppearanceLarge" format="reference" /> @@ -99,6 +102,7 @@ <!-- Text color, typeface, size, and style for system search result subtitle. Defaults to primary inverse text color. @hide --> <attr name="textAppearanceSearchResultSubtitle" format="reference" /> + <!-- Text color, typeface, size, and style for the text inside of a button. --> <attr name="textAppearanceButton" format="reference" /> @@ -152,8 +156,8 @@ <!-- The preferred list item height --> <attr name="listPreferredItemHeight" format="dimension" /> <!-- The drawable for the list divider --> - <!-- The list item height for search results. @hide --> - <attr name="searchResultListItemHeight" format="dimension" /> + <!-- The list item height for search results. @hide --> + <attr name="searchResultListItemHeight" format="dimension" /> <attr name="listDivider" format="reference" /> <!-- TextView style for list separators. --> <attr name="listSeparatorTextViewStyle" format="reference" /> @@ -663,9 +667,9 @@ <attr name="x" format="dimension" /> <!-- A coordinate in the Y dimension. --> <attr name="y" format="dimension" /> - - <!-- Specifies how to place an object, both - its x and y axis, within a larger containing object. --> + + <!-- Specifies how to place the content of an object, both + on the x and y axis, within the object itself. --> <attr name="gravity"> <!-- Push object to the top of its container, not changing its size. --> <flag name="top" value="0x30" /> @@ -721,8 +725,7 @@ <attr name="entries" format="reference" /> <!-- Standard gravity constant that a child can supply to its parent. - Defines how to place an object, both - its x and y axis, within a larger containing object. --> + Defines how to place the view, both its x and y axis, within its parent view group. --> <attr name="layout_gravity"> <!-- Push object to the top of its container, not changing its size. --> <flag name="top" value="0x30" /> diff --git a/core/res/res/values/colors.xml b/core/res/res/values/colors.xml index 8150067..96369f4 100644 --- a/core/res/res/values/colors.xml +++ b/core/res/res/values/colors.xml @@ -73,5 +73,8 @@ <color name="perms_normal_grp_color">#eeeeee</color> <color name="perms_normal_perm_color">#c0c0c0</color> + <!-- For search-related UIs --> + <color name="search_url_text">#7fa87f</color> + </resources> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 83ac8e2..f655b27 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -34,4 +34,8 @@ <!-- The duration (in milliseconds) of a long animation. --> <integer name="config_longAnimTime">300</integer> + + <!-- Flag indicating whether Last Name comes before First Name. + This becomes true in Japan, for example.--> + <bool name="config_lastname_comes_before_firstname">false</bool> </resources> diff --git a/core/res/res/values/donottranslate-cldr.xml b/core/res/res/values/donottranslate-cldr.xml new file mode 100644 index 0000000..f305948 --- /dev/null +++ b/core/res/res/values/donottranslate-cldr.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="month_long_standalone_january">January</string> + <string name="month_long_standalone_february">February</string> + <string name="month_long_standalone_march">March</string> + <string name="month_long_standalone_april">April</string> + <string name="month_long_standalone_may">May</string> + <string name="month_long_standalone_june">June</string> + <string name="month_long_standalone_july">July</string> + <string name="month_long_standalone_august">August</string> + <string name="month_long_standalone_september">September</string> + <string name="month_long_standalone_october">October</string> + <string name="month_long_standalone_november">November</string> + <string name="month_long_standalone_december">December</string> + + <string name="month_long_january">January</string> + <string name="month_long_february">February</string> + <string name="month_long_march">March</string> + <string name="month_long_april">April</string> + <string name="month_long_may">May</string> + <string name="month_long_june">June</string> + <string name="month_long_july">July</string> + <string name="month_long_august">August</string> + <string name="month_long_september">September</string> + <string name="month_long_october">October</string> + <string name="month_long_november">November</string> + <string name="month_long_december">December</string> + + <string name="month_medium_january">Jan</string> + <string name="month_medium_february">Feb</string> + <string name="month_medium_march">Mar</string> + <string name="month_medium_april">Apr</string> + <string name="month_medium_may">May</string> + <string name="month_medium_june">Jun</string> + <string name="month_medium_july">Jul</string> + <string name="month_medium_august">Aug</string> + <string name="month_medium_september">Sep</string> + <string name="month_medium_october">Oct</string> + <string name="month_medium_november">Nov</string> + <string name="month_medium_december">Dec</string> + + <string name="month_shortest_january">J</string> + <string name="month_shortest_february">F</string> + <string name="month_shortest_march">M</string> + <string name="month_shortest_april">A</string> + <string name="month_shortest_may">M</string> + <string name="month_shortest_june">J</string> + <string name="month_shortest_july">J</string> + <string name="month_shortest_august">A</string> + <string name="month_shortest_september">S</string> + <string name="month_shortest_october">O</string> + <string name="month_shortest_november">N</string> + <string name="month_shortest_december">D</string> + + <string name="day_of_week_long_sunday">Sunday</string> + <string name="day_of_week_long_monday">Monday</string> + <string name="day_of_week_long_tuesday">Tuesday</string> + <string name="day_of_week_long_wednesday">Wednesday</string> + <string name="day_of_week_long_thursday">Thursday</string> + <string name="day_of_week_long_friday">Friday</string> + <string name="day_of_week_long_saturday">Saturday</string> + + <string name="day_of_week_medium_sunday">Sun</string> + <string name="day_of_week_medium_monday">Mon</string> + <string name="day_of_week_medium_tuesday">Tue</string> + <string name="day_of_week_medium_wednesday">Wed</string> + <string name="day_of_week_medium_thursday">Thu</string> + <string name="day_of_week_medium_friday">Fri</string> + <string name="day_of_week_medium_saturday">Sat</string> + + <string name="day_of_week_short_sunday">Su</string> + <string name="day_of_week_short_monday">Mo</string> + <string name="day_of_week_short_tuesday">Tu</string> + <string name="day_of_week_short_wednesday">We</string> + <string name="day_of_week_short_thursday">Th</string> + <string name="day_of_week_short_friday">Fr</string> + <string name="day_of_week_short_saturday">Sa</string> + + <string name="day_of_week_shortest_sunday">S</string> + <string name="day_of_week_shortest_monday">M</string> + <string name="day_of_week_shortest_tuesday">T</string> + <string name="day_of_week_shortest_wednesday">W</string> + <string name="day_of_week_shortest_thursday">T</string> + <string name="day_of_week_shortest_friday">F</string> + <string name="day_of_week_shortest_saturday">S</string> + + <string name="am">a.m.</string> + <string name="pm">p.m.</string> + <string name="yesterday">Yesterday</string> + <string name="today">Today</string> + <string name="tomorrow">Tomorrow</string> + + <string name="hour_minute_ampm">%-l:%M %p</string> + <string name="hour_minute_cap_ampm">%-l:%M %^p</string> + <string name="numeric_date">%-m/%-e/%Y</string> + <string name="numeric_date_format">M/d/yyyy</string> + <string name="month_day_year">%B %-e, %Y</string> + <string name="time_of_day">%-l:%M:%S %p</string> + <string name="date_and_time">%-l:%M:%S %p %b %-e, %Y</string> + <string name="abbrev_month_day_year">%b %-e, %Y</string> + <string name="month_day">%B %-e</string> + <string name="month">%-B</string> + <string name="month_year">%B %Y</string> + <string name="abbrev_month_day">%b %-e</string> + <string name="abbrev_month">%-b</string> + <string name="abbrev_month_year">%b %Y</string> +</resources> diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index ae45d64..199eac1 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -1091,30 +1091,56 @@ =============================================================== --> <eat-comment /> - <public type="attr" name="tension" id="0x0101026a" /> - <public type="attr" name="extraTension" id="0x0101026b" /> - <public type="attr" name="density" id="0x0101026c" /> - <public type="attr" name="searchSuggestThreshold" id="0x0101026d" /> - <public type="attr" name="includeInGlobalSearch" id="0x0101026e" /> - <public type="attr" name="onClick" id="0x0101026f" /> - <public type="attr" name="targetSdkVersion" id="0x01010270" /> - <public type="attr" name="maxSdkVersion" id="0x01010271" /> - <public type="attr" name="testOnly" id="0x01010272" /> - <public type="attr" name="contentDescription" id="0x01010273" /> + <public type="attr" name="tension" id="0x0101026a" /> + <public type="attr" name="extraTension" /> + <public type="attr" name="density" /> + <public type="attr" name="searchSuggestThreshold" /> + <public type="attr" name="includeInGlobalSearch" /> + <public type="attr" name="onClick" /> + <public type="attr" name="targetSdkVersion" /> + <public type="attr" name="maxSdkVersion" /> + <public type="attr" name="testOnly" /> + <public type="attr" name="contentDescription" /> + + <public-padding type="attr" name="donut_resource_pad" end="0x0101029f" /> - <public type="anim" name="anticipate_interpolator" id="0x010a0007" /> - <public type="anim" name="overshoot_interpolator" id="0x010a0008" /> - <public type="anim" name="anticipate_overshoot_interpolator" id="0x010a0009" /> - <public type="anim" name="bounce_interpolator" id="0x010a000a" /> + <public-padding type="id" name="donut_resource_pad" end="0x01020040" /> + + <public-padding type="style" name="donut_resource_pad" end="0x01030070" /> + + <public-padding type="string" name="donut_resource_pad" end="0x01040030" /> - <public type="drawable" name="stat_sys_vp_phone_call" id="0x0108022d" /> - <public type="drawable" name="stat_sys_vp_phone_call_on_hold" id="0x0108022e" /> + <public-padding type="dimen" name="donut_resource_pad" end="0x01050010" /> + <public-padding type="color" name="donut_resource_pad" end="0x01060030" /> + + <public-padding type="array" name="donut_resource_pad" end="0x01070010" /> + + <public-padding type="anim" name="donut_resource_pad" end="0x010a0020" /> + + <public-padding type="integer" name="donut_resource_pad" end="0x010e0010" /> + + <public type="anim" name="anticipate_interpolator" /> + <public type="anim" name="overshoot_interpolator" /> + <public type="anim" name="anticipate_overshoot_interpolator" /> + <public type="anim" name="bounce_interpolator" /> + <public type="anim" name="linear_interpolator" /> + + <public-padding type="drawable" name="donut_resource_pad" end="0x010800d0" /> + + <public-padding type="layout" name="donut_resource_pad" end="0x01090020" /> + + <!-- =============================================================== - Resources added in version 5 of the platform. + Resources added in Eclair. =============================================================== --> <eat-comment /> - <public type="attr" name="accountType" id="0x01010274" /> - <public type="attr" name="contentAuthority" id="0x01010275" /> + <public type="attr" name="accountType" /> + <public type="attr" name="contentAuthority" /> + + <public type="drawable" name="stat_sys_vp_phone_call" /> + <public type="drawable" name="stat_sys_vp_phone_call_on_hold" /> + + </resources> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index a8145de..5bd8308 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -480,6 +480,12 @@ state. Does not perform a complete shutdown.</string> <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. --> + <string name="permlab_stopAppSwitches">prevent app switches</string> + <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> + <string name="permdesc_stopAppSwitches">Prevents the user from switching to + another application.</string> + + <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. --> <string name="permlab_runSetActivityWatcher">monitor and control all application launching</string> <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> <string name="permdesc_runSetActivityWatcher">Allows an application to @@ -770,13 +776,7 @@ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> <string name="permdesc_installLocationProvider">Create mock location sources for testing. Malicious applications can use this to override the location and/or status returned by real - location sources such as GPS or Network providers.</string> - - <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. --> - <string name="permlab_installLocationCollector">permission to install a location collector</string> - <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> - <string name="permdesc_installLocationCollector">Create mock location sources for testing. - Malicious applications can use this to monitor and report your location to an external source.</string> + location sources such as GPS or Network providers or monitor and report your location to an external source.</string> <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. --> <string name="permlab_accessFineLocation">fine (GPS) location</string> @@ -1076,7 +1076,7 @@ user dictionary.</string> <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. --> - <string name="permlab_sdcardWrite">write to SD card</string> + <string name="permlab_sdcardWrite">modify/delete SD card contents</string> <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> <string name="permdesc_sdcardWrite">Allows an application to write to the SD card.</string> @@ -1251,15 +1251,6 @@ <!-- Displayed to the user when unlocking the phone with a username and password fails. --> <string name="lockscreen_glogin_invalid_input">Invalid username or password.</string> - <!-- A format string for 12-hour time of day (example: "12:30 PM"). --> - <string name="status_bar_time_format">"<xliff:g id="hour" example="12">h</xliff:g>:<xliff:g id="minute" example="30">mm</xliff:g> <xliff:g id="ampm" example="AM">AA</xliff:g>"</string> - - <!-- A format string for 12-hour time of day, with lower-case "am" or "pm" (example: "12:30pm"). --> - <string name="hour_minute_ampm">"<xliff:g id="hour" example="12">%-l</xliff:g>:<xliff:g id="minute" example="30">%M</xliff:g><xliff:g id="ampm" example="am">%P</xliff:g>"</string> - - <!-- A format string for 12-hour time of day, with capital "AM" or "PM" (example: "12:30PM"). --> - <string name="hour_minute_cap_ampm">"<xliff:g id="hour" example="12">%-l</xliff:g>:<xliff:g id="minute" example="30">%M</xliff:g><xliff:g id="ampm" example="AM">%p</xliff:g>"</string> - <!-- A format string for 12-hour time of day, just the hour, not the minute, with lower-case "am" or "pm" (example: "3pm"). --> <string name="hour_ampm">"<xliff:g id="hour" example="3">%-l</xliff:g><xliff:g id="ampm" example="pm">%P</xliff:g>"</string> @@ -1360,12 +1351,6 @@ It is also used by the home screen's search "widget". It should be short --> <string name="search_go">Search</string> - <!-- String used to display the date. This is shown instead of a date if the date is today's date. --> - <string name="today">Today</string> - <!-- String used to display the date. This is shown instead of a date if the date is yesterday's date. --> - <string name="yesterday">Yesterday</string> - <!-- String used to display the date. This is shown instead of a date if the date is tomorrow's date. --> - <string name="tomorrow">Tomorrow</string> <!-- String used to display the date. This is the string to say something happened 1 month ago. --> <string name="oneMonthDurationPast">1 month ago</string> <!-- String used to display the date. This is the string to say something happened more than 1 month ago. --> @@ -1499,21 +1484,6 @@ <!-- Appened to express the value is this unit of time. --> <string name="years">years</string> - <!-- Used in the list of which days of the week a calendar event recurrs on --> - <string name="sunday">Sunday</string> - <!-- Used in the list of which days of the week a calendar event recurrs on --> - <string name="monday">Monday</string> - <!-- Used in the list of which days of the week a calendar event recurrs on --> - <string name="tuesday">Tuesday</string> - <!-- Used in the list of which days of the week a calendar event recurrs on --> - <string name="wednesday">Wednesday</string> - <!-- Used in the list of which days of the week a calendar event recurrs on --> - <string name="thursday">Thursday</string> - <!-- Used in the list of which days of the week a calendar event recurrs on --> - <string name="friday">Friday</string> - <!-- Used in the list of which days of the week a calendar event recurrs on --> - <string name="saturday">Saturday</string> - <!-- Calendar spinner item, to select that an event recurs every weekday. --> <string name="every_weekday">"Every weekday (Mon\u2013Fri)"</string> <!-- Calendar spinner item, to select that an event recurs every day. --> @@ -1536,17 +1506,7 @@ <string name="VideoView_error_button">OK</string> - <!-- AM - as in morning - as in 10:30 AM --> - <string name="am">"AM"</string> - - <!-- PM - as in afternoon - as in 10:30 PM --> - <string name="pm">"PM"</string> - - - <!-- Numeric form of the day. Example: "12/31/2007" --> - <string name="numeric_date">"<xliff:g id="month" example="12">%m</xliff:g>/<xliff:g id="day" example="31">%d</xliff:g>/<xliff:g id="year" example="2008">%Y</xliff:g>"</string> - - <!-- Format indicating a range of time, from a time on one day to a time on another day. + <!-- Format indicating a range of time, from a time on one day to a time on another day. Example: "Mon, Dec 31, 2007, 8am - Tue, Jan 1, 2008, 5pm" --> <string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="weekday1" example="Monday">%1$s</xliff:g>, <xliff:g id="date1" example="December 31, 2007">%2$s</xliff:g>, <xliff:g id="time1" example="8am">%3$s</xliff:g> \u2013 <xliff:g id="weekday2" example="Tuesday">%4$s</xliff:g>, <xliff:g id="date2" example="January 1, 2008">%5$s</xliff:g>, <xliff:g id="time2" example="5pm">%6$s</xliff:g>"</string> @@ -1590,42 +1550,6 @@ Example: "8:00 - 11:00 am, Mon" --> <string name="time_wday">"<xliff:g id="time_range" example="8:00 - 11:00 am">%1$s</xliff:g>, <xliff:g id="weekday" example="Mon">%2$s</xliff:g>"</string> - <!-- Date format string used in contexts where the user has said they - want the month first, as used in the USA, with the month fully - spelled out. You can remove the comma or add a period, - or make other punctuation changes appropriate for your locale. --> - <string name="full_date_month_first" format="date"><xliff:g id="month" example="December">MMMM</xliff:g> <xliff:g id="day" example="31">d</xliff:g>, <xliff:g id="year" example="1972">yyyy</xliff:g></string> - - <!-- Date format string used in contexts where the user has said they - want the day of the month first, as used in Europe, with the month - fully spelled out. You can remove the comma or add a period, - or make other punctuation changes appropriate for your locale. --> - <string name="full_date_day_first" format="date"><xliff:g id="day" example="31">d</xliff:g> <xliff:g id="month" example="December">MMMM</xliff:g>, <xliff:g id="year" example="1972">yyyy</xliff:g></string> - - <!-- Date format string used in contexts where the user has said they - want the month first, as used in the USA, with the month - abbreviated. You can remove the comma or add a period, - or make other punctuation changes appropriate for your locale. --> - <string name="medium_date_month_first" format="date"><xliff:g id="month" example="Dec.">MMM</xliff:g> <xliff:g id="day" example="31">d</xliff:g>, <xliff:g id="year" example="1972">yyyy</xliff:g></string> - - <!-- Date format string used in contexts where the user has said they - want the day of the month first, as used in Europe, with the month - abbreviated. You can remove the comma or add a period, - or make other punctuation changes appropriate for your locale. --> - <string name="medium_date_day_first" format="date"><xliff:g id="day" example="31">d</xliff:g> <xliff:g id="month" example="December">MMM</xliff:g>, <xliff:g id="year" example="1972">yyyy</xliff:g></string> - - <!-- Time format string used in the status bar when the user has said they - want a 12-hour clock with AM and PM. - You can remove the colon - or make other punctuation changes appropriate for your locale. --> - <string name="twelve_hour_time_format" format="date"><xliff:g id="hour" example="11">h</xliff:g>:<xliff:g id="minute" example="59">mm</xliff:g> <xliff:g id="ampm" example="AM">a</xliff:g></string> - - <!-- Time format string used in the status bar when the user has said they - want a 24-hour clock. - You can remove the colon - or make other punctuation changes appropriate for your locale. --> - <string name="twenty_four_hour_time_format" format="date"><xliff:g id="hour" example="23">HH</xliff:g>:<xliff:g id="minute" example="59">mm</xliff:g></string> - <!-- Quoted name for 12pm, lowercase --> <string name="noon">"noon"</string> <!-- Quoted name for 12pm, uppercase first letter --> @@ -1635,29 +1559,6 @@ <!-- Quoted name for 12am, uppercase first letter --> <string name="Midnight">"Midnight"</string> - <!-- Date format for month and day of month. - Example: "October 9". --> - <string name="month_day">"<xliff:g id="month" example="October">%B</xliff:g> <xliff:g id="day" example="9">%-d</xliff:g>"</string> - - <!-- Date format for month alone. - Example: "October" --> - <string name="month">"<xliff:g id="month" example="October">%B</xliff:g>"</string> - - <!-- Date format for month, day, and year. - Example: "October 9, 2007" --> - <string name="month_day_year">"<xliff:g id="month" example="October">%B</xliff:g> <xliff:g id="day" example="9">%-d</xliff:g>, <xliff:g id="year" example="2007">%Y</xliff:g>"</string> - - <!-- Date format for month and year. - Example: "October 2007" --> - <string name="month_year">"<xliff:g id="month" example="October">%B</xliff:g> <xliff:g id="year" example="2007">%Y</xliff:g>"</string> - - <!-- A format string for 24-hour time of day (example "23:59"). --> - <string name="time_of_day">"<xliff:g id="hour" example="23">%H</xliff:g>:<xliff:g id="minute" example="59">%M</xliff:g>:<xliff:g id="second" example="59">%S</xliff:g>"</string> - - <!-- Format string for date and 24-hour time of day. - Example: 23:59:15 Jan 31 2008 --> - <string name="date_and_time">"<xliff:g id="hour" example="23">%H</xliff:g>:<xliff:g id="minute" example="59">%M</xliff:g>:<xliff:g id="second" example="59">%S</xliff:g> <xliff:g id="month" example="Jan">%B</xliff:g> <xliff:g id="day" example="31">%-d</xliff:g>, <xliff:g id="year" example="2008">%Y</xliff:g>"</string> - <!-- Format indicating a range of dates in the same year. Example: "Oct 31 - Nov 3" --> <string name="same_year_md1_md2">"<xliff:g id="month1" example="Oct">%2$s</xliff:g> <xliff:g id="day1" example="31">%3$s</xliff:g> \u2013 <xliff:g id="month2" example="Nov">%7$s</xliff:g> <xliff:g id="day2" example="3">%8$s</xliff:g>"</string> @@ -1756,312 +1657,7 @@ Example: "Tue, Oct 9, 2007, 8:00am - Wed, Oct 10, 2007, 5:00pm" --> <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="weekday1" example="Wed">%1$s</xliff:g>, <xliff:g id="month1" example="Oct">%2$s</xliff:g> <xliff:g id="day1" example="31">%3$s</xliff:g>, <xliff:g id="year1" example="2007">%4$s</xliff:g>, <xliff:g id="time1" example="8:00am">%5$s</xliff:g> \u2013 <xliff:g id="weekday2" example="Sat">%6$s</xliff:g>, <xliff:g id="month2" example="Nov">%7$s</xliff:g> <xliff:g id="day2" example="3">%8$s</xliff:g>, <xliff:g id="year2" example="2007">%9$s</xliff:g>, <xliff:g id="time2" example="5:00pm">%10$s</xliff:g>"</string> - <!-- Format string for abbreviated month, day, and year. - Example: "Oct 9, 2007" --> - <string name="abbrev_month_day_year">"<xliff:g id="month" example="Oct">%b</xliff:g> <xliff:g id="day" example="9">%-d</xliff:g>, <xliff:g id="year" example="2007">%Y</xliff:g>"</string> - - <!-- Format string for abbreviated month and year. - Example: "Oct 2007" --> - <string name="abbrev_month_year">"<xliff:g id="month" example="Oct">%b</xliff:g> <xliff:g id="year" example="2007">%Y</xliff:g>"</string> - - <!-- Format string for abbreviated month and day. - Example: "Oct 9" --> - <string name="abbrev_month_day">"<xliff:g id="month" example="Oct">%b</xliff:g> <xliff:g id="day" example="31">%-d</xliff:g>"</string> - - <!-- Format string for abbreviated month alone. - Example: "Oct" --> - <string name="abbrev_month">"<xliff:g id="month" example="Oct">%b</xliff:g>"</string> - - <!-- The full spelled out version of the day of the week. --> - <string name="day_of_week_long_sunday">Sunday</string> - - <!-- The full spelled out version of the day of the week. --> - <string name="day_of_week_long_monday">Monday</string> - - <!-- The full spelled out version of the day of the week. --> - <string name="day_of_week_long_tuesday">Tuesday</string> - - <!-- The full spelled out version of the day of the week. --> - <string name="day_of_week_long_wednesday">Wednesday</string> - - <!-- The full spelled out version of the day of the week. --> - <string name="day_of_week_long_thursday">Thursday</string> - - <!-- The full spelled out version of the day of the week. --> - <string name="day_of_week_long_friday">Friday</string> - - <!-- The full spelled out version of the day of the week. --> - <string name="day_of_week_long_saturday">Saturday</string> - - - <!-- An abbreviated day of the week. Three characters typically in western languages. - In US English: "Sun" stands for Sunday --> - <string name="day_of_week_medium_sunday">Sun</string> - - <!-- An abbreviated day of the week. Three characters typically in western languages. - In US English: "Mon" stands for Monday --> - <string name="day_of_week_medium_monday">Mon</string> - - <!-- An abbreviated day of the week. Three characters typically in western languages. - In US English: "Tue" stands for Tuesday --> - <string name="day_of_week_medium_tuesday">Tue</string> - - <!-- An abbreviated day of the week. Three characters typically in western languages. - In US English: "Wed" stands for Wednesday --> - <string name="day_of_week_medium_wednesday">Wed</string> - - <!-- An abbreviated day of the week. Three characters typically in western languages. - In US English: "Thu" stands for Thursday --> - <string name="day_of_week_medium_thursday">Thu</string> - - <!-- An abbreviated day of the week. Three characters typically in western languages. - In US English: "Fri" stands for Friday --> - <string name="day_of_week_medium_friday">Fri</string> - - <!-- An abbreviated day of the week. Three characters typically in western languages. - In US English: "Sat" stands for Saturday --> - <string name="day_of_week_medium_saturday">Sat</string> - - - <!-- An abbreviated day of the week. Two characters typically in western languages. - In US English: "Su" stands for Sunday --> - <string name="day_of_week_short_sunday">Su</string> - - <!-- An abbreviated day of the week. Two characters typically in western languages. - In US English: "Mo" stands for Monday --> - <string name="day_of_week_short_monday">Mo</string> - - <!-- An abbreviated day of the week. Two characters typically in western languages. - In US English: "Tu" stands for Tuesday --> - <string name="day_of_week_short_tuesday">Tu</string> - - <!-- An abbreviated day of the week. Two characters typically in western languages. - In US English: "We" stands for Wednesday --> - <string name="day_of_week_short_wednesday">We</string> - - <!-- An abbreviated day of the week. Two characters typically in western languages. - In US English: "Th" stands for Thursday --> - <string name="day_of_week_short_thursday">Th</string> - - <!-- An abbreviated day of the week. Two characters typically in western languages. - In US English: "Fr" stands for Friday --> - <string name="day_of_week_short_friday">Fr</string> - - <!-- An abbreviated day of the week. Two characters typically in western languages. - In US English: "Sa" stands for Saturday --> - <string name="day_of_week_short_saturday">Sa</string> - - - <!-- An abbreviated day of the week. One character if that is unique. Two if necessary. - In US English: "Su" stands for Sunday --> - <string name="day_of_week_shorter_sunday">Su</string> - - <!-- An abbreviated day of the week. One character if that is unique. Two if necessary. - In US English: "M" stands for Monday --> - <string name="day_of_week_shorter_monday">M</string> - - <!-- An abbreviated day of the week. One character if that is unique. Two if necessary. - In US English: "Tu" stands for Tuesday --> - <string name="day_of_week_shorter_tuesday">Tu</string> - - <!-- An abbreviated day of the week. One character if that is unique. Two if necessary. - In US English: "W" stands for Wednesday --> - <string name="day_of_week_shorter_wednesday">W</string> - - <!-- An abbreviated day of the week. One character if that is unique. Two if necessary. - In US English: "Th" stands for Thursday --> - <string name="day_of_week_shorter_thursday">Th</string> - - <!-- An abbreviated day of the week. One character if that is unique. Two if necessary. - In US English: "F" stands for Friday --> - <string name="day_of_week_shorter_friday">F</string> - - <!-- An abbreviated day of the week. One character if that is unique. Two if necessary. - In US English: "Sa" stands for Saturday --> - <string name="day_of_week_shorter_saturday">Sa</string> - - - <!-- An abbreviated day of the week. One character long if it makes sense. Does not have - to be unique. - In US English: "S" stands for Sunday --> - <string name="day_of_week_shortest_sunday">S</string> - - <!-- An abbreviated day of the week. One character long if it makes sense. Does not have - to be unique. - In US English: "M" stands for Monday --> - <string name="day_of_week_shortest_monday">M</string> - - <!-- An abbreviated day of the week. One character long if it makes sense. Does not have - to be unique. - In US English: "T" stands for Tuesday --> - <string name="day_of_week_shortest_tuesday">T</string> - - <!-- An abbreviated day of the week. One character long if it makes sense. Does not have - to be unique. - In US English: "W" stands for Wednesday --> - <string name="day_of_week_shortest_wednesday">W</string> - - <!-- An abbreviated day of the week. One character long if it makes sense. Does not have - to be unique. - In US English: "T" stands for Thursday --> - <string name="day_of_week_shortest_thursday">T</string> - - <!-- An abbreviated day of the week. One character long if it makes sense. Does not have - to be unique. - In US English: "F" stands for Friday --> - <string name="day_of_week_shortest_friday">F</string> - - <!-- An abbreviated day of the week. One character long if it makes sense. Does not have - to be unique. - In US English: "S" stands for Saturday --> - <string name="day_of_week_shortest_saturday">S</string> - - - <!-- The full spelled out version of the month. --> - <string name="month_long_january">January</string> - - <!-- The full spelled out version of the month. --> - <string name="month_long_february">February</string> - - <!-- The full spelled out version of the month. --> - <string name="month_long_march">March</string> - - <!-- The full spelled out version of the month. --> - <string name="month_long_april">April</string> - - <!-- The full spelled out version of the month. --> - <string name="month_long_may">May</string> - - <!-- The full spelled out version of the month. --> - <string name="month_long_june">June</string> - - <!-- The full spelled out version of the month. --> - <string name="month_long_july">July</string> - - <!-- The full spelled out version of the month. --> - <string name="month_long_august">August</string> - - <!-- The full spelled out version of the month. --> - <string name="month_long_september">September</string> - - <!-- The full spelled out version of the month. --> - <string name="month_long_october">October</string> - - <!-- The full spelled out version of the month. --> - <string name="month_long_november">November</string> - - <!-- The full spelled out version of the month. --> - <string name="month_long_december">December</string> - - - <!-- An abbreviated month name. - In US English: "Jan" stands for January. --> - <string name="month_medium_january">Jan</string> - - <!-- An abbreviated month name. - In US English: "Feb" stands for February. --> - <string name="month_medium_february">Feb</string> - - <!-- An abbreviated month name. - In US English: "Mar" stands for March. --> - <string name="month_medium_march">Mar</string> - - <!-- An abbreviated month name. - In US English: "Apr" stands for April. --> - <string name="month_medium_april">Apr</string> - - <!-- An abbreviated month name. - In US English: "May" stands for May. --> - <string name="month_medium_may">May</string> - - <!-- An abbreviated month name. - In US English: "Jun" stands for June. --> - <string name="month_medium_june">Jun</string> - - <!-- An abbreviated month name. - In US English: "Jul" stands for July. --> - <string name="month_medium_july">Jul</string> - - <!-- An abbreviated month name. - In US English: "Aug" stands for August. --> - <string name="month_medium_august">Aug</string> - - <!-- An abbreviated month name. - In US English: "Sep" stands for September. --> - <string name="month_medium_september">Sep</string> - - <!-- An abbreviated month name. - In US English: "Oct" stands for October. --> - <string name="month_medium_october">Oct</string> - - <!-- An abbreviated month name. - In US English: "Nov" stands for November. --> - <string name="month_medium_november">Nov</string> - - <!-- An abbreviated month name. - In US English: "Dec" stands for December. --> - <string name="month_medium_december">Dec</string> - - - <!-- An abbreviated month name. One character long if it makes sense. Does not have - to be unique. - In US English: "J" stands for January --> - <string name="month_shortest_january">J</string> - - <!-- An abbreviated month name. One character long if it makes sense. Does not have - to be unique. - In US English: "F" stands for February. --> - <string name="month_shortest_february">F</string> - - <!-- An abbreviated month name. One character long if it makes sense. Does not have - to be unique. - In US English: "M" stands for March. --> - <string name="month_shortest_march">M</string> - - <!-- An abbreviated month name. One character long if it makes sense. Does not have - to be unique. - In US English: "A" stands for April. --> - <string name="month_shortest_april">A</string> - - <!-- An abbreviated month name. One character long if it makes sense. Does not have - to be unique. - In US English: "M" stands for May. --> - <string name="month_shortest_may">M</string> - - <!-- An abbreviated month name. One character long if it makes sense. Does not have - to be unique. - In US English: "J" stands for June. --> - <string name="month_shortest_june">J</string> - - <!-- An abbreviated month name. One character long if it makes sense. Does not have - to be unique. - In US English: "J" stands for July. --> - <string name="month_shortest_july">J</string> - - <!-- An abbreviated month name. One character long if it makes sense. Does not have - to be unique. - In US English: "A" stands for August. --> - <string name="month_shortest_august">A</string> - - <!-- An abbreviated month name. One character long if it makes sense. Does not have - to be unique. - In US English: "S" stands for September. --> - <string name="month_shortest_september">S</string> - - <!-- An abbreviated month name. One character long if it makes sense. Does not have - to be unique. - In US English: "O" stands for October. --> - <string name="month_shortest_october">O</string> - <!-- An abbreviated month name. One character long if it makes sense. Does not have - to be unique. - In US English: "N" stands for November. --> - <string name="month_shortest_november">N</string> - - <!-- An abbreviated month name. One character long if it makes sense. Does not have - to be unique. - In US English: "D" stands for December. --> - <string name="month_shortest_december">D</string> <!-- Format string for durations like "01:23" (1 minute, 23 seconds) --> <string name="elapsed_time_short_format_mm_ss"><xliff:g id="minutes" example="1">%1$02d</xliff:g>:<xliff:g id="seconds" example="23">%2$02d</xliff:g></string> @@ -2159,6 +1755,8 @@ <string name="anr_process">Process <xliff:g id="process">%1$s</xliff:g> is not responding.</string> <!-- Button allowing the user to close an application that is not responding. This will kill the application. --> <string name="force_close">Force close</string> + <!-- Button allowing the user to send a bug report for application which has encountered an error. --> + <string name="report">Report</string> <!-- Button allowing the user to choose to wait for an application that is not responding to become responsive again. --> <string name="wait">Wait</string> <!-- Button allowing a developer to connect a debugger to an application that is not responding. --> diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml index 9567523..b168fb8 100644 --- a/core/res/res/values/themes.xml +++ b/core/res/res/values/themes.xml @@ -50,6 +50,7 @@ <item name="textColorSecondaryInverseNoDisable">@android:color/secondary_text_light_nodisable</item> <item name="textColorHint">@android:color/hint_foreground_dark</item> <item name="textColorHintInverse">@android:color/hint_foreground_light</item> + <item name="textColorSearchUrl">@android:color/search_url_text</item> <item name="textAppearanceLarge">@android:style/TextAppearance.Large</item> <item name="textAppearanceMedium">@android:style/TextAppearance.Medium</item> diff --git a/core/res/res/xml/eri.xml b/core/res/res/xml/eri.xml new file mode 100644 index 0000000..cd66f14 --- /dev/null +++ b/core/res/res/xml/eri.xml @@ -0,0 +1,118 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** 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. +*/ +--> + +<!-- Note that IconMode can be only 0, ON or 1, FLASHING + The icon is turned OFF if then IconIndex = 1 --> + +<EriFile VersionNumber="1357" + NumberOfEriEntries="12" + EriFileType="1"> + + <CallPromptId Id="0" + CallPromptText="CallPromptId0"/> + + <CallPromptId Id="1" + CallPromptText="CallPromptId1"/> + + <CallPromptId Id="2" + CallPromptText="CallPromptId2"/> + + <EriInfo RoamingIndicator="64" + IconIndex="1" + IconMode="0" + EriText="T-CDMA 64" + CallPromptId="0" + AlertId="0"/> + + <EriInfo RoamingIndicator="65" + IconIndex="65" + IconMode="0" + EriText="T-CDMA 65" + CallPromptId="0" + AlertId="0"/> + + <EriInfo RoamingIndicator="66" + IconIndex="1" + IconMode="0" + EriText="T-CDMA Ext 66" + CallPromptId="0" + AlertId="0"/> + + <EriInfo RoamingIndicator="67" + IconIndex="67" + IconMode="0" + EriText="T-CDMA Ext 67" + CallPromptId="0" + AlertId="0"/> + + <EriInfo RoamingIndicator="68" + IconIndex="68" + IconMode="0" + EriText="T-CDMA Roam 68" + CallPromptId="0" + AlertId="0"/> + + <EriInfo RoamingIndicator="69" + IconIndex="69" + IconMode="1" + EriText="T-CDMA Ext 69" + CallPromptId="0" + AlertId="0"/> + + <EriInfo RoamingIndicator="70" + IconIndex="70" + IconMode="1" + EriText="T-CDMA Roam 70" + CallPromptId="0" + AlertId="0"/> + + <EriInfo RoamingIndicator="71" + IconIndex="1" + IconMode="0" + EriText="T-CDMA Ext 71" + CallPromptId="0" + AlertId="0"/> + + <EriInfo RoamingIndicator="72" + IconIndex="72" + IconMode="0" + EriText="T-CDMA Ext 72" + CallPromptId="0" + AlertId="0"/> + + <EriInfo RoamingIndicator="73" + IconIndex="73" + IconMode="0" + EriText="T-CDMA Roam 73" + CallPromptId="0" + AlertId="0"/> + + <EriInfo RoamingIndicator="74" + IconIndex="74" + IconMode="1" + EriText="T-CDMA Ext 74" + CallPromptId="0" + AlertId="0"/> + + <EriInfo RoamingIndicator="75" + IconIndex="75" + IconMode="1" + EriText="T-CDMA Roam 75" + CallPromptId="0" + AlertId="0"/> + +</EriFile> |